diff options
Diffstat (limited to 'drivers/message/fusion/mptbase.c')
-rw-r--r-- | drivers/message/fusion/mptbase.c | 299 |
1 files changed, 176 insertions, 123 deletions
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index d890b2b8a93e..642a61b6d0a4 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c | |||
@@ -81,6 +81,10 @@ MODULE_LICENSE("GPL"); | |||
81 | /* | 81 | /* |
82 | * cmd line parameters | 82 | * cmd line parameters |
83 | */ | 83 | */ |
84 | static int mpt_msi_enable; | ||
85 | module_param(mpt_msi_enable, int, 0); | ||
86 | MODULE_PARM_DESC(mpt_msi_enable, " MSI Support Enable (default=0)"); | ||
87 | |||
84 | #ifdef MFCNT | 88 | #ifdef MFCNT |
85 | static int mfcounter = 0; | 89 | static int mfcounter = 0; |
86 | #define PRINT_MF_COUNT 20000 | 90 | #define PRINT_MF_COUNT 20000 |
@@ -174,7 +178,7 @@ static void mpt_get_fw_exp_ver(char *buf, MPT_ADAPTER *ioc); | |||
174 | static int ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *evReply, int *evHandlers); | 178 | static int ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *evReply, int *evHandlers); |
175 | static void mpt_sp_ioc_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf); | 179 | static void mpt_sp_ioc_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf); |
176 | static void mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info); | 180 | static void mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info); |
177 | static void mpt_sp_log_info(MPT_ADAPTER *ioc, u32 log_info); | 181 | static void mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info); |
178 | static void mpt_sas_log_info(MPT_ADAPTER *ioc, u32 log_info); | 182 | static void mpt_sas_log_info(MPT_ADAPTER *ioc, u32 log_info); |
179 | 183 | ||
180 | /* module entry point */ | 184 | /* module entry point */ |
@@ -313,7 +317,7 @@ mpt_reply(MPT_ADAPTER *ioc, u32 pa) | |||
313 | if (ioc->bus_type == FC) | 317 | if (ioc->bus_type == FC) |
314 | mpt_fc_log_info(ioc, log_info); | 318 | mpt_fc_log_info(ioc, log_info); |
315 | else if (ioc->bus_type == SPI) | 319 | else if (ioc->bus_type == SPI) |
316 | mpt_sp_log_info(ioc, log_info); | 320 | mpt_spi_log_info(ioc, log_info); |
317 | else if (ioc->bus_type == SAS) | 321 | else if (ioc->bus_type == SAS) |
318 | mpt_sas_log_info(ioc, log_info); | 322 | mpt_sas_log_info(ioc, log_info); |
319 | } | 323 | } |
@@ -448,8 +452,7 @@ mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply) | |||
448 | } else if (func == MPI_FUNCTION_EVENT_ACK) { | 452 | } else if (func == MPI_FUNCTION_EVENT_ACK) { |
449 | dprintk((MYIOC_s_INFO_FMT "mpt_base_reply, EventAck reply received\n", | 453 | dprintk((MYIOC_s_INFO_FMT "mpt_base_reply, EventAck reply received\n", |
450 | ioc->name)); | 454 | ioc->name)); |
451 | } else if (func == MPI_FUNCTION_CONFIG || | 455 | } else if (func == MPI_FUNCTION_CONFIG) { |
452 | func == MPI_FUNCTION_TOOLBOX) { | ||
453 | CONFIGPARMS *pCfg; | 456 | CONFIGPARMS *pCfg; |
454 | unsigned long flags; | 457 | unsigned long flags; |
455 | 458 | ||
@@ -1444,6 +1447,9 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1444 | 1447 | ||
1445 | ioc->pci_irq = -1; | 1448 | ioc->pci_irq = -1; |
1446 | if (pdev->irq) { | 1449 | if (pdev->irq) { |
1450 | if (mpt_msi_enable && !pci_enable_msi(pdev)) | ||
1451 | printk(MYIOC_s_INFO_FMT "PCI-MSI enabled\n", ioc->name); | ||
1452 | |||
1447 | r = request_irq(pdev->irq, mpt_interrupt, SA_SHIRQ, ioc->name, ioc); | 1453 | r = request_irq(pdev->irq, mpt_interrupt, SA_SHIRQ, ioc->name, ioc); |
1448 | 1454 | ||
1449 | if (r < 0) { | 1455 | if (r < 0) { |
@@ -1483,6 +1489,10 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1483 | 1489 | ||
1484 | list_del(&ioc->list); | 1490 | list_del(&ioc->list); |
1485 | free_irq(ioc->pci_irq, ioc); | 1491 | free_irq(ioc->pci_irq, ioc); |
1492 | if (mpt_msi_enable) | ||
1493 | pci_disable_msi(pdev); | ||
1494 | if (ioc->alt_ioc) | ||
1495 | ioc->alt_ioc->alt_ioc = NULL; | ||
1486 | iounmap(mem); | 1496 | iounmap(mem); |
1487 | kfree(ioc); | 1497 | kfree(ioc); |
1488 | pci_set_drvdata(pdev, NULL); | 1498 | pci_set_drvdata(pdev, NULL); |
@@ -2136,6 +2146,8 @@ mpt_adapter_dispose(MPT_ADAPTER *ioc) | |||
2136 | 2146 | ||
2137 | if (ioc->pci_irq != -1) { | 2147 | if (ioc->pci_irq != -1) { |
2138 | free_irq(ioc->pci_irq, ioc); | 2148 | free_irq(ioc->pci_irq, ioc); |
2149 | if (mpt_msi_enable) | ||
2150 | pci_disable_msi(ioc->pcidev); | ||
2139 | ioc->pci_irq = -1; | 2151 | ioc->pci_irq = -1; |
2140 | } | 2152 | } |
2141 | 2153 | ||
@@ -2157,6 +2169,10 @@ mpt_adapter_dispose(MPT_ADAPTER *ioc) | |||
2157 | sz_last = ioc->alloc_total; | 2169 | sz_last = ioc->alloc_total; |
2158 | dprintk((KERN_INFO MYNAM ": %s: free'd %d of %d bytes\n", | 2170 | dprintk((KERN_INFO MYNAM ": %s: free'd %d of %d bytes\n", |
2159 | ioc->name, sz_first-sz_last+(int)sizeof(*ioc), sz_first)); | 2171 | ioc->name, sz_first-sz_last+(int)sizeof(*ioc), sz_first)); |
2172 | |||
2173 | if (ioc->alt_ioc) | ||
2174 | ioc->alt_ioc->alt_ioc = NULL; | ||
2175 | |||
2160 | kfree(ioc); | 2176 | kfree(ioc); |
2161 | } | 2177 | } |
2162 | 2178 | ||
@@ -2770,13 +2786,16 @@ SendPortEnable(MPT_ADAPTER *ioc, int portnum, int sleepFlag) | |||
2770 | 2786 | ||
2771 | /* RAID FW may take a long time to enable | 2787 | /* RAID FW may take a long time to enable |
2772 | */ | 2788 | */ |
2773 | if ( (ioc->facts.ProductID & MPI_FW_HEADER_PID_PROD_MASK) | 2789 | if (((ioc->facts.ProductID & MPI_FW_HEADER_PID_PROD_MASK) |
2774 | > MPI_FW_HEADER_PID_PROD_TARGET_SCSI ) { | 2790 | > MPI_FW_HEADER_PID_PROD_TARGET_SCSI) || |
2775 | rc = mpt_handshake_req_reply_wait(ioc, req_sz, (u32*)&port_enable, | 2791 | (ioc->bus_type == SAS)) { |
2776 | reply_sz, (u16*)&reply_buf, 300 /*seconds*/, sleepFlag); | 2792 | rc = mpt_handshake_req_reply_wait(ioc, req_sz, |
2793 | (u32*)&port_enable, reply_sz, (u16*)&reply_buf, | ||
2794 | 300 /*seconds*/, sleepFlag); | ||
2777 | } else { | 2795 | } else { |
2778 | rc = mpt_handshake_req_reply_wait(ioc, req_sz, (u32*)&port_enable, | 2796 | rc = mpt_handshake_req_reply_wait(ioc, req_sz, |
2779 | reply_sz, (u16*)&reply_buf, 30 /*seconds*/, sleepFlag); | 2797 | (u32*)&port_enable, reply_sz, (u16*)&reply_buf, |
2798 | 30 /*seconds*/, sleepFlag); | ||
2780 | } | 2799 | } |
2781 | return rc; | 2800 | return rc; |
2782 | } | 2801 | } |
@@ -4387,6 +4406,138 @@ mptbase_sas_persist_operation(MPT_ADAPTER *ioc, u8 persist_opcode) | |||
4387 | } | 4406 | } |
4388 | 4407 | ||
4389 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 4408 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
4409 | |||
4410 | static void | ||
4411 | mptbase_raid_process_event_data(MPT_ADAPTER *ioc, | ||
4412 | MpiEventDataRaid_t * pRaidEventData) | ||
4413 | { | ||
4414 | int volume; | ||
4415 | int reason; | ||
4416 | int disk; | ||
4417 | int status; | ||
4418 | int flags; | ||
4419 | int state; | ||
4420 | |||
4421 | volume = pRaidEventData->VolumeID; | ||
4422 | reason = pRaidEventData->ReasonCode; | ||
4423 | disk = pRaidEventData->PhysDiskNum; | ||
4424 | status = le32_to_cpu(pRaidEventData->SettingsStatus); | ||
4425 | flags = (status >> 0) & 0xff; | ||
4426 | state = (status >> 8) & 0xff; | ||
4427 | |||
4428 | if (reason == MPI_EVENT_RAID_RC_DOMAIN_VAL_NEEDED) { | ||
4429 | return; | ||
4430 | } | ||
4431 | |||
4432 | if ((reason >= MPI_EVENT_RAID_RC_PHYSDISK_CREATED && | ||
4433 | reason <= MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED) || | ||
4434 | (reason == MPI_EVENT_RAID_RC_SMART_DATA)) { | ||
4435 | printk(MYIOC_s_INFO_FMT "RAID STATUS CHANGE for PhysDisk %d\n", | ||
4436 | ioc->name, disk); | ||
4437 | } else { | ||
4438 | printk(MYIOC_s_INFO_FMT "RAID STATUS CHANGE for VolumeID %d\n", | ||
4439 | ioc->name, volume); | ||
4440 | } | ||
4441 | |||
4442 | switch(reason) { | ||
4443 | case MPI_EVENT_RAID_RC_VOLUME_CREATED: | ||
4444 | printk(MYIOC_s_INFO_FMT " volume has been created\n", | ||
4445 | ioc->name); | ||
4446 | break; | ||
4447 | |||
4448 | case MPI_EVENT_RAID_RC_VOLUME_DELETED: | ||
4449 | |||
4450 | printk(MYIOC_s_INFO_FMT " volume has been deleted\n", | ||
4451 | ioc->name); | ||
4452 | break; | ||
4453 | |||
4454 | case MPI_EVENT_RAID_RC_VOLUME_SETTINGS_CHANGED: | ||
4455 | printk(MYIOC_s_INFO_FMT " volume settings have been changed\n", | ||
4456 | ioc->name); | ||
4457 | break; | ||
4458 | |||
4459 | case MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED: | ||
4460 | printk(MYIOC_s_INFO_FMT " volume is now %s%s%s%s\n", | ||
4461 | ioc->name, | ||
4462 | state == MPI_RAIDVOL0_STATUS_STATE_OPTIMAL | ||
4463 | ? "optimal" | ||
4464 | : state == MPI_RAIDVOL0_STATUS_STATE_DEGRADED | ||
4465 | ? "degraded" | ||
4466 | : state == MPI_RAIDVOL0_STATUS_STATE_FAILED | ||
4467 | ? "failed" | ||
4468 | : "state unknown", | ||
4469 | flags & MPI_RAIDVOL0_STATUS_FLAG_ENABLED | ||
4470 | ? ", enabled" : "", | ||
4471 | flags & MPI_RAIDVOL0_STATUS_FLAG_QUIESCED | ||
4472 | ? ", quiesced" : "", | ||
4473 | flags & MPI_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS | ||
4474 | ? ", resync in progress" : "" ); | ||
4475 | break; | ||
4476 | |||
4477 | case MPI_EVENT_RAID_RC_VOLUME_PHYSDISK_CHANGED: | ||
4478 | printk(MYIOC_s_INFO_FMT " volume membership of PhysDisk %d has changed\n", | ||
4479 | ioc->name, disk); | ||
4480 | break; | ||
4481 | |||
4482 | case MPI_EVENT_RAID_RC_PHYSDISK_CREATED: | ||
4483 | printk(MYIOC_s_INFO_FMT " PhysDisk has been created\n", | ||
4484 | ioc->name); | ||
4485 | break; | ||
4486 | |||
4487 | case MPI_EVENT_RAID_RC_PHYSDISK_DELETED: | ||
4488 | printk(MYIOC_s_INFO_FMT " PhysDisk has been deleted\n", | ||
4489 | ioc->name); | ||
4490 | break; | ||
4491 | |||
4492 | case MPI_EVENT_RAID_RC_PHYSDISK_SETTINGS_CHANGED: | ||
4493 | printk(MYIOC_s_INFO_FMT " PhysDisk settings have been changed\n", | ||
4494 | ioc->name); | ||
4495 | break; | ||
4496 | |||
4497 | case MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED: | ||
4498 | printk(MYIOC_s_INFO_FMT " PhysDisk is now %s%s%s\n", | ||
4499 | ioc->name, | ||
4500 | state == MPI_PHYSDISK0_STATUS_ONLINE | ||
4501 | ? "online" | ||
4502 | : state == MPI_PHYSDISK0_STATUS_MISSING | ||
4503 | ? "missing" | ||
4504 | : state == MPI_PHYSDISK0_STATUS_NOT_COMPATIBLE | ||
4505 | ? "not compatible" | ||
4506 | : state == MPI_PHYSDISK0_STATUS_FAILED | ||
4507 | ? "failed" | ||
4508 | : state == MPI_PHYSDISK0_STATUS_INITIALIZING | ||
4509 | ? "initializing" | ||
4510 | : state == MPI_PHYSDISK0_STATUS_OFFLINE_REQUESTED | ||
4511 | ? "offline requested" | ||
4512 | : state == MPI_PHYSDISK0_STATUS_FAILED_REQUESTED | ||
4513 | ? "failed requested" | ||
4514 | : state == MPI_PHYSDISK0_STATUS_OTHER_OFFLINE | ||
4515 | ? "offline" | ||
4516 | : "state unknown", | ||
4517 | flags & MPI_PHYSDISK0_STATUS_FLAG_OUT_OF_SYNC | ||
4518 | ? ", out of sync" : "", | ||
4519 | flags & MPI_PHYSDISK0_STATUS_FLAG_QUIESCED | ||
4520 | ? ", quiesced" : "" ); | ||
4521 | break; | ||
4522 | |||
4523 | case MPI_EVENT_RAID_RC_DOMAIN_VAL_NEEDED: | ||
4524 | printk(MYIOC_s_INFO_FMT " Domain Validation needed for PhysDisk %d\n", | ||
4525 | ioc->name, disk); | ||
4526 | break; | ||
4527 | |||
4528 | case MPI_EVENT_RAID_RC_SMART_DATA: | ||
4529 | printk(MYIOC_s_INFO_FMT " SMART data received, ASC/ASCQ = %02xh/%02xh\n", | ||
4530 | ioc->name, pRaidEventData->ASC, pRaidEventData->ASCQ); | ||
4531 | break; | ||
4532 | |||
4533 | case MPI_EVENT_RAID_RC_REPLACE_ACTION_STARTED: | ||
4534 | printk(MYIOC_s_INFO_FMT " replacement of PhysDisk %d has started\n", | ||
4535 | ioc->name, disk); | ||
4536 | break; | ||
4537 | } | ||
4538 | } | ||
4539 | |||
4540 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | ||
4390 | /* | 4541 | /* |
4391 | * GetIoUnitPage2 - Retrieve BIOS version and boot order information. | 4542 | * GetIoUnitPage2 - Retrieve BIOS version and boot order information. |
4392 | * @ioc: Pointer to MPT_ADAPTER structure | 4543 | * @ioc: Pointer to MPT_ADAPTER structure |
@@ -4598,6 +4749,14 @@ mpt_GetScsiPortSettings(MPT_ADAPTER *ioc, int portnum) | |||
4598 | SCSIPortPage2_t *pPP2 = (SCSIPortPage2_t *) pbuf; | 4749 | SCSIPortPage2_t *pPP2 = (SCSIPortPage2_t *) pbuf; |
4599 | MpiDeviceInfo_t *pdevice = NULL; | 4750 | MpiDeviceInfo_t *pdevice = NULL; |
4600 | 4751 | ||
4752 | /* | ||
4753 | * Save "Set to Avoid SCSI Bus Resets" flag | ||
4754 | */ | ||
4755 | ioc->spi_data.bus_reset = | ||
4756 | (le32_to_cpu(pPP2->PortFlags) & | ||
4757 | MPI_SCSIPORTPAGE2_PORT_FLAGS_AVOID_SCSI_RESET) ? | ||
4758 | 0 : 1 ; | ||
4759 | |||
4601 | /* Save the Port Page 2 data | 4760 | /* Save the Port Page 2 data |
4602 | * (reformat into a 32bit quantity) | 4761 | * (reformat into a 32bit quantity) |
4603 | */ | 4762 | */ |
@@ -5167,115 +5326,6 @@ mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg) | |||
5167 | } | 5326 | } |
5168 | 5327 | ||
5169 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 5328 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
5170 | /** | ||
5171 | * mpt_toolbox - Generic function to issue toolbox message | ||
5172 | * @ioc - Pointer to an adapter structure | ||
5173 | * @cfg - Pointer to a toolbox structure. Struct contains | ||
5174 | * action, page address, direction, physical address | ||
5175 | * and pointer to a configuration page header | ||
5176 | * Page header is updated. | ||
5177 | * | ||
5178 | * Returns 0 for success | ||
5179 | * -EPERM if not allowed due to ISR context | ||
5180 | * -EAGAIN if no msg frames currently available | ||
5181 | * -EFAULT for non-successful reply or no reply (timeout) | ||
5182 | */ | ||
5183 | int | ||
5184 | mpt_toolbox(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg) | ||
5185 | { | ||
5186 | ToolboxIstwiReadWriteRequest_t *pReq; | ||
5187 | MPT_FRAME_HDR *mf; | ||
5188 | struct pci_dev *pdev; | ||
5189 | unsigned long flags; | ||
5190 | int rc; | ||
5191 | u32 flagsLength; | ||
5192 | int in_isr; | ||
5193 | |||
5194 | /* Prevent calling wait_event() (below), if caller happens | ||
5195 | * to be in ISR context, because that is fatal! | ||
5196 | */ | ||
5197 | in_isr = in_interrupt(); | ||
5198 | if (in_isr) { | ||
5199 | dcprintk((MYIOC_s_WARN_FMT "toobox request not allowed in ISR context!\n", | ||
5200 | ioc->name)); | ||
5201 | return -EPERM; | ||
5202 | } | ||
5203 | |||
5204 | /* Get and Populate a free Frame | ||
5205 | */ | ||
5206 | if ((mf = mpt_get_msg_frame(mpt_base_index, ioc)) == NULL) { | ||
5207 | dcprintk((MYIOC_s_WARN_FMT "mpt_toolbox: no msg frames!\n", | ||
5208 | ioc->name)); | ||
5209 | return -EAGAIN; | ||
5210 | } | ||
5211 | pReq = (ToolboxIstwiReadWriteRequest_t *)mf; | ||
5212 | pReq->Tool = pCfg->action; | ||
5213 | pReq->Reserved = 0; | ||
5214 | pReq->ChainOffset = 0; | ||
5215 | pReq->Function = MPI_FUNCTION_TOOLBOX; | ||
5216 | pReq->Reserved1 = 0; | ||
5217 | pReq->Reserved2 = 0; | ||
5218 | pReq->MsgFlags = 0; | ||
5219 | pReq->Flags = pCfg->dir; | ||
5220 | pReq->BusNum = 0; | ||
5221 | pReq->Reserved3 = 0; | ||
5222 | pReq->NumAddressBytes = 0x01; | ||
5223 | pReq->Reserved4 = 0; | ||
5224 | pReq->DataLength = cpu_to_le16(0x04); | ||
5225 | pdev = ioc->pcidev; | ||
5226 | if (pdev->devfn & 1) | ||
5227 | pReq->DeviceAddr = 0xB2; | ||
5228 | else | ||
5229 | pReq->DeviceAddr = 0xB0; | ||
5230 | pReq->Addr1 = 0; | ||
5231 | pReq->Addr2 = 0; | ||
5232 | pReq->Addr3 = 0; | ||
5233 | pReq->Reserved5 = 0; | ||
5234 | |||
5235 | /* Add a SGE to the config request. | ||
5236 | */ | ||
5237 | |||
5238 | flagsLength = MPT_SGE_FLAGS_SSIMPLE_READ | 4; | ||
5239 | |||
5240 | mpt_add_sge((char *)&pReq->SGL, flagsLength, pCfg->physAddr); | ||
5241 | |||
5242 | dcprintk((MYIOC_s_INFO_FMT "Sending Toolbox request, Tool=%x\n", | ||
5243 | ioc->name, pReq->Tool)); | ||
5244 | |||
5245 | /* Append pCfg pointer to end of mf | ||
5246 | */ | ||
5247 | *((void **) (((u8 *) mf) + (ioc->req_sz - sizeof(void *)))) = (void *) pCfg; | ||
5248 | |||
5249 | /* Initalize the timer | ||
5250 | */ | ||
5251 | init_timer(&pCfg->timer); | ||
5252 | pCfg->timer.data = (unsigned long) ioc; | ||
5253 | pCfg->timer.function = mpt_timer_expired; | ||
5254 | pCfg->wait_done = 0; | ||
5255 | |||
5256 | /* Set the timer; ensure 10 second minimum */ | ||
5257 | if (pCfg->timeout < 10) | ||
5258 | pCfg->timer.expires = jiffies + HZ*10; | ||
5259 | else | ||
5260 | pCfg->timer.expires = jiffies + HZ*pCfg->timeout; | ||
5261 | |||
5262 | /* Add to end of Q, set timer and then issue this command */ | ||
5263 | spin_lock_irqsave(&ioc->FreeQlock, flags); | ||
5264 | list_add_tail(&pCfg->linkage, &ioc->configQ); | ||
5265 | spin_unlock_irqrestore(&ioc->FreeQlock, flags); | ||
5266 | |||
5267 | add_timer(&pCfg->timer); | ||
5268 | mpt_put_msg_frame(mpt_base_index, ioc, mf); | ||
5269 | wait_event(mpt_waitq, pCfg->wait_done); | ||
5270 | |||
5271 | /* mf has been freed - do not access */ | ||
5272 | |||
5273 | rc = pCfg->status; | ||
5274 | |||
5275 | return rc; | ||
5276 | } | ||
5277 | |||
5278 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | ||
5279 | /* | 5329 | /* |
5280 | * mpt_timer_expired - Call back for timer process. | 5330 | * mpt_timer_expired - Call back for timer process. |
5281 | * Used only internal config functionality. | 5331 | * Used only internal config functionality. |
@@ -5967,6 +6017,10 @@ ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply | |||
5967 | } | 6017 | } |
5968 | } | 6018 | } |
5969 | break; | 6019 | break; |
6020 | case MPI_EVENT_INTEGRATED_RAID: | ||
6021 | mptbase_raid_process_event_data(ioc, | ||
6022 | (MpiEventDataRaid_t *)pEventReply->Data); | ||
6023 | break; | ||
5970 | default: | 6024 | default: |
5971 | break; | 6025 | break; |
5972 | } | 6026 | } |
@@ -5978,7 +6032,7 @@ ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply | |||
5978 | if (ioc->events && (ioc->eventTypes & ( 1 << event))) { | 6032 | if (ioc->events && (ioc->eventTypes & ( 1 << event))) { |
5979 | int idx; | 6033 | int idx; |
5980 | 6034 | ||
5981 | idx = ioc->eventContext % ioc->eventLogSize; | 6035 | idx = ioc->eventContext % MPTCTL_EVENT_LOG_SIZE; |
5982 | 6036 | ||
5983 | ioc->events[idx].event = event; | 6037 | ioc->events[idx].event = event; |
5984 | ioc->events[idx].eventContext = ioc->eventContext; | 6038 | ioc->events[idx].eventContext = ioc->eventContext; |
@@ -6046,7 +6100,7 @@ mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info) | |||
6046 | 6100 | ||
6047 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 6101 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
6048 | /* | 6102 | /* |
6049 | * mpt_sp_log_info - Log information returned from SCSI Parallel IOC. | 6103 | * mpt_spi_log_info - Log information returned from SCSI Parallel IOC. |
6050 | * @ioc: Pointer to MPT_ADAPTER structure | 6104 | * @ioc: Pointer to MPT_ADAPTER structure |
6051 | * @mr: Pointer to MPT reply frame | 6105 | * @mr: Pointer to MPT reply frame |
6052 | * @log_info: U32 LogInfo word from the IOC | 6106 | * @log_info: U32 LogInfo word from the IOC |
@@ -6054,7 +6108,7 @@ mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info) | |||
6054 | * Refer to lsi/sp_log.h. | 6108 | * Refer to lsi/sp_log.h. |
6055 | */ | 6109 | */ |
6056 | static void | 6110 | static void |
6057 | mpt_sp_log_info(MPT_ADAPTER *ioc, u32 log_info) | 6111 | mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info) |
6058 | { | 6112 | { |
6059 | u32 info = log_info & 0x00FF0000; | 6113 | u32 info = log_info & 0x00FF0000; |
6060 | char *desc = "unknown"; | 6114 | char *desc = "unknown"; |
@@ -6376,7 +6430,6 @@ EXPORT_SYMBOL(mpt_lan_index); | |||
6376 | EXPORT_SYMBOL(mpt_stm_index); | 6430 | EXPORT_SYMBOL(mpt_stm_index); |
6377 | EXPORT_SYMBOL(mpt_HardResetHandler); | 6431 | EXPORT_SYMBOL(mpt_HardResetHandler); |
6378 | EXPORT_SYMBOL(mpt_config); | 6432 | EXPORT_SYMBOL(mpt_config); |
6379 | EXPORT_SYMBOL(mpt_toolbox); | ||
6380 | EXPORT_SYMBOL(mpt_findImVolumes); | 6433 | EXPORT_SYMBOL(mpt_findImVolumes); |
6381 | EXPORT_SYMBOL(mpt_read_ioc_pg_3); | 6434 | EXPORT_SYMBOL(mpt_read_ioc_pg_3); |
6382 | EXPORT_SYMBOL(mpt_alloc_fw_memory); | 6435 | EXPORT_SYMBOL(mpt_alloc_fw_memory); |