diff options
Diffstat (limited to 'drivers/message/fusion/mptbase.c')
| -rw-r--r-- | drivers/message/fusion/mptbase.c | 75 |
1 files changed, 48 insertions, 27 deletions
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index 57543603d6c8..43308df64623 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c | |||
| @@ -368,20 +368,21 @@ static irqreturn_t | |||
| 368 | mpt_interrupt(int irq, void *bus_id, struct pt_regs *r) | 368 | mpt_interrupt(int irq, void *bus_id, struct pt_regs *r) |
| 369 | { | 369 | { |
| 370 | MPT_ADAPTER *ioc = bus_id; | 370 | MPT_ADAPTER *ioc = bus_id; |
| 371 | u32 pa; | 371 | u32 pa = CHIPREG_READ32_dmasync(&ioc->chip->ReplyFifo); |
| 372 | |||
| 373 | if (pa == 0xFFFFFFFF) | ||
| 374 | return IRQ_NONE; | ||
| 372 | 375 | ||
| 373 | /* | 376 | /* |
| 374 | * Drain the reply FIFO! | 377 | * Drain the reply FIFO! |
| 375 | */ | 378 | */ |
| 376 | while (1) { | 379 | do { |
| 377 | pa = CHIPREG_READ32_dmasync(&ioc->chip->ReplyFifo); | 380 | if (pa & MPI_ADDRESS_REPLY_A_BIT) |
| 378 | if (pa == 0xFFFFFFFF) | ||
| 379 | return IRQ_HANDLED; | ||
| 380 | else if (pa & MPI_ADDRESS_REPLY_A_BIT) | ||
| 381 | mpt_reply(ioc, pa); | 381 | mpt_reply(ioc, pa); |
| 382 | else | 382 | else |
| 383 | mpt_turbo_reply(ioc, pa); | 383 | mpt_turbo_reply(ioc, pa); |
| 384 | } | 384 | pa = CHIPREG_READ32_dmasync(&ioc->chip->ReplyFifo); |
| 385 | } while (pa != 0xFFFFFFFF); | ||
| 385 | 386 | ||
| 386 | return IRQ_HANDLED; | 387 | return IRQ_HANDLED; |
| 387 | } | 388 | } |
| @@ -1219,31 +1220,25 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1219 | port = psize = 0; | 1220 | port = psize = 0; |
| 1220 | for (ii=0; ii < DEVICE_COUNT_RESOURCE; ii++) { | 1221 | for (ii=0; ii < DEVICE_COUNT_RESOURCE; ii++) { |
| 1221 | if (pci_resource_flags(pdev, ii) & PCI_BASE_ADDRESS_SPACE_IO) { | 1222 | if (pci_resource_flags(pdev, ii) & PCI_BASE_ADDRESS_SPACE_IO) { |
| 1223 | if (psize) | ||
| 1224 | continue; | ||
| 1222 | /* Get I/O space! */ | 1225 | /* Get I/O space! */ |
| 1223 | port = pci_resource_start(pdev, ii); | 1226 | port = pci_resource_start(pdev, ii); |
| 1224 | psize = pci_resource_len(pdev,ii); | 1227 | psize = pci_resource_len(pdev,ii); |
| 1225 | } else { | 1228 | } else { |
| 1229 | if (msize) | ||
| 1230 | continue; | ||
| 1226 | /* Get memmap */ | 1231 | /* Get memmap */ |
| 1227 | mem_phys = pci_resource_start(pdev, ii); | 1232 | mem_phys = pci_resource_start(pdev, ii); |
| 1228 | msize = pci_resource_len(pdev,ii); | 1233 | msize = pci_resource_len(pdev,ii); |
| 1229 | break; | ||
| 1230 | } | 1234 | } |
| 1231 | } | 1235 | } |
| 1232 | ioc->mem_size = msize; | 1236 | ioc->mem_size = msize; |
| 1233 | 1237 | ||
| 1234 | if (ii == DEVICE_COUNT_RESOURCE) { | ||
| 1235 | printk(KERN_ERR MYNAM ": ERROR - MPT adapter has no memory regions defined!\n"); | ||
| 1236 | kfree(ioc); | ||
| 1237 | return -EINVAL; | ||
| 1238 | } | ||
| 1239 | |||
| 1240 | dinitprintk((KERN_INFO MYNAM ": MPT adapter @ %lx, msize=%dd bytes\n", mem_phys, msize)); | ||
| 1241 | dinitprintk((KERN_INFO MYNAM ": (port i/o @ %lx, psize=%dd bytes)\n", port, psize)); | ||
| 1242 | |||
| 1243 | mem = NULL; | 1238 | mem = NULL; |
| 1244 | /* Get logical ptr for PciMem0 space */ | 1239 | /* Get logical ptr for PciMem0 space */ |
| 1245 | /*mem = ioremap(mem_phys, msize);*/ | 1240 | /*mem = ioremap(mem_phys, msize);*/ |
| 1246 | mem = ioremap(mem_phys, 0x100); | 1241 | mem = ioremap(mem_phys, msize); |
| 1247 | if (mem == NULL) { | 1242 | if (mem == NULL) { |
| 1248 | printk(KERN_ERR MYNAM ": ERROR - Unable to map adapter memory!\n"); | 1243 | printk(KERN_ERR MYNAM ": ERROR - Unable to map adapter memory!\n"); |
| 1249 | kfree(ioc); | 1244 | kfree(ioc); |
| @@ -1343,11 +1338,6 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1343 | ioc->bus_type = SAS; | 1338 | ioc->bus_type = SAS; |
| 1344 | ioc->errata_flag_1064 = 1; | 1339 | ioc->errata_flag_1064 = 1; |
| 1345 | } | 1340 | } |
| 1346 | else if (pdev->device == MPI_MANUFACTPAGE_DEVID_SAS1066) { | ||
| 1347 | ioc->prod_name = "LSISAS1066"; | ||
| 1348 | ioc->bus_type = SAS; | ||
| 1349 | ioc->errata_flag_1064 = 1; | ||
| 1350 | } | ||
| 1351 | else if (pdev->device == MPI_MANUFACTPAGE_DEVID_SAS1068) { | 1341 | else if (pdev->device == MPI_MANUFACTPAGE_DEVID_SAS1068) { |
| 1352 | ioc->prod_name = "LSISAS1068"; | 1342 | ioc->prod_name = "LSISAS1068"; |
| 1353 | ioc->bus_type = SAS; | 1343 | ioc->bus_type = SAS; |
| @@ -1357,14 +1347,14 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1357 | ioc->prod_name = "LSISAS1064E"; | 1347 | ioc->prod_name = "LSISAS1064E"; |
| 1358 | ioc->bus_type = SAS; | 1348 | ioc->bus_type = SAS; |
| 1359 | } | 1349 | } |
| 1360 | else if (pdev->device == MPI_MANUFACTPAGE_DEVID_SAS1066E) { | ||
| 1361 | ioc->prod_name = "LSISAS1066E"; | ||
| 1362 | ioc->bus_type = SAS; | ||
| 1363 | } | ||
| 1364 | else if (pdev->device == MPI_MANUFACTPAGE_DEVID_SAS1068E) { | 1350 | else if (pdev->device == MPI_MANUFACTPAGE_DEVID_SAS1068E) { |
| 1365 | ioc->prod_name = "LSISAS1068E"; | 1351 | ioc->prod_name = "LSISAS1068E"; |
| 1366 | ioc->bus_type = SAS; | 1352 | ioc->bus_type = SAS; |
| 1367 | } | 1353 | } |
| 1354 | else if (pdev->device == MPI_MANUFACTPAGE_DEVID_SAS1078) { | ||
| 1355 | ioc->prod_name = "LSISAS1078"; | ||
| 1356 | ioc->bus_type = SAS; | ||
| 1357 | } | ||
| 1368 | 1358 | ||
| 1369 | if (ioc->errata_flag_1064) | 1359 | if (ioc->errata_flag_1064) |
| 1370 | pci_disable_io_access(pdev); | 1360 | pci_disable_io_access(pdev); |
| @@ -3184,6 +3174,37 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag) | |||
| 3184 | u32 diag1val = 0; | 3174 | u32 diag1val = 0; |
| 3185 | #endif | 3175 | #endif |
| 3186 | 3176 | ||
| 3177 | if (ioc->pcidev->device == MPI_MANUFACTPAGE_DEVID_SAS1078) { | ||
| 3178 | drsprintk((MYIOC_s_WARN_FMT "%s: Doorbell=%p; 1078 reset " | ||
| 3179 | "address=%p\n", ioc->name, __FUNCTION__, | ||
| 3180 | &ioc->chip->Doorbell, &ioc->chip->Reset_1078)); | ||
| 3181 | CHIPREG_WRITE32(&ioc->chip->Reset_1078, 0x07); | ||
| 3182 | if (sleepFlag == CAN_SLEEP) | ||
| 3183 | msleep(1); | ||
| 3184 | else | ||
| 3185 | mdelay(1); | ||
| 3186 | |||
| 3187 | for (count = 0; count < 60; count ++) { | ||
| 3188 | doorbell = CHIPREG_READ32(&ioc->chip->Doorbell); | ||
| 3189 | doorbell &= MPI_IOC_STATE_MASK; | ||
| 3190 | |||
| 3191 | drsprintk((MYIOC_s_INFO_FMT | ||
| 3192 | "looking for READY STATE: doorbell=%x" | ||
| 3193 | " count=%d\n", | ||
| 3194 | ioc->name, doorbell, count)); | ||
| 3195 | if (doorbell == MPI_IOC_STATE_READY) { | ||
| 3196 | return 0; | ||
| 3197 | } | ||
| 3198 | |||
| 3199 | /* wait 1 sec */ | ||
| 3200 | if (sleepFlag == CAN_SLEEP) | ||
| 3201 | msleep(1000); | ||
| 3202 | else | ||
| 3203 | mdelay(1000); | ||
| 3204 | } | ||
| 3205 | return -1; | ||
| 3206 | } | ||
| 3207 | |||
| 3187 | /* Clear any existing interrupts */ | 3208 | /* Clear any existing interrupts */ |
| 3188 | CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); | 3209 | CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); |
| 3189 | 3210 | ||
