adv_pci.c (232882) | adv_pci.c (241492) |
---|---|
1/*- 2 * Device probe and attach routines for the following 3 * Advanced Systems Inc. SCSI controllers: 4 * 5 * Connectivity Products: 6 * ABP902/3902 - Bus-Master PCI (16 CDB) 7 * ABP3905 - Bus-Master PCI (16 CDB) 8 * ABP915 - Bus-Master PCI (16 CDB) --- 45 unchanged lines hidden (view full) --- 54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 58 * SUCH DAMAGE. 59 */ 60 61#include <sys/cdefs.h> | 1/*- 2 * Device probe and attach routines for the following 3 * Advanced Systems Inc. SCSI controllers: 4 * 5 * Connectivity Products: 6 * ABP902/3902 - Bus-Master PCI (16 CDB) 7 * ABP3905 - Bus-Master PCI (16 CDB) 8 * ABP915 - Bus-Master PCI (16 CDB) --- 45 unchanged lines hidden (view full) --- 54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 58 * SUCH DAMAGE. 59 */ 60 61#include <sys/cdefs.h> |
62__FBSDID("$FreeBSD: head/sys/dev/advansys/adv_pci.c 232882 2012-03-12 19:29:32Z jmallett $"); | 62__FBSDID("$FreeBSD: head/sys/dev/advansys/adv_pci.c 241492 2012-10-12 21:31:44Z jhb $"); |
63 64#include <sys/param.h> 65#include <sys/systm.h> 66#include <sys/kernel.h> 67#include <sys/lock.h> 68#include <sys/module.h> 69#include <sys/mutex.h> 70 --- 62 unchanged lines hidden (view full) --- 133 return ENXIO; 134} 135 136static int 137adv_pci_attach(device_t dev) 138{ 139 struct adv_softc *adv; 140 u_int32_t id; | 63 64#include <sys/param.h> 65#include <sys/systm.h> 66#include <sys/kernel.h> 67#include <sys/lock.h> 68#include <sys/module.h> 69#include <sys/mutex.h> 70 --- 62 unchanged lines hidden (view full) --- 133 return ENXIO; 134} 135 136static int 137adv_pci_attach(device_t dev) 138{ 139 struct adv_softc *adv; 140 u_int32_t id; |
141 u_int32_t command; | |
142 int error, rid, irqrid; 143 void *ih; 144 struct resource *iores, *irqres; 145 146 /* 147 * Determine the chip version. 148 */ | 141 int error, rid, irqrid; 142 void *ih; 143 struct resource *iores, *irqres; 144 145 /* 146 * Determine the chip version. 147 */ |
149 id = pci_read_config(dev, PCIR_DEVVENDOR, /*bytes*/4); 150 command = pci_read_config(dev, PCIR_COMMAND, /*bytes*/1); | 148 id = pci_get_devid(dev); 149 pci_enable_busmaster(dev); |
151 152 /* | 150 151 /* |
153 * These cards do not allow memory mapped accesses, so we must 154 * ensure that I/O accesses are available or we won't be able 155 * to talk to them. 156 */ 157 if ((command & (PCIM_CMD_PORTEN|PCIM_CMD_BUSMASTEREN)) 158 != (PCIM_CMD_PORTEN|PCIM_CMD_BUSMASTEREN)) { 159 command |= PCIM_CMD_PORTEN|PCIM_CMD_BUSMASTEREN; 160 pci_write_config(dev, PCIR_COMMAND, command, /*bytes*/1); 161 } 162 163 /* | |
164 * Early chips can't handle non-zero latency timer settings. 165 */ 166 if (id == PCI_DEVICE_ID_ADVANSYS_1200A 167 || id == PCI_DEVICE_ID_ADVANSYS_1200B) { 168 pci_write_config(dev, PCIR_LATTIMER, /*value*/0, /*bytes*/1); 169 } 170 171 rid = PCI_BASEADR0; 172 iores = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, 173 RF_ACTIVE); 174 if (iores == NULL) 175 return ENXIO; 176 | 152 * Early chips can't handle non-zero latency timer settings. 153 */ 154 if (id == PCI_DEVICE_ID_ADVANSYS_1200A 155 || id == PCI_DEVICE_ID_ADVANSYS_1200B) { 156 pci_write_config(dev, PCIR_LATTIMER, /*value*/0, /*bytes*/1); 157 } 158 159 rid = PCI_BASEADR0; 160 iores = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, 161 RF_ACTIVE); 162 if (iores == NULL) 163 return ENXIO; 164 |
177 if (adv_find_signature(rman_get_bustag(iores), 178 rman_get_bushandle(iores)) == 0) { | 165 if (adv_find_signature(iores) == 0) { |
179 bus_release_resource(dev, SYS_RES_IOPORT, rid, iores); 180 return ENXIO; 181 } 182 | 166 bus_release_resource(dev, SYS_RES_IOPORT, rid, iores); 167 return ENXIO; 168 } 169 |
183 adv = adv_alloc(dev, rman_get_bustag(iores), rman_get_bushandle(iores)); | 170 adv = adv_alloc(dev, iores, 0); |
184 if (adv == NULL) { 185 bus_release_resource(dev, SYS_RES_IOPORT, rid, iores); 186 return ENXIO; 187 } 188 189 /* Allocate a dmatag for our transfer DMA maps */ 190 error = bus_dma_tag_create( 191 /* parent */ bus_get_dma_tag(dev), 192 /* alignment */ 1, 193 /* boundary */ 0, 194 /* lowaddr */ ADV_PCI_MAX_DMA_ADDR, 195 /* highaddr */ BUS_SPACE_MAXADDR, 196 /* filter */ NULL, 197 /* filterarg */ NULL, 198 /* maxsize */ BUS_SPACE_MAXSIZE_32BIT, 199 /* nsegments */ ~0, 200 /* maxsegsz */ ADV_PCI_MAX_DMA_COUNT, 201 /* flags */ 0, | 171 if (adv == NULL) { 172 bus_release_resource(dev, SYS_RES_IOPORT, rid, iores); 173 return ENXIO; 174 } 175 176 /* Allocate a dmatag for our transfer DMA maps */ 177 error = bus_dma_tag_create( 178 /* parent */ bus_get_dma_tag(dev), 179 /* alignment */ 1, 180 /* boundary */ 0, 181 /* lowaddr */ ADV_PCI_MAX_DMA_ADDR, 182 /* highaddr */ BUS_SPACE_MAXADDR, 183 /* filter */ NULL, 184 /* filterarg */ NULL, 185 /* maxsize */ BUS_SPACE_MAXSIZE_32BIT, 186 /* nsegments */ ~0, 187 /* maxsegsz */ ADV_PCI_MAX_DMA_COUNT, 188 /* flags */ 0, |
202 /* lockfunc */ busdma_lock_mutex, 203 /* lockarg */ &Giant, | 189 /* lockfunc */ NULL, 190 /* lockarg */ NULL, |
204 &adv->parent_dmat); 205 206 if (error != 0) { | 191 &adv->parent_dmat); 192 193 if (error != 0) { |
207 printf("%s: Could not allocate DMA tag - error %d\n", 208 adv_name(adv), error); | 194 device_printf(dev, "Could not allocate DMA tag - error %d\n", 195 error); |
209 adv_free(adv); 210 bus_release_resource(dev, SYS_RES_IOPORT, rid, iores); 211 return ENXIO; 212 } 213 214 adv->init_level++; 215 216 if (overrun_buf == NULL) { --- 5 unchanged lines hidden (view full) --- 222 /* lowaddr */ ADV_PCI_MAX_DMA_ADDR, 223 /* highaddr */ BUS_SPACE_MAXADDR, 224 /* filter */ NULL, 225 /* filterarg */ NULL, 226 /* maxsize */ ADV_OVERRUN_BSIZE, 227 /* nsegments */ 1, 228 /* maxsegsz */ BUS_SPACE_MAXSIZE_32BIT, 229 /* flags */ 0, | 196 adv_free(adv); 197 bus_release_resource(dev, SYS_RES_IOPORT, rid, iores); 198 return ENXIO; 199 } 200 201 adv->init_level++; 202 203 if (overrun_buf == NULL) { --- 5 unchanged lines hidden (view full) --- 209 /* lowaddr */ ADV_PCI_MAX_DMA_ADDR, 210 /* highaddr */ BUS_SPACE_MAXADDR, 211 /* filter */ NULL, 212 /* filterarg */ NULL, 213 /* maxsize */ ADV_OVERRUN_BSIZE, 214 /* nsegments */ 1, 215 /* maxsegsz */ BUS_SPACE_MAXSIZE_32BIT, 216 /* flags */ 0, |
230 /* lockfunc */ busdma_lock_mutex, 231 /* lockarg */ &Giant, | 217 /* lockfunc */ NULL, 218 /* lockarg */ NULL, |
232 &overrun_dmat) != 0) { 233 bus_dma_tag_destroy(adv->parent_dmat); 234 adv_free(adv); 235 bus_release_resource(dev, SYS_RES_IOPORT, rid, iores); 236 return ENXIO; 237 } 238 if (bus_dmamem_alloc(overrun_dmat, 239 &overrun_buf, --- 63 unchanged lines hidden (view full) --- 303 adv->bug_fix_control |= ADV_BUG_FIX_ASYN_USE_SYN; 304 adv->fix_asyn_xfer = ~0; 305 } 306 307 irqrid = 0; 308 irqres = bus_alloc_resource_any(dev, SYS_RES_IRQ, &irqrid, 309 RF_SHAREABLE | RF_ACTIVE); 310 if (irqres == NULL || | 219 &overrun_dmat) != 0) { 220 bus_dma_tag_destroy(adv->parent_dmat); 221 adv_free(adv); 222 bus_release_resource(dev, SYS_RES_IOPORT, rid, iores); 223 return ENXIO; 224 } 225 if (bus_dmamem_alloc(overrun_dmat, 226 &overrun_buf, --- 63 unchanged lines hidden (view full) --- 290 adv->bug_fix_control |= ADV_BUG_FIX_ASYN_USE_SYN; 291 adv->fix_asyn_xfer = ~0; 292 } 293 294 irqrid = 0; 295 irqres = bus_alloc_resource_any(dev, SYS_RES_IRQ, &irqrid, 296 RF_SHAREABLE | RF_ACTIVE); 297 if (irqres == NULL || |
311 bus_setup_intr(dev, irqres, INTR_TYPE_CAM|INTR_ENTROPY, NULL, 312 adv_intr, adv, &ih)) { | 298 bus_setup_intr(dev, irqres, INTR_TYPE_CAM|INTR_ENTROPY|INTR_MPSAFE, 299 NULL, adv_intr, adv, &ih) != 0) { 300 if (irqres != NULL) 301 bus_release_resource(dev, SYS_RES_IRQ, irqrid, irqres); |
313 adv_free(adv); 314 bus_release_resource(dev, SYS_RES_IOPORT, rid, iores); 315 return ENXIO; 316 } 317 | 302 adv_free(adv); 303 bus_release_resource(dev, SYS_RES_IOPORT, rid, iores); 304 return ENXIO; 305 } 306 |
318 adv_attach(adv); | 307 if (adv_attach(adv) != 0) { 308 bus_teardown_intr(dev, irqres, ih); 309 bus_release_resource(dev, SYS_RES_IRQ, irqrid, irqres); 310 adv_free(adv); 311 bus_release_resource(dev, SYS_RES_IOPORT, rid, iores); 312 return ENXIO; 313 } |
319 return 0; 320} 321 322static device_method_t adv_pci_methods[] = { 323 /* Device interface */ 324 DEVMETHOD(device_probe, adv_pci_probe), 325 DEVMETHOD(device_attach, adv_pci_attach), 326 { 0, 0 } 327}; 328 329static driver_t adv_pci_driver = { 330 "adv", adv_pci_methods, sizeof(struct adv_softc) 331}; 332 333static devclass_t adv_pci_devclass; 334DRIVER_MODULE(adv, pci, adv_pci_driver, adv_pci_devclass, 0, 0); 335MODULE_DEPEND(adv, pci, 1, 1, 1); | 314 return 0; 315} 316 317static device_method_t adv_pci_methods[] = { 318 /* Device interface */ 319 DEVMETHOD(device_probe, adv_pci_probe), 320 DEVMETHOD(device_attach, adv_pci_attach), 321 { 0, 0 } 322}; 323 324static driver_t adv_pci_driver = { 325 "adv", adv_pci_methods, sizeof(struct adv_softc) 326}; 327 328static devclass_t adv_pci_devclass; 329DRIVER_MODULE(adv, pci, adv_pci_driver, adv_pci_devclass, 0, 0); 330MODULE_DEPEND(adv, pci, 1, 1, 1); |