Lines Matching refs:ioc
164 static int mptbase_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req,
166 static int mpt_handshake_req_reply_wait(MPT_ADAPTER *ioc, int reqBytes,
169 static int mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag);
170 static void mpt_detect_bound_ports(MPT_ADAPTER *ioc, struct pci_dev *pdev);
171 static void mpt_adapter_disable(MPT_ADAPTER *ioc);
172 static void mpt_adapter_dispose(MPT_ADAPTER *ioc);
174 static void MptDisplayIocCapabilities(MPT_ADAPTER *ioc);
175 static int MakeIocReady(MPT_ADAPTER *ioc, int force, int sleepFlag);
176 static int GetIocFacts(MPT_ADAPTER *ioc, int sleepFlag, int reason);
177 static int GetPortFacts(MPT_ADAPTER *ioc, int portnum, int sleepFlag);
178 static int SendIocInit(MPT_ADAPTER *ioc, int sleepFlag);
179 static int SendPortEnable(MPT_ADAPTER *ioc, int portnum, int sleepFlag);
180 static int mpt_do_upload(MPT_ADAPTER *ioc, int sleepFlag);
181 static int mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag);
182 static int mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag);
183 static int KickStart(MPT_ADAPTER *ioc, int ignore, int sleepFlag);
184 static int SendIocReset(MPT_ADAPTER *ioc, u8 reset_type, int sleepFlag);
185 static int PrimeIocFifos(MPT_ADAPTER *ioc);
186 static int WaitForDoorbellAck(MPT_ADAPTER *ioc, int howlong, int sleepFlag);
187 static int WaitForDoorbellInt(MPT_ADAPTER *ioc, int howlong, int sleepFlag);
188 static int WaitForDoorbellReply(MPT_ADAPTER *ioc, int howlong, int sleepFlag);
189 static int GetLanConfigPages(MPT_ADAPTER *ioc);
190 static int GetIoUnitPage2(MPT_ADAPTER *ioc);
191 int mptbase_sas_persist_operation(MPT_ADAPTER *ioc, u8 persist_opcode);
192 static int mpt_GetScsiPortSettings(MPT_ADAPTER *ioc, int portnum);
193 static int mpt_readScsiDevicePageHeaders(MPT_ADAPTER *ioc, int portnum);
194 static void mpt_read_ioc_pg_1(MPT_ADAPTER *ioc);
195 static void mpt_read_ioc_pg_4(MPT_ADAPTER *ioc);
196 static void mpt_get_manufacturing_pg_0(MPT_ADAPTER *ioc);
197 static int SendEventNotification(MPT_ADAPTER *ioc, u8 EvSwitch,
199 static int SendEventAck(MPT_ADAPTER *ioc, EventNotificationReply_t *evnp);
200 static int mpt_host_page_access_control(MPT_ADAPTER *ioc, u8 access_control_value, int sleepFlag);
201 static int mpt_host_page_alloc(MPT_ADAPTER *ioc, pIOCInit_t ioc_init);
208 static void mpt_get_fw_exp_ver(char *buf, MPT_ADAPTER *ioc);
210 static int ProcessEventNotification(MPT_ADAPTER *ioc,
212 static void mpt_iocstatus_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf);
213 static void mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info);
214 static void mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info);
215 static void mpt_sas_log_info(MPT_ADAPTER *ioc, u32 log_info , u8 cb_idx);
216 static int mpt_read_ioc_pg_3(MPT_ADAPTER *ioc);
217 static void mpt_inactive_raid_list_free(MPT_ADAPTER *ioc);
252 MPT_ADAPTER *ioc; in mpt_set_debug_level() local
257 list_for_each_entry(ioc, &ioc_list, list) in mpt_set_debug_level()
258 ioc->debug_level = mpt_debug_level; in mpt_set_debug_level()
286 mpt_is_discovery_complete(MPT_ADAPTER *ioc) in mpt_is_discovery_complete() argument
302 if ((mpt_config(ioc, &cfg))) in mpt_is_discovery_complete()
307 buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4, in mpt_is_discovery_complete()
315 if ((mpt_config(ioc, &cfg))) in mpt_is_discovery_complete()
323 pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4, in mpt_is_discovery_complete()
339 MPT_ADAPTER *ioc = (MPT_ADAPTER *)arg; in mpt_remove_dead_ioc_func() local
342 if ((ioc == NULL)) in mpt_remove_dead_ioc_func()
345 pdev = ioc->pcidev; in mpt_remove_dead_ioc_func()
363 MPT_ADAPTER *ioc = in mpt_fault_reset_work() local
371 if (ioc->ioc_reset_in_progress || !ioc->active) in mpt_fault_reset_work()
375 ioc_raw_state = mpt_GetIocState(ioc, 0); in mpt_fault_reset_work()
378 ioc->name, __func__); in mpt_fault_reset_work()
387 hd = shost_priv(ioc->sh); in mpt_fault_reset_work()
388 ioc->schedule_dead_ioc_flush_running_cmds(hd); in mpt_fault_reset_work()
391 p = kthread_run(mpt_remove_dead_ioc_func, ioc, in mpt_fault_reset_work()
392 "mpt_dead_ioc_%d", ioc->id); in mpt_fault_reset_work()
396 ioc->name, __func__); in mpt_fault_reset_work()
400 ioc->name, __func__); in mpt_fault_reset_work()
408 ioc->name, ioc_raw_state & MPI_DOORBELL_DATA_MASK); in mpt_fault_reset_work()
410 ioc->name, __func__); in mpt_fault_reset_work()
411 rc = mpt_HardResetHandler(ioc, CAN_SLEEP); in mpt_fault_reset_work()
412 printk(MYIOC_s_WARN_FMT "%s: HardReset: %s\n", ioc->name, in mpt_fault_reset_work()
414 ioc_raw_state = mpt_GetIocState(ioc, 0); in mpt_fault_reset_work()
417 "reset (%04xh)\n", ioc->name, ioc_raw_state & in mpt_fault_reset_work()
419 } else if (ioc->bus_type == SAS && ioc->sas_discovery_quiesce_io) { in mpt_fault_reset_work()
420 if ((mpt_is_discovery_complete(ioc))) { in mpt_fault_reset_work()
421 devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "clearing " in mpt_fault_reset_work()
422 "discovery_quiesce_io flag\n", ioc->name)); in mpt_fault_reset_work()
423 ioc->sas_discovery_quiesce_io = 0; in mpt_fault_reset_work()
431 if (ioc->alt_ioc) in mpt_fault_reset_work()
432 ioc = ioc->alt_ioc; in mpt_fault_reset_work()
435 spin_lock_irqsave(&ioc->taskmgmt_lock, flags); in mpt_fault_reset_work()
436 if (ioc->reset_work_q) in mpt_fault_reset_work()
437 queue_delayed_work(ioc->reset_work_q, &ioc->fault_reset_work, in mpt_fault_reset_work()
439 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); in mpt_fault_reset_work()
447 mpt_turbo_reply(MPT_ADAPTER *ioc, u32 pa) in mpt_turbo_reply() argument
454 dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Got TURBO reply req_idx=%08x\n", in mpt_turbo_reply()
455 ioc->name, pa)); in mpt_turbo_reply()
461 mf = MPT_INDEX_2_MFPTR(ioc, req_idx); in mpt_turbo_reply()
476 mf = MPT_INDEX_2_MFPTR(ioc, req_idx); in mpt_turbo_reply()
477 mpt_free_msg_frame(ioc, mf); in mpt_turbo_reply()
497 __func__, ioc->name, cb_idx); in mpt_turbo_reply()
501 if (MptCallbacks[cb_idx](ioc, mf, mr)) in mpt_turbo_reply()
502 mpt_free_msg_frame(ioc, mf); in mpt_turbo_reply()
508 mpt_reply(MPT_ADAPTER *ioc, u32 pa) in mpt_reply() argument
530 mr = (MPT_FRAME_HDR *)((u8 *)ioc->reply_frames + in mpt_reply()
531 (reply_dma_low - ioc->reply_frames_low_dma)); in mpt_reply()
535 mf = MPT_INDEX_2_MFPTR(ioc, req_idx); in mpt_reply()
537 …dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Got non-TURBO reply=%p req_idx=%x cb_idx=%x Function=%x\n… in mpt_reply()
538 ioc->name, mr, req_idx, cb_idx, mr->u.hdr.Function)); in mpt_reply()
539 DBG_DUMP_REPLY_FRAME(ioc, (u32 *)mr); in mpt_reply()
546 if (ioc->bus_type == FC) in mpt_reply()
547 mpt_fc_log_info(ioc, log_info); in mpt_reply()
548 else if (ioc->bus_type == SPI) in mpt_reply()
549 mpt_spi_log_info(ioc, log_info); in mpt_reply()
550 else if (ioc->bus_type == SAS) in mpt_reply()
551 mpt_sas_log_info(ioc, log_info, cb_idx); in mpt_reply()
555 mpt_iocstatus_info(ioc, (u32)ioc_stat, mf); in mpt_reply()
561 __func__, ioc->name, cb_idx); in mpt_reply()
566 freeme = MptCallbacks[cb_idx](ioc, mf, mr); in mpt_reply()
570 CHIPREG_WRITE32(&ioc->chip->ReplyFifo, pa); in mpt_reply()
573 mpt_free_msg_frame(ioc, mf); in mpt_reply()
597 MPT_ADAPTER *ioc = bus_id; in mpt_interrupt() local
598 u32 pa = CHIPREG_READ32_dmasync(&ioc->chip->ReplyFifo); in mpt_interrupt()
608 mpt_reply(ioc, pa); in mpt_interrupt()
610 mpt_turbo_reply(ioc, pa); in mpt_interrupt()
611 pa = CHIPREG_READ32_dmasync(&ioc->chip->ReplyFifo); in mpt_interrupt()
632 mptbase_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply) in mptbase_reply() argument
643 ProcessEventNotification(ioc, pEventReply, &evHandlers); in mptbase_reply()
651 ioc->mptbase_cmds.status |= MPT_MGMT_STATUS_COMMAND_GOOD; in mptbase_reply()
652 ioc->mptbase_cmds.status |= MPT_MGMT_STATUS_RF_VALID; in mptbase_reply()
653 memcpy(ioc->mptbase_cmds.reply, reply, in mptbase_reply()
656 if (ioc->mptbase_cmds.status & MPT_MGMT_STATUS_PENDING) { in mptbase_reply()
657 ioc->mptbase_cmds.status &= ~MPT_MGMT_STATUS_PENDING; in mptbase_reply()
658 complete(&ioc->mptbase_cmds.done); in mptbase_reply()
661 if (ioc->mptbase_cmds.status & MPT_MGMT_STATUS_FREE_MF) in mptbase_reply()
665 devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mptbase_reply()
666 "EventAck reply received\n", ioc->name)); in mptbase_reply()
671 ioc->name, reply->u.hdr.Function); in mptbase_reply()
835 MPT_ADAPTER *ioc; in mpt_device_driver_register() local
844 list_for_each_entry(ioc, &ioc_list, list) { in mpt_device_driver_register()
845 id = ioc->pcidev->driver ? in mpt_device_driver_register()
846 ioc->pcidev->driver->id_table : NULL; in mpt_device_driver_register()
848 dd_cbfunc->probe(ioc->pcidev, id); in mpt_device_driver_register()
863 MPT_ADAPTER *ioc; in mpt_device_driver_deregister() local
870 list_for_each_entry(ioc, &ioc_list, list) { in mpt_device_driver_deregister()
872 dd_cbfunc->remove(ioc->pcidev); in mpt_device_driver_deregister()
892 mpt_get_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc) in mpt_get_msg_frame() argument
901 if (!ioc->active) in mpt_get_msg_frame()
903 "returning NULL!\n", ioc->name); in mpt_get_msg_frame()
907 if (!ioc->active) in mpt_get_msg_frame()
910 spin_lock_irqsave(&ioc->FreeQlock, flags); in mpt_get_msg_frame()
911 if (!list_empty(&ioc->FreeQ)) { in mpt_get_msg_frame()
914 mf = list_entry(ioc->FreeQ.next, MPT_FRAME_HDR, in mpt_get_msg_frame()
919 req_offset = (u8 *)mf - (u8 *)ioc->req_frames; in mpt_get_msg_frame()
921 req_idx = req_offset / ioc->req_sz; in mpt_get_msg_frame()
925 ioc->RequestNB[req_idx] = ioc->NB_for_64_byte_frame; in mpt_get_msg_frame()
927 ioc->mfcnt++; in mpt_get_msg_frame()
932 spin_unlock_irqrestore(&ioc->FreeQlock, flags); in mpt_get_msg_frame()
937 "Count 0x%x Max 0x%x\n", ioc->name, ioc->mfcnt, in mpt_get_msg_frame()
938 ioc->req_depth); in mpt_get_msg_frame()
941 printk(MYIOC_s_INFO_FMT "MF Count 0x%x Max 0x%x \n", ioc->name, in mpt_get_msg_frame()
942 ioc->mfcnt, ioc->req_depth); in mpt_get_msg_frame()
945 dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mpt_get_msg_frame(%d,%d), got mf=%p\n", in mpt_get_msg_frame()
946 ioc->name, cb_idx, ioc->id, mf)); in mpt_get_msg_frame()
961 mpt_put_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf) in mpt_put_msg_frame() argument
969 req_offset = (u8 *)mf - (u8 *)ioc->req_frames; in mpt_put_msg_frame()
971 req_idx = req_offset / ioc->req_sz; in mpt_put_msg_frame()
975 DBG_DUMP_PUT_MSG_FRAME(ioc, (u32 *)mf); in mpt_put_msg_frame()
977 mf_dma_addr = (ioc->req_frames_low_dma + req_offset) | ioc->RequestNB[req_idx]; in mpt_put_msg_frame()
978 dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mf_dma_addr=%x req_idx=%d " in mpt_put_msg_frame()
979 "RequestNB=%x\n", ioc->name, mf_dma_addr, req_idx, in mpt_put_msg_frame()
980 ioc->RequestNB[req_idx])); in mpt_put_msg_frame()
981 CHIPREG_WRITE32(&ioc->chip->RequestFifo, mf_dma_addr); in mpt_put_msg_frame()
997 mpt_put_msg_frame_hi_pri(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf) in mpt_put_msg_frame_hi_pri() argument
1005 req_offset = (u8 *)mf - (u8 *)ioc->req_frames; in mpt_put_msg_frame_hi_pri()
1006 req_idx = req_offset / ioc->req_sz; in mpt_put_msg_frame_hi_pri()
1010 DBG_DUMP_PUT_MSG_FRAME(ioc, (u32 *)mf); in mpt_put_msg_frame_hi_pri()
1012 mf_dma_addr = (ioc->req_frames_low_dma + req_offset); in mpt_put_msg_frame_hi_pri()
1013 dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mf_dma_addr=%x req_idx=%d\n", in mpt_put_msg_frame_hi_pri()
1014 ioc->name, mf_dma_addr, req_idx)); in mpt_put_msg_frame_hi_pri()
1015 CHIPREG_WRITE32(&ioc->chip->RequestHiPriFifo, mf_dma_addr); in mpt_put_msg_frame_hi_pri()
1028 mpt_free_msg_frame(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf) in mpt_free_msg_frame() argument
1033 spin_lock_irqsave(&ioc->FreeQlock, flags); in mpt_free_msg_frame()
1038 list_add(&mf->u.frame.linkage.list, &ioc->FreeQ); in mpt_free_msg_frame()
1040 ioc->mfcnt--; in mpt_free_msg_frame()
1043 spin_unlock_irqrestore(&ioc->FreeQlock, flags); in mpt_free_msg_frame()
1186 mpt_send_handshake_request(u8 cb_idx, MPT_ADAPTER *ioc, int reqBytes, u32 *req, int sleepFlag) in mpt_send_handshake_request() argument
1202 ii = MFPTR_2_MPT_INDEX(ioc,(MPT_FRAME_HDR*)req); in mpt_send_handshake_request()
1203 if (reqBytes >= 12 && ii >= 0 && ii < ioc->req_depth) { in mpt_send_handshake_request()
1210 CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); in mpt_send_handshake_request()
1212 CHIPREG_WRITE32(&ioc->chip->Doorbell, in mpt_send_handshake_request()
1217 if ((ii = WaitForDoorbellInt(ioc, 5, sleepFlag)) < 0) { in mpt_send_handshake_request()
1222 if (!(CHIPREG_READ32(&ioc->chip->Doorbell) & MPI_DOORBELL_ACTIVE)) in mpt_send_handshake_request()
1225 dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mpt_send_handshake_request start, WaitCnt=%d\n", in mpt_send_handshake_request()
1226 ioc->name, ii)); in mpt_send_handshake_request()
1228 CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); in mpt_send_handshake_request()
1230 if ((r = WaitForDoorbellAck(ioc, 5, sleepFlag)) < 0) { in mpt_send_handshake_request()
1243 CHIPREG_WRITE32(&ioc->chip->Doorbell, word); in mpt_send_handshake_request()
1244 if ((r = WaitForDoorbellAck(ioc, 5, sleepFlag)) < 0) { in mpt_send_handshake_request()
1250 if (r >= 0 && WaitForDoorbellInt(ioc, 10, sleepFlag) >= 0) in mpt_send_handshake_request()
1256 CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); in mpt_send_handshake_request()
1281 mpt_host_page_access_control(MPT_ADAPTER *ioc, u8 access_control_value, int sleepFlag) in mpt_host_page_access_control() argument
1286 if (CHIPREG_READ32(&ioc->chip->Doorbell) in mpt_host_page_access_control()
1290 CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); in mpt_host_page_access_control()
1292 CHIPREG_WRITE32(&ioc->chip->Doorbell, in mpt_host_page_access_control()
1298 if ((r = WaitForDoorbellAck(ioc, 5, sleepFlag)) < 0) { in mpt_host_page_access_control()
1314 mpt_host_page_alloc(MPT_ADAPTER *ioc, pIOCInit_t ioc_init) in mpt_host_page_alloc() argument
1320 if(!ioc->HostPageBuffer) { in mpt_host_page_alloc()
1323 le32_to_cpu(ioc->facts.HostPageBufferSGE.FlagsLength) & 0xFFFFFF; in mpt_host_page_alloc()
1331 if((ioc->HostPageBuffer = pci_alloc_consistent( in mpt_host_page_alloc()
1332 ioc->pcidev, in mpt_host_page_alloc()
1334 &ioc->HostPageBuffer_dma)) != NULL) { in mpt_host_page_alloc()
1336 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_host_page_alloc()
1338 ioc->name, ioc->HostPageBuffer, in mpt_host_page_alloc()
1339 (u32)ioc->HostPageBuffer_dma, in mpt_host_page_alloc()
1341 ioc->alloc_total += host_page_buffer_sz; in mpt_host_page_alloc()
1342 ioc->HostPageBuffer_sz = host_page_buffer_sz; in mpt_host_page_alloc()
1350 if(!ioc->HostPageBuffer) { in mpt_host_page_alloc()
1353 ioc->name); in mpt_host_page_alloc()
1363 flags_length |= ioc->HostPageBuffer_sz; in mpt_host_page_alloc()
1364 ioc->add_sge(psge, flags_length, ioc->HostPageBuffer_dma); in mpt_host_page_alloc()
1365 ioc->facts.HostPageBufferSGE = ioc_init->HostPageBufferSGE; in mpt_host_page_alloc()
1385 MPT_ADAPTER *ioc; in mpt_verify_adapter() local
1387 list_for_each_entry(ioc,&ioc_list,list) { in mpt_verify_adapter()
1388 if (ioc->id == iocid) { in mpt_verify_adapter()
1389 *iocpp =ioc; in mpt_verify_adapter()
1644 mpt_mapresources(MPT_ADAPTER *ioc) in mpt_mapresources() argument
1655 pdev = ioc->pcidev; in mpt_mapresources()
1656 ioc->bars = pci_select_bars(pdev, IORESOURCE_MEM); in mpt_mapresources()
1659 "failed\n", ioc->name); in mpt_mapresources()
1662 if (pci_request_selected_regions(pdev, ioc->bars, "mpt")) { in mpt_mapresources()
1664 "MEM failed\n", ioc->name); in mpt_mapresources()
1675 ioc->dma_mask = DMA_BIT_MASK(64); in mpt_mapresources()
1676 dinitprintk(ioc, printk(MYIOC_s_INFO_FMT in mpt_mapresources()
1678 ioc->name)); in mpt_mapresources()
1682 ioc->dma_mask = DMA_BIT_MASK(32); in mpt_mapresources()
1683 dinitprintk(ioc, printk(MYIOC_s_INFO_FMT in mpt_mapresources()
1685 ioc->name)); in mpt_mapresources()
1688 ioc->name, pci_name(pdev)); in mpt_mapresources()
1695 ioc->dma_mask = DMA_BIT_MASK(32); in mpt_mapresources()
1696 dinitprintk(ioc, printk(MYIOC_s_INFO_FMT in mpt_mapresources()
1698 ioc->name)); in mpt_mapresources()
1701 ioc->name, pci_name(pdev)); in mpt_mapresources()
1723 ioc->mem_size = msize; in mpt_mapresources()
1731 " memory!\n", ioc->name); in mpt_mapresources()
1735 ioc->memmap = mem; in mpt_mapresources()
1736 dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "mem = %p, mem_phys = %llx\n", in mpt_mapresources()
1737 ioc->name, mem, (unsigned long long)mem_phys)); in mpt_mapresources()
1739 ioc->mem_phys = mem_phys; in mpt_mapresources()
1740 ioc->chip = (SYSIF_REGS __iomem *)mem; in mpt_mapresources()
1743 ioc->pio_mem_phys = port; in mpt_mapresources()
1744 ioc->pio_chip = (SYSIF_REGS __iomem *)port; in mpt_mapresources()
1749 pci_release_selected_regions(pdev, ioc->bars); in mpt_mapresources()
1776 MPT_ADAPTER *ioc; in mpt_attach() local
1785 ioc = kzalloc(sizeof(MPT_ADAPTER), GFP_ATOMIC); in mpt_attach()
1786 if (ioc == NULL) { in mpt_attach()
1791 ioc->id = mpt_ids++; in mpt_attach()
1792 sprintf(ioc->name, "ioc%d", ioc->id); in mpt_attach()
1793 dinitprintk(ioc, printk(KERN_WARNING MYNAM ": mpt_adapter_install\n")); in mpt_attach()
1800 ioc->debug_level = mpt_debug_level; in mpt_attach()
1804 dinitprintk(ioc, printk(MYIOC_s_INFO_FMT ": mpt_adapter_install\n", ioc->name)); in mpt_attach()
1806 ioc->pcidev = pdev; in mpt_attach()
1807 if (mpt_mapresources(ioc)) { in mpt_attach()
1808 kfree(ioc); in mpt_attach()
1815 if (ioc->dma_mask == DMA_BIT_MASK(64)) { in mpt_attach()
1817 ioc->add_sge = &mpt_add_sge_64bit_1078; in mpt_attach()
1819 ioc->add_sge = &mpt_add_sge_64bit; in mpt_attach()
1820 ioc->add_chain = &mpt_add_chain_64bit; in mpt_attach()
1821 ioc->sg_addr_size = 8; in mpt_attach()
1823 ioc->add_sge = &mpt_add_sge; in mpt_attach()
1824 ioc->add_chain = &mpt_add_chain; in mpt_attach()
1825 ioc->sg_addr_size = 4; in mpt_attach()
1827 ioc->SGE_size = sizeof(u32) + ioc->sg_addr_size; in mpt_attach()
1829 ioc->alloc_total = sizeof(MPT_ADAPTER); in mpt_attach()
1830 ioc->req_sz = MPT_DEFAULT_FRAME_SIZE; /* avoid div by zero! */ in mpt_attach()
1831 ioc->reply_sz = MPT_REPLY_FRAME_SIZE; in mpt_attach()
1834 spin_lock_init(&ioc->taskmgmt_lock); in mpt_attach()
1835 mutex_init(&ioc->internal_cmds.mutex); in mpt_attach()
1836 init_completion(&ioc->internal_cmds.done); in mpt_attach()
1837 mutex_init(&ioc->mptbase_cmds.mutex); in mpt_attach()
1838 init_completion(&ioc->mptbase_cmds.done); in mpt_attach()
1839 mutex_init(&ioc->taskmgmt_cmds.mutex); in mpt_attach()
1840 init_completion(&ioc->taskmgmt_cmds.done); in mpt_attach()
1844 ioc->eventTypes = 0; /* None */ in mpt_attach()
1845 ioc->eventContext = 0; in mpt_attach()
1846 ioc->eventLogSize = 0; in mpt_attach()
1847 ioc->events = NULL; in mpt_attach()
1850 ioc->mfcnt = 0; in mpt_attach()
1853 ioc->sh = NULL; in mpt_attach()
1854 ioc->cached_fw = NULL; in mpt_attach()
1858 memset(&ioc->spi_data, 0, sizeof(SpiCfgData)); in mpt_attach()
1862 INIT_LIST_HEAD(&ioc->fc_rports); in mpt_attach()
1865 INIT_LIST_HEAD(&ioc->list); in mpt_attach()
1869 INIT_DELAYED_WORK(&ioc->fault_reset_work, mpt_fault_reset_work); in mpt_attach()
1871 snprintf(ioc->reset_work_q_name, MPT_KOBJ_NAME_LEN, in mpt_attach()
1872 "mpt_poll_%d", ioc->id); in mpt_attach()
1873 ioc->reset_work_q = in mpt_attach()
1874 create_singlethread_workqueue(ioc->reset_work_q_name); in mpt_attach()
1875 if (!ioc->reset_work_q) { in mpt_attach()
1877 ioc->name); in mpt_attach()
1878 pci_release_selected_regions(pdev, ioc->bars); in mpt_attach()
1879 kfree(ioc); in mpt_attach()
1883 dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "facts @ %p, pfacts[0] @ %p\n", in mpt_attach()
1884 ioc->name, &ioc->facts, &ioc->pfacts[0])); in mpt_attach()
1886 ioc->prod_name = mpt_get_product_name(pdev->vendor, pdev->device, in mpt_attach()
1893 ioc->errata_flag_1064 = 1; in mpt_attach()
1898 ioc->bus_type = FC; in mpt_attach()
1916 ioc->bus_type = FC; in mpt_attach()
1926 ioc->bus_type = FC; in mpt_attach()
1940 ioc->bus_type = SPI; in mpt_attach()
1945 ioc->errata_flag_1064 = 1; in mpt_attach()
1946 ioc->bus_type = SAS; in mpt_attach()
1952 ioc->bus_type = SAS; in mpt_attach()
1957 switch (ioc->bus_type) { in mpt_attach()
1960 ioc->msi_enable = mpt_msi_enable_sas; in mpt_attach()
1964 ioc->msi_enable = mpt_msi_enable_spi; in mpt_attach()
1968 ioc->msi_enable = mpt_msi_enable_fc; in mpt_attach()
1972 ioc->msi_enable = 0; in mpt_attach()
1976 ioc->fw_events_off = 1; in mpt_attach()
1978 if (ioc->errata_flag_1064) in mpt_attach()
1981 spin_lock_init(&ioc->FreeQlock); in mpt_attach()
1984 CHIPREG_WRITE32(&ioc->chip->IntMask, 0xFFFFFFFF); in mpt_attach()
1985 ioc->active = 0; in mpt_attach()
1986 CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); in mpt_attach()
1989 pci_set_drvdata(ioc->pcidev, ioc); in mpt_attach()
1992 list_add_tail(&ioc->list, &ioc_list); in mpt_attach()
1996 mpt_detect_bound_ports(ioc, pdev); in mpt_attach()
1998 INIT_LIST_HEAD(&ioc->fw_event_list); in mpt_attach()
1999 spin_lock_init(&ioc->fw_event_lock); in mpt_attach()
2000 snprintf(ioc->fw_event_q_name, MPT_KOBJ_NAME_LEN, "mpt/%d", ioc->id); in mpt_attach()
2001 ioc->fw_event_q = create_singlethread_workqueue(ioc->fw_event_q_name); in mpt_attach()
2003 if ((r = mpt_do_ioc_recovery(ioc, MPT_HOSTEVENT_IOC_BRINGUP, in mpt_attach()
2006 ioc->name, r); in mpt_attach()
2008 list_del(&ioc->list); in mpt_attach()
2009 if (ioc->alt_ioc) in mpt_attach()
2010 ioc->alt_ioc->alt_ioc = NULL; in mpt_attach()
2011 iounmap(ioc->memmap); in mpt_attach()
2013 pci_release_selected_regions(pdev, ioc->bars); in mpt_attach()
2015 destroy_workqueue(ioc->reset_work_q); in mpt_attach()
2016 ioc->reset_work_q = NULL; in mpt_attach()
2018 kfree(ioc); in mpt_attach()
2035 dent = proc_mkdir(ioc->name, mpt_proc_root_dir); in mpt_attach()
2037 proc_create_data("info", S_IRUGO, dent, &mpt_iocinfo_proc_fops, ioc); in mpt_attach()
2038 proc_create_data("summary", S_IRUGO, dent, &mpt_summary_proc_fops, ioc); in mpt_attach()
2042 if (!ioc->alt_ioc) in mpt_attach()
2043 queue_delayed_work(ioc->reset_work_q, &ioc->fault_reset_work, in mpt_attach()
2058 MPT_ADAPTER *ioc = pci_get_drvdata(pdev); in mpt_detach() local
2067 spin_lock_irqsave(&ioc->taskmgmt_lock, flags); in mpt_detach()
2068 wq = ioc->reset_work_q; in mpt_detach()
2069 ioc->reset_work_q = NULL; in mpt_detach()
2070 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); in mpt_detach()
2071 cancel_delayed_work(&ioc->fault_reset_work); in mpt_detach()
2074 spin_lock_irqsave(&ioc->fw_event_lock, flags); in mpt_detach()
2075 wq = ioc->fw_event_q; in mpt_detach()
2076 ioc->fw_event_q = NULL; in mpt_detach()
2077 spin_unlock_irqrestore(&ioc->fw_event_lock, flags); in mpt_detach()
2080 sprintf(pname, MPT_PROCFS_MPTBASEDIR "/%s/summary", ioc->name); in mpt_detach()
2082 sprintf(pname, MPT_PROCFS_MPTBASEDIR "/%s/info", ioc->name); in mpt_detach()
2084 sprintf(pname, MPT_PROCFS_MPTBASEDIR "/%s", ioc->name); in mpt_detach()
2096 CHIPREG_WRITE32(&ioc->chip->IntMask, 0xFFFFFFFF); in mpt_detach()
2098 ioc->active = 0; in mpt_detach()
2102 CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); in mpt_detach()
2104 CHIPREG_READ32(&ioc->chip->IntStatus); in mpt_detach()
2106 mpt_adapter_dispose(ioc); in mpt_detach()
2124 MPT_ADAPTER *ioc = pci_get_drvdata(pdev); in mpt_suspend() local
2128 "operating state [D%d]\n", ioc->name, pdev, pci_name(pdev), in mpt_suspend()
2132 if(SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, CAN_SLEEP)) { in mpt_suspend()
2134 "pci-suspend: IOC msg unit reset failed!\n", ioc->name); in mpt_suspend()
2138 CHIPREG_WRITE32(&ioc->chip->IntMask, 0xFFFFFFFF); in mpt_suspend()
2139 ioc->active = 0; in mpt_suspend()
2142 CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); in mpt_suspend()
2144 free_irq(ioc->pci_irq, ioc); in mpt_suspend()
2145 if (ioc->msi_enable) in mpt_suspend()
2146 pci_disable_msi(ioc->pcidev); in mpt_suspend()
2147 ioc->pci_irq = -1; in mpt_suspend()
2150 pci_release_selected_regions(pdev, ioc->bars); in mpt_suspend()
2163 MPT_ADAPTER *ioc = pci_get_drvdata(pdev); in mpt_resume() local
2169 "operating state [D%d]\n", ioc->name, pdev, pci_name(pdev), in mpt_resume()
2175 ioc->pcidev = pdev; in mpt_resume()
2176 err = mpt_mapresources(ioc); in mpt_resume()
2180 if (ioc->dma_mask == DMA_BIT_MASK(64)) { in mpt_resume()
2182 ioc->add_sge = &mpt_add_sge_64bit_1078; in mpt_resume()
2184 ioc->add_sge = &mpt_add_sge_64bit; in mpt_resume()
2185 ioc->add_chain = &mpt_add_chain_64bit; in mpt_resume()
2186 ioc->sg_addr_size = 8; in mpt_resume()
2189 ioc->add_sge = &mpt_add_sge; in mpt_resume()
2190 ioc->add_chain = &mpt_add_chain; in mpt_resume()
2191 ioc->sg_addr_size = 4; in mpt_resume()
2193 ioc->SGE_size = sizeof(u32) + ioc->sg_addr_size; in mpt_resume()
2196 ioc->name, (mpt_GetIocState(ioc, 1) >> MPI_IOC_STATE_SHIFT), in mpt_resume()
2197 CHIPREG_READ32(&ioc->chip->Doorbell)); in mpt_resume()
2206 if (ioc->bus_type == SAS && (pdev->device == in mpt_resume()
2209 if (KickStart(ioc, 1, CAN_SLEEP) < 0) { in mpt_resume()
2211 ioc->name); in mpt_resume()
2217 printk(MYIOC_s_INFO_FMT "Sending mpt_do_ioc_recovery\n", ioc->name); in mpt_resume()
2218 recovery_state = mpt_do_ioc_recovery(ioc, MPT_HOSTEVENT_IOC_BRINGUP, in mpt_resume()
2222 "error:[%x]\n", ioc->name, recovery_state); in mpt_resume()
2225 "pci-resume: success\n", ioc->name); in mpt_resume()
2233 mpt_signal_reset(u8 index, MPT_ADAPTER *ioc, int reset_phase) in mpt_signal_reset() argument
2236 ioc->bus_type != SPI) || in mpt_signal_reset()
2238 ioc->bus_type != FC) || in mpt_signal_reset()
2240 ioc->bus_type != SAS)) in mpt_signal_reset()
2244 return (MptResetHandlers[index])(ioc, reset_phase); in mpt_signal_reset()
2270 mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) in mpt_do_ioc_recovery() argument
2282 printk(MYIOC_s_INFO_FMT "Initiating %s\n", ioc->name, in mpt_do_ioc_recovery()
2286 CHIPREG_WRITE32(&ioc->chip->IntMask, 0xFFFFFFFF); in mpt_do_ioc_recovery()
2287 ioc->active = 0; in mpt_do_ioc_recovery()
2289 if (ioc->alt_ioc) { in mpt_do_ioc_recovery()
2290 if (ioc->alt_ioc->active || in mpt_do_ioc_recovery()
2296 CHIPREG_WRITE32(&ioc->alt_ioc->chip->IntMask, in mpt_do_ioc_recovery()
2298 ioc->alt_ioc->active = 0; in mpt_do_ioc_recovery()
2306 if ((hard_reset_done = MakeIocReady(ioc, hard, sleepFlag)) < 0) { in mpt_do_ioc_recovery()
2309 ioc->name); in mpt_do_ioc_recovery()
2311 if (reset_alt_ioc_active && ioc->alt_ioc) { in mpt_do_ioc_recovery()
2313 dprintk(ioc, printk(MYIOC_s_INFO_FMT in mpt_do_ioc_recovery()
2314 "alt_ioc reply irq re-enabled\n", ioc->alt_ioc->name)); in mpt_do_ioc_recovery()
2315 CHIPREG_WRITE32(&ioc->alt_ioc->chip->IntMask, MPI_HIM_DIM); in mpt_do_ioc_recovery()
2316 ioc->alt_ioc->active = 1; in mpt_do_ioc_recovery()
2321 "NOT READY WARNING!\n", ioc->name); in mpt_do_ioc_recovery()
2330 if (hard_reset_done && reset_alt_ioc_active && ioc->alt_ioc) { in mpt_do_ioc_recovery()
2331 if ((rc = MakeIocReady(ioc->alt_ioc, 0, sleepFlag)) == 0) in mpt_do_ioc_recovery()
2336 ioc->alt_ioc->name); in mpt_do_ioc_recovery()
2341 if ((rc = GetIocFacts(ioc, sleepFlag, reason)) == 0) in mpt_do_ioc_recovery()
2347 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_do_ioc_recovery()
2348 "Retry IocFacts failed rc=%x\n", ioc->name, rc)); in mpt_do_ioc_recovery()
2351 MptDisplayIocCapabilities(ioc); in mpt_do_ioc_recovery()
2355 if ((rc = GetIocFacts(ioc->alt_ioc, sleepFlag, reason)) != 0) { in mpt_do_ioc_recovery()
2356 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_do_ioc_recovery()
2358 ioc->name, rc)); in mpt_do_ioc_recovery()
2361 rc = GetIocFacts(ioc->alt_ioc, sleepFlag, reason); in mpt_do_ioc_recovery()
2364 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_do_ioc_recovery()
2365 "Retry Alt IocFacts failed rc=%x\n", ioc->name, rc)); in mpt_do_ioc_recovery()
2369 MptDisplayIocCapabilities(ioc->alt_ioc); in mpt_do_ioc_recovery()
2374 (ioc->facts.Flags & MPI_IOCFACTS_FLAGS_FW_DOWNLOAD_BOOT)) { in mpt_do_ioc_recovery()
2375 pci_release_selected_regions(ioc->pcidev, ioc->bars); in mpt_do_ioc_recovery()
2376 ioc->bars = pci_select_bars(ioc->pcidev, IORESOURCE_MEM | in mpt_do_ioc_recovery()
2378 if (pci_enable_device(ioc->pcidev)) in mpt_do_ioc_recovery()
2380 if (pci_request_selected_regions(ioc->pcidev, ioc->bars, in mpt_do_ioc_recovery()
2391 ioc->pci_irq = -1; in mpt_do_ioc_recovery()
2392 if (ioc->pcidev->irq) { in mpt_do_ioc_recovery()
2393 if (ioc->msi_enable && !pci_enable_msi(ioc->pcidev)) in mpt_do_ioc_recovery()
2395 ioc->name); in mpt_do_ioc_recovery()
2397 ioc->msi_enable = 0; in mpt_do_ioc_recovery()
2398 rc = request_irq(ioc->pcidev->irq, mpt_interrupt, in mpt_do_ioc_recovery()
2399 IRQF_SHARED, ioc->name, ioc); in mpt_do_ioc_recovery()
2403 ioc->name, ioc->pcidev->irq); in mpt_do_ioc_recovery()
2404 if (ioc->msi_enable) in mpt_do_ioc_recovery()
2405 pci_disable_msi(ioc->pcidev); in mpt_do_ioc_recovery()
2410 ioc->pci_irq = ioc->pcidev->irq; in mpt_do_ioc_recovery()
2411 pci_set_master(ioc->pcidev); /* ?? */ in mpt_do_ioc_recovery()
2412 pci_set_drvdata(ioc->pcidev, ioc); in mpt_do_ioc_recovery()
2413 dinitprintk(ioc, printk(MYIOC_s_INFO_FMT in mpt_do_ioc_recovery()
2414 "installed at interrupt %d\n", ioc->name, in mpt_do_ioc_recovery()
2415 ioc->pcidev->irq)); in mpt_do_ioc_recovery()
2424 dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "PrimeIocFifos\n", in mpt_do_ioc_recovery()
2425 ioc->name)); in mpt_do_ioc_recovery()
2426 if ((ret == 0) && ((rc = PrimeIocFifos(ioc)) != 0)) in mpt_do_ioc_recovery()
2432 dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "SendIocInit\n", in mpt_do_ioc_recovery()
2433 ioc->name)); in mpt_do_ioc_recovery()
2434 if ((ret == 0) && ((rc = SendIocInit(ioc, sleepFlag)) != 0)) in mpt_do_ioc_recovery()
2437 if (alt_ioc_ready && ((rc = PrimeIocFifos(ioc->alt_ioc)) != 0)) { in mpt_do_ioc_recovery()
2440 ioc->alt_ioc->name, rc); in mpt_do_ioc_recovery()
2446 if ((rc = SendIocInit(ioc->alt_ioc, sleepFlag)) != 0) { in mpt_do_ioc_recovery()
2451 ioc->alt_ioc->name, rc); in mpt_do_ioc_recovery()
2456 if (ioc->upload_fw) { in mpt_do_ioc_recovery()
2457 ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_do_ioc_recovery()
2458 "firmware upload required!\n", ioc->name)); in mpt_do_ioc_recovery()
2463 rc = mpt_do_upload(ioc, sleepFlag); in mpt_do_ioc_recovery()
2465 if (ioc->alt_ioc && ioc->alt_ioc->cached_fw) { in mpt_do_ioc_recovery()
2473 ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_do_ioc_recovery()
2475 ioc->name, ioc->alt_ioc->name, ioc->alt_ioc->cached_fw)); in mpt_do_ioc_recovery()
2476 ioc->cached_fw = NULL; in mpt_do_ioc_recovery()
2480 "firmware upload failure!\n", ioc->name); in mpt_do_ioc_recovery()
2490 if ((ret == 0) && (!ioc->facts.EventState)) { in mpt_do_ioc_recovery()
2491 dinitprintk(ioc, printk(MYIOC_s_INFO_FMT in mpt_do_ioc_recovery()
2493 ioc->name)); in mpt_do_ioc_recovery()
2494 ret = SendEventNotification(ioc, 1, sleepFlag); /* 1=Enable */ in mpt_do_ioc_recovery()
2497 if (ioc->alt_ioc && alt_ioc_ready && !ioc->alt_ioc->facts.EventState) in mpt_do_ioc_recovery()
2498 rc = SendEventNotification(ioc->alt_ioc, 1, sleepFlag); in mpt_do_ioc_recovery()
2502 CHIPREG_WRITE32(&ioc->chip->IntMask, MPI_HIM_DIM); in mpt_do_ioc_recovery()
2503 ioc->active = 1; in mpt_do_ioc_recovery()
2506 if (reset_alt_ioc_active && ioc->alt_ioc) { in mpt_do_ioc_recovery()
2508 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "alt-ioc" in mpt_do_ioc_recovery()
2510 ioc->alt_ioc->name)); in mpt_do_ioc_recovery()
2511 CHIPREG_WRITE32(&ioc->alt_ioc->chip->IntMask, in mpt_do_ioc_recovery()
2513 ioc->alt_ioc->active = 1; in mpt_do_ioc_recovery()
2529 mutex_init(&ioc->raid_data.inactive_list_mutex); in mpt_do_ioc_recovery()
2530 INIT_LIST_HEAD(&ioc->raid_data.inactive_list); in mpt_do_ioc_recovery()
2532 switch (ioc->bus_type) { in mpt_do_ioc_recovery()
2536 if(ioc->facts.IOCExceptions & in mpt_do_ioc_recovery()
2538 ret = mptbase_sas_persist_operation(ioc, in mpt_do_ioc_recovery()
2546 mpt_findImVolumes(ioc); in mpt_do_ioc_recovery()
2550 mpt_read_ioc_pg_1(ioc); in mpt_do_ioc_recovery()
2555 if ((ioc->pfacts[0].ProtocolFlags & in mpt_do_ioc_recovery()
2557 (ioc->lan_cnfg_page0.Header.PageLength == 0)) { in mpt_do_ioc_recovery()
2562 (void) GetLanConfigPages(ioc); in mpt_do_ioc_recovery()
2563 a = (u8*)&ioc->lan_cnfg_page1.HardwareAddressLow; in mpt_do_ioc_recovery()
2564 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_do_ioc_recovery()
2567 ioc->name, a[5], a[4], in mpt_do_ioc_recovery()
2575 mpt_GetScsiPortSettings(ioc, 0); in mpt_do_ioc_recovery()
2579 mpt_readScsiDevicePageHeaders(ioc, 0); in mpt_do_ioc_recovery()
2583 if (ioc->facts.MsgVersion >= MPI_VERSION_01_02) in mpt_do_ioc_recovery()
2584 mpt_findImVolumes(ioc); in mpt_do_ioc_recovery()
2588 mpt_read_ioc_pg_1(ioc); in mpt_do_ioc_recovery()
2590 mpt_read_ioc_pg_4(ioc); in mpt_do_ioc_recovery()
2595 GetIoUnitPage2(ioc); in mpt_do_ioc_recovery()
2596 mpt_get_manufacturing_pg_0(ioc); in mpt_do_ioc_recovery()
2601 free_irq(ioc->pci_irq, ioc); in mpt_do_ioc_recovery()
2602 if (ioc->msi_enable) in mpt_do_ioc_recovery()
2603 pci_disable_msi(ioc->pcidev); in mpt_do_ioc_recovery()
2622 mpt_detect_bound_ports(MPT_ADAPTER *ioc, struct pci_dev *pdev) in mpt_detect_bound_ports() argument
2629 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PCI device %s devfn=%x/%x," in mpt_detect_bound_ports()
2631 ioc->name, pci_name(pdev), pdev->bus->number, in mpt_detect_bound_ports()
2645 if (ioc->alt_ioc != NULL) { in mpt_detect_bound_ports()
2648 ioc->name, ioc->name, ioc->alt_ioc->name); in mpt_detect_bound_ports()
2657 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_detect_bound_ports()
2659 ioc->name, ioc->name, ioc_srch->name)); in mpt_detect_bound_ports()
2660 ioc_srch->alt_ioc = ioc; in mpt_detect_bound_ports()
2661 ioc->alt_ioc = ioc_srch; in mpt_detect_bound_ports()
2673 mpt_adapter_disable(MPT_ADAPTER *ioc) in mpt_adapter_disable() argument
2678 if (ioc->cached_fw != NULL) { in mpt_adapter_disable()
2679 ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_adapter_disable()
2680 "%s: Pushing FW onto adapter\n", __func__, ioc->name)); in mpt_adapter_disable()
2681 if ((ret = mpt_downloadboot(ioc, (MpiFwHeader_t *) in mpt_adapter_disable()
2682 ioc->cached_fw, CAN_SLEEP)) < 0) { in mpt_adapter_disable()
2685 ioc->name, ret); in mpt_adapter_disable()
2692 if (mpt_GetIocState(ioc, 1) != MPI_IOC_STATE_READY) { in mpt_adapter_disable()
2693 if (!SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, in mpt_adapter_disable()
2695 if (mpt_GetIocState(ioc, 1) != MPI_IOC_STATE_READY) in mpt_adapter_disable()
2698 ioc->name, __func__); in mpt_adapter_disable()
2701 "failed!\n", ioc->name, __func__); in mpt_adapter_disable()
2706 synchronize_irq(ioc->pcidev->irq); in mpt_adapter_disable()
2707 CHIPREG_WRITE32(&ioc->chip->IntMask, 0xFFFFFFFF); in mpt_adapter_disable()
2708 ioc->active = 0; in mpt_adapter_disable()
2711 CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); in mpt_adapter_disable()
2712 CHIPREG_READ32(&ioc->chip->IntStatus); in mpt_adapter_disable()
2714 if (ioc->alloc != NULL) { in mpt_adapter_disable()
2715 sz = ioc->alloc_sz; in mpt_adapter_disable()
2716 dexitprintk(ioc, printk(MYIOC_s_INFO_FMT "free @ %p, sz=%d bytes\n", in mpt_adapter_disable()
2717 ioc->name, ioc->alloc, ioc->alloc_sz)); in mpt_adapter_disable()
2718 pci_free_consistent(ioc->pcidev, sz, in mpt_adapter_disable()
2719 ioc->alloc, ioc->alloc_dma); in mpt_adapter_disable()
2720 ioc->reply_frames = NULL; in mpt_adapter_disable()
2721 ioc->req_frames = NULL; in mpt_adapter_disable()
2722 ioc->alloc = NULL; in mpt_adapter_disable()
2723 ioc->alloc_total -= sz; in mpt_adapter_disable()
2726 if (ioc->sense_buf_pool != NULL) { in mpt_adapter_disable()
2727 sz = (ioc->req_depth * MPT_SENSE_BUFFER_ALLOC); in mpt_adapter_disable()
2728 pci_free_consistent(ioc->pcidev, sz, in mpt_adapter_disable()
2729 ioc->sense_buf_pool, ioc->sense_buf_pool_dma); in mpt_adapter_disable()
2730 ioc->sense_buf_pool = NULL; in mpt_adapter_disable()
2731 ioc->alloc_total -= sz; in mpt_adapter_disable()
2734 if (ioc->events != NULL){ in mpt_adapter_disable()
2736 kfree(ioc->events); in mpt_adapter_disable()
2737 ioc->events = NULL; in mpt_adapter_disable()
2738 ioc->alloc_total -= sz; in mpt_adapter_disable()
2741 mpt_free_fw_memory(ioc); in mpt_adapter_disable()
2743 kfree(ioc->spi_data.nvram); in mpt_adapter_disable()
2744 mpt_inactive_raid_list_free(ioc); in mpt_adapter_disable()
2745 kfree(ioc->raid_data.pIocPg2); in mpt_adapter_disable()
2746 kfree(ioc->raid_data.pIocPg3); in mpt_adapter_disable()
2747 ioc->spi_data.nvram = NULL; in mpt_adapter_disable()
2748 ioc->raid_data.pIocPg3 = NULL; in mpt_adapter_disable()
2750 if (ioc->spi_data.pIocPg4 != NULL) { in mpt_adapter_disable()
2751 sz = ioc->spi_data.IocPg4Sz; in mpt_adapter_disable()
2752 pci_free_consistent(ioc->pcidev, sz, in mpt_adapter_disable()
2753 ioc->spi_data.pIocPg4, in mpt_adapter_disable()
2754 ioc->spi_data.IocPg4_dma); in mpt_adapter_disable()
2755 ioc->spi_data.pIocPg4 = NULL; in mpt_adapter_disable()
2756 ioc->alloc_total -= sz; in mpt_adapter_disable()
2759 if (ioc->ReqToChain != NULL) { in mpt_adapter_disable()
2760 kfree(ioc->ReqToChain); in mpt_adapter_disable()
2761 kfree(ioc->RequestNB); in mpt_adapter_disable()
2762 ioc->ReqToChain = NULL; in mpt_adapter_disable()
2765 kfree(ioc->ChainToChain); in mpt_adapter_disable()
2766 ioc->ChainToChain = NULL; in mpt_adapter_disable()
2768 if (ioc->HostPageBuffer != NULL) { in mpt_adapter_disable()
2769 if((ret = mpt_host_page_access_control(ioc, in mpt_adapter_disable()
2773 ioc->name, __func__, ret); in mpt_adapter_disable()
2775 dexitprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_adapter_disable()
2777 ioc->name, ioc->HostPageBuffer, in mpt_adapter_disable()
2778 ioc->HostPageBuffer_sz)); in mpt_adapter_disable()
2779 pci_free_consistent(ioc->pcidev, ioc->HostPageBuffer_sz, in mpt_adapter_disable()
2780 ioc->HostPageBuffer, ioc->HostPageBuffer_dma); in mpt_adapter_disable()
2781 ioc->HostPageBuffer = NULL; in mpt_adapter_disable()
2782 ioc->HostPageBuffer_sz = 0; in mpt_adapter_disable()
2783 ioc->alloc_total -= ioc->HostPageBuffer_sz; in mpt_adapter_disable()
2786 pci_set_drvdata(ioc->pcidev, NULL); in mpt_adapter_disable()
2797 mpt_adapter_dispose(MPT_ADAPTER *ioc) in mpt_adapter_dispose() argument
2801 if (ioc == NULL) in mpt_adapter_dispose()
2804 sz_first = ioc->alloc_total; in mpt_adapter_dispose()
2806 mpt_adapter_disable(ioc); in mpt_adapter_dispose()
2808 if (ioc->pci_irq != -1) { in mpt_adapter_dispose()
2809 free_irq(ioc->pci_irq, ioc); in mpt_adapter_dispose()
2810 if (ioc->msi_enable) in mpt_adapter_dispose()
2811 pci_disable_msi(ioc->pcidev); in mpt_adapter_dispose()
2812 ioc->pci_irq = -1; in mpt_adapter_dispose()
2815 if (ioc->memmap != NULL) { in mpt_adapter_dispose()
2816 iounmap(ioc->memmap); in mpt_adapter_dispose()
2817 ioc->memmap = NULL; in mpt_adapter_dispose()
2820 pci_disable_device(ioc->pcidev); in mpt_adapter_dispose()
2821 pci_release_selected_regions(ioc->pcidev, ioc->bars); in mpt_adapter_dispose()
2824 if (ioc->mtrr_reg > 0) { in mpt_adapter_dispose()
2825 mtrr_del(ioc->mtrr_reg, 0, 0); in mpt_adapter_dispose()
2826 dprintk(ioc, printk(MYIOC_s_INFO_FMT "MTRR region de-registered\n", ioc->name)); in mpt_adapter_dispose()
2831 list_del(&ioc->list); in mpt_adapter_dispose()
2833 sz_last = ioc->alloc_total; in mpt_adapter_dispose()
2834 dprintk(ioc, printk(MYIOC_s_INFO_FMT "free'd %d of %d bytes\n", in mpt_adapter_dispose()
2835 ioc->name, sz_first-sz_last+(int)sizeof(*ioc), sz_first)); in mpt_adapter_dispose()
2837 if (ioc->alt_ioc) in mpt_adapter_dispose()
2838 ioc->alt_ioc->alt_ioc = NULL; in mpt_adapter_dispose()
2840 kfree(ioc); in mpt_adapter_dispose()
2849 MptDisplayIocCapabilities(MPT_ADAPTER *ioc) in MptDisplayIocCapabilities() argument
2853 printk(KERN_INFO "%s: ", ioc->name); in MptDisplayIocCapabilities()
2854 if (ioc->prod_name) in MptDisplayIocCapabilities()
2855 printk("%s: ", ioc->prod_name); in MptDisplayIocCapabilities()
2858 if (ioc->pfacts[0].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_INITIATOR) { in MptDisplayIocCapabilities()
2863 if (ioc->pfacts[0].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_TARGET) { in MptDisplayIocCapabilities()
2868 if (ioc->pfacts[0].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_LAN) { in MptDisplayIocCapabilities()
2877 if (ioc->pfacts[0].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_TARGET) { in MptDisplayIocCapabilities()
2902 MakeIocReady(MPT_ADAPTER *ioc, int force, int sleepFlag) in MakeIocReady() argument
2913 ioc_state = mpt_GetIocState(ioc, 0); in MakeIocReady()
2914 dhsprintk(ioc, printk(MYIOC_s_INFO_FMT "MakeIocReady [raw] state=%08x\n", ioc->name, ioc_state)); in MakeIocReady()
2923 ioc->name); in MakeIocReady()
2929 dinitprintk(ioc, printk(MYIOC_s_INFO_FMT in MakeIocReady()
2930 "IOC is in READY state\n", ioc->name)); in MakeIocReady()
2940 ioc->name); in MakeIocReady()
2942 ioc->name, ioc_state & MPI_DOORBELL_DATA_MASK); in MakeIocReady()
2949 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "IOC operational unexpected\n", in MakeIocReady()
2950 ioc->name)); in MakeIocReady()
2958 dinitprintk(ioc, printk(MYIOC_s_INFO_FMT in MakeIocReady()
2960 ioc->name, whoinit, statefault, force)); in MakeIocReady()
2965 if ((r = SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, sleepFlag)) == 0) in MakeIocReady()
2972 hard_reset_done = KickStart(ioc, statefault||force, sleepFlag); in MakeIocReady()
2982 while ((ioc_state = mpt_GetIocState(ioc, 1)) != MPI_IOC_STATE_READY) { in MakeIocReady()
2988 if ((r = SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, sleepFlag)) != 0) { in MakeIocReady()
2989 printk(MYIOC_s_ERR_FMT "IOC msg unit reset failed!\n", ioc->name); in MakeIocReady()
2997 if ((r = SendIocReset(ioc, MPI_FUNCTION_IO_UNIT_RESET, sleepFlag)) != 0) { in MakeIocReady()
2998 printk(MYIOC_s_ERR_FMT "IO unit reset failed!\n", ioc->name); in MakeIocReady()
3007 ioc->name, ioc_state, (int)((ii+5)/HZ)); in MakeIocReady()
3020 printk(MYIOC_s_INFO_FMT "Recovered from %s\n", ioc->name, in MakeIocReady()
3037 mpt_GetIocState(MPT_ADAPTER *ioc, int cooked) in mpt_GetIocState() argument
3042 s = CHIPREG_READ32(&ioc->chip->Doorbell); in mpt_GetIocState()
3046 ioc->last_state = sc; in mpt_GetIocState()
3061 GetIocFacts(MPT_ADAPTER *ioc, int sleepFlag, int reason) in GetIocFacts() argument
3073 if (ioc->last_state == MPI_IOC_STATE_RESET) { in GetIocFacts()
3076 ioc->name, ioc->last_state); in GetIocFacts()
3080 facts = &ioc->facts; in GetIocFacts()
3093 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT in GetIocFacts()
3095 ioc->name, req_sz, reply_sz)); in GetIocFacts()
3100 r = mpt_handshake_req_reply_wait(ioc, req_sz, (u32*)&get_facts, in GetIocFacts()
3118 if (ioc->FirstWhoInit == WHOINIT_UNKNOWN) in GetIocFacts()
3119 ioc->FirstWhoInit = facts->WhoInit; in GetIocFacts()
3151 if ((ioc->facts.ProductID & MPI_FW_HEADER_PID_PROD_MASK) in GetIocFacts()
3153 ioc->ir_firmware = 1; in GetIocFacts()
3179 ioc->name); in GetIocFacts()
3185 ioc->NB_for_64_byte_frame = vv; in GetIocFacts()
3191 ioc->NBShiftFactor = shiftFactor; in GetIocFacts()
3192 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT in GetIocFacts()
3194 ioc->name, vv, shiftFactor, r)); in GetIocFacts()
3201 ioc->req_sz = min(MPT_DEFAULT_FRAME_SIZE, facts->RequestFrameSize * 4); in GetIocFacts()
3202 ioc->req_depth = min_t(int, MPT_MAX_REQ_DEPTH, facts->GlobalCredits); in GetIocFacts()
3203 ioc->reply_sz = MPT_REPLY_FRAME_SIZE; in GetIocFacts()
3204 ioc->reply_depth = min_t(int, MPT_DEFAULT_REPLY_DEPTH, facts->ReplyQueueDepth); in GetIocFacts()
3206 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "reply_sz=%3d, reply_depth=%4d\n", in GetIocFacts()
3207 ioc->name, ioc->reply_sz, ioc->reply_depth)); in GetIocFacts()
3208 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "req_sz =%3d, req_depth =%4d\n", in GetIocFacts()
3209 ioc->name, ioc->req_sz, ioc->req_depth)); in GetIocFacts()
3212 if ( (r = GetPortFacts(ioc, 0, sleepFlag)) != 0 ) in GetIocFacts()
3218 ioc->name, facts->MsgLength, (offsetof(IOCFactsReply_t, in GetIocFacts()
3236 GetPortFacts(MPT_ADAPTER *ioc, int portnum, int sleepFlag) in GetPortFacts() argument
3246 if (ioc->last_state == MPI_IOC_STATE_RESET) { in GetPortFacts()
3248 ioc->name, ioc->last_state ); in GetPortFacts()
3252 pfacts = &ioc->pfacts[portnum]; in GetPortFacts()
3266 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending get PortFacts(%d) request\n", in GetPortFacts()
3267 ioc->name, portnum)); in GetPortFacts()
3272 ii = mpt_handshake_req_reply_wait(ioc, req_sz, (u32*)&get_pfacts, in GetPortFacts()
3290 max_id = (ioc->bus_type == SAS) ? pfacts->PortSCSIID : in GetPortFacts()
3292 ioc->devices_per_bus = (max_id > 255) ? 256 : max_id; in GetPortFacts()
3293 ioc->number_of_buses = (ioc->devices_per_bus < 256) ? 1 : max_id/256; in GetPortFacts()
3301 ioc->devices_per_bus = 1; in GetPortFacts()
3302 ioc->number_of_buses = (max_id > 255) ? 255 : max_id; in GetPortFacts()
3319 SendIocInit(MPT_ADAPTER *ioc, int sleepFlag) in SendIocInit() argument
3338 if (ioc->facts.Flags & MPI_IOCFACTS_FLAGS_FW_DOWNLOAD_BOOT) in SendIocInit()
3339 ioc->upload_fw = 1; in SendIocInit()
3341 ioc->upload_fw = 0; in SendIocInit()
3342 ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "upload_fw %d facts.Flags=%x\n", in SendIocInit()
3343 ioc->name, ioc->upload_fw, ioc->facts.Flags)); in SendIocInit()
3345 ioc_init.MaxDevices = (U8)ioc->devices_per_bus; in SendIocInit()
3346 ioc_init.MaxBuses = (U8)ioc->number_of_buses; in SendIocInit()
3348 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "facts.MsgVersion=%x\n", in SendIocInit()
3349 ioc->name, ioc->facts.MsgVersion)); in SendIocInit()
3350 if (ioc->facts.MsgVersion >= MPI_VERSION_01_05) { in SendIocInit()
3355 if (ioc->facts.Flags & MPI_IOCFACTS_FLAGS_HOST_PAGE_BUFFER_PERSISTENT) { in SendIocInit()
3356 ioc_init.HostPageBufferSGE = ioc->facts.HostPageBufferSGE; in SendIocInit()
3357 } else if(mpt_host_page_alloc(ioc, &ioc_init)) in SendIocInit()
3360 ioc_init.ReplyFrameSize = cpu_to_le16(ioc->reply_sz); /* in BYTES */ in SendIocInit()
3362 if (ioc->sg_addr_size == sizeof(u64)) { in SendIocInit()
3366 ioc_init.HostMfaHighAddr = cpu_to_le32((u32)((u64)ioc->alloc_dma >> 32)); in SendIocInit()
3367 ioc_init.SenseBufferHighAddr = cpu_to_le32((u32)((u64)ioc->sense_buf_pool_dma >> 32)); in SendIocInit()
3374 ioc->facts.CurrentHostMfaHighAddr = ioc_init.HostMfaHighAddr; in SendIocInit()
3375 ioc->facts.CurrentSenseBufferHighAddr = ioc_init.SenseBufferHighAddr; in SendIocInit()
3376 ioc->facts.MaxDevices = ioc_init.MaxDevices; in SendIocInit()
3377 ioc->facts.MaxBuses = ioc_init.MaxBuses; in SendIocInit()
3379 dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending IOCInit (req @ %p)\n", in SendIocInit()
3380 ioc->name, &ioc_init)); in SendIocInit()
3382 r = mpt_handshake_req_reply_wait(ioc, sizeof(IOCInit_t), (u32*)&ioc_init, in SendIocInit()
3385 printk(MYIOC_s_ERR_FMT "Sending IOCInit failed(%d)!\n",ioc->name, r); in SendIocInit()
3393 dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending PortEnable (req @ %p)\n", in SendIocInit()
3394 ioc->name, &ioc_init)); in SendIocInit()
3396 if ((r = SendPortEnable(ioc, 0, sleepFlag)) != 0) { in SendIocInit()
3397 printk(MYIOC_s_ERR_FMT "Sending PortEnable failed(%d)!\n",ioc->name, r); in SendIocInit()
3407 state = mpt_GetIocState(ioc, 1); in SendIocInit()
3417 ioc->name, (int)((count+5)/HZ)); in SendIocInit()
3421 state = mpt_GetIocState(ioc, 1); in SendIocInit()
3424 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Wait IOC_OPERATIONAL state (cnt=%d)\n", in SendIocInit()
3425 ioc->name, count)); in SendIocInit()
3427 ioc->aen_event_read_flag=0; in SendIocInit()
3443 SendPortEnable(MPT_ADAPTER *ioc, int portnum, int sleepFlag) in SendPortEnable() argument
3464 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending Port(%d)Enable (req @ %p)\n", in SendPortEnable()
3465 ioc->name, portnum, &port_enable)); in SendPortEnable()
3469 if (ioc->ir_firmware || ioc->bus_type == SAS) { in SendPortEnable()
3470 rc = mpt_handshake_req_reply_wait(ioc, req_sz, in SendPortEnable()
3474 rc = mpt_handshake_req_reply_wait(ioc, req_sz, in SendPortEnable()
3492 mpt_alloc_fw_memory(MPT_ADAPTER *ioc, int size) in mpt_alloc_fw_memory() argument
3496 if (ioc->cached_fw) { in mpt_alloc_fw_memory()
3500 else if (ioc->alt_ioc && ioc->alt_ioc->cached_fw) { in mpt_alloc_fw_memory()
3501 ioc->cached_fw = ioc->alt_ioc->cached_fw; /* use alt_ioc's memory */ in mpt_alloc_fw_memory()
3502 ioc->cached_fw_dma = ioc->alt_ioc->cached_fw_dma; in mpt_alloc_fw_memory()
3506 ioc->cached_fw = pci_alloc_consistent(ioc->pcidev, size, &ioc->cached_fw_dma); in mpt_alloc_fw_memory()
3507 if (!ioc->cached_fw) { in mpt_alloc_fw_memory()
3509 ioc->name); in mpt_alloc_fw_memory()
3512 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "FW Image @ %p[%p], sz=%d[%x] bytes\n", in mpt_alloc_fw_memory()
3513 ioc->name, ioc->cached_fw, (void *)(ulong)ioc->cached_fw_dma, size, size)); in mpt_alloc_fw_memory()
3514 ioc->alloc_total += size; in mpt_alloc_fw_memory()
3529 mpt_free_fw_memory(MPT_ADAPTER *ioc) in mpt_free_fw_memory() argument
3533 if (!ioc->cached_fw) in mpt_free_fw_memory()
3536 sz = ioc->facts.FWImageSize; in mpt_free_fw_memory()
3537 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "free_fw_memory: FW Image @ %p[%p], sz=%d[%x] bytes\n", in mpt_free_fw_memory()
3538 ioc->name, ioc->cached_fw, (void *)(ulong)ioc->cached_fw_dma, sz, sz)); in mpt_free_fw_memory()
3539 pci_free_consistent(ioc->pcidev, sz, ioc->cached_fw, ioc->cached_fw_dma); in mpt_free_fw_memory()
3540 ioc->alloc_total -= sz; in mpt_free_fw_memory()
3541 ioc->cached_fw = NULL; in mpt_free_fw_memory()
3559 mpt_do_upload(MPT_ADAPTER *ioc, int sleepFlag) in mpt_do_upload() argument
3571 if ((sz = ioc->facts.FWImageSize) == 0) in mpt_do_upload()
3574 if (mpt_alloc_fw_memory(ioc, ioc->facts.FWImageSize) != 0) in mpt_do_upload()
3577 dinitprintk(ioc, printk(MYIOC_s_INFO_FMT ": FW Image @ %p[%p], sz=%d[%x] bytes\n", in mpt_do_upload()
3578 ioc->name, ioc->cached_fw, (void *)(ulong)ioc->cached_fw_dma, sz, sz)); in mpt_do_upload()
3580 prequest = (sleepFlag == NO_SLEEP) ? kzalloc(ioc->req_sz, GFP_ATOMIC) : in mpt_do_upload()
3581 kzalloc(ioc->req_sz, GFP_KERNEL); in mpt_do_upload()
3583 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "fw upload failed " in mpt_do_upload()
3584 "while allocating memory \n", ioc->name)); in mpt_do_upload()
3585 mpt_free_fw_memory(ioc); in mpt_do_upload()
3604 ioc->add_sge((char *)ptcsge, flagsLength, ioc->cached_fw_dma); in mpt_do_upload()
3606 ioc->SGE_size; in mpt_do_upload()
3607 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending FW Upload " in mpt_do_upload()
3608 " (req @ %p) fw_size=%d mf_request_size=%d\n", ioc->name, prequest, in mpt_do_upload()
3609 ioc->facts.FWImageSize, request_size)); in mpt_do_upload()
3610 DBG_DUMP_FW_REQUEST_FRAME(ioc, (u32 *)prequest); in mpt_do_upload()
3612 ii = mpt_handshake_req_reply_wait(ioc, request_size, (u32 *)prequest, in mpt_do_upload()
3615 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "FW Upload completed " in mpt_do_upload()
3616 "rc=%x \n", ioc->name, ii)); in mpt_do_upload()
3627 ioc->facts.FWImageSize == in mpt_do_upload()
3631 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": do_upload cmdStatus=%d \n", in mpt_do_upload()
3632 ioc->name, cmdStatus)); in mpt_do_upload()
3636 ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "fw upload failed, " in mpt_do_upload()
3637 "freeing image \n", ioc->name)); in mpt_do_upload()
3638 mpt_free_fw_memory(ioc); in mpt_do_upload()
3660 mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag) in mpt_downloadboot() argument
3672 ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "downloadboot: fw size 0x%x (%d), FW Ptr %p\n", in mpt_downloadboot()
3673 ioc->name, pFwHeader->ImageSize, pFwHeader->ImageSize, pFwHeader)); in mpt_downloadboot()
3675 CHIPREG_WRITE32(&ioc->chip->WriteSequence, 0xFF); in mpt_downloadboot()
3676 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_1ST_KEY_VALUE); in mpt_downloadboot()
3677 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_2ND_KEY_VALUE); in mpt_downloadboot()
3678 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_3RD_KEY_VALUE); in mpt_downloadboot()
3679 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_4TH_KEY_VALUE); in mpt_downloadboot()
3680 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_5TH_KEY_VALUE); in mpt_downloadboot()
3682 CHIPREG_WRITE32(&ioc->chip->Diagnostic, (MPI_DIAG_PREVENT_IOC_BOOT | MPI_DIAG_DISABLE_ARM)); in mpt_downloadboot()
3691 diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic); in mpt_downloadboot()
3692 CHIPREG_WRITE32(&ioc->chip->Diagnostic, diag0val | MPI_DIAG_RESET_ADAPTER); in mpt_downloadboot()
3695 diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic); in mpt_downloadboot()
3697 ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "RESET_ADAPTER cleared, count=%d\n", in mpt_downloadboot()
3698 ioc->name, count)); in mpt_downloadboot()
3710 ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "downloadboot failed! " in mpt_downloadboot()
3712 ioc->name, diag0val)); in mpt_downloadboot()
3716 CHIPREG_WRITE32(&ioc->chip->WriteSequence, 0xFF); in mpt_downloadboot()
3717 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_1ST_KEY_VALUE); in mpt_downloadboot()
3718 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_2ND_KEY_VALUE); in mpt_downloadboot()
3719 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_3RD_KEY_VALUE); in mpt_downloadboot()
3720 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_4TH_KEY_VALUE); in mpt_downloadboot()
3721 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_5TH_KEY_VALUE); in mpt_downloadboot()
3724 CHIPREG_WRITE32(&ioc->chip->Diagnostic, (MPI_DIAG_RW_ENABLE | MPI_DIAG_DISABLE_ARM)); in mpt_downloadboot()
3732 if (ioc->errata_flag_1064) in mpt_downloadboot()
3733 pci_enable_io_access(ioc->pcidev); in mpt_downloadboot()
3735 CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwAddress, pFwHeader->LoadStartAddress); in mpt_downloadboot()
3736 ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "LoadStart addr written 0x%x \n", in mpt_downloadboot()
3737 ioc->name, pFwHeader->LoadStartAddress)); in mpt_downloadboot()
3739 ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Write FW Image: 0x%x bytes @ %p\n", in mpt_downloadboot()
3740 ioc->name, fwSize*4, ptrFw)); in mpt_downloadboot()
3742 CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwData, *ptrFw++); in mpt_downloadboot()
3754 ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Write Ext Image: 0x%x (%d) bytes @ %p load_addr=%x\n", in mpt_downloadboot()
3755 ioc->name, fwSize*4, fwSize*4, ptrFw, load_addr)); in mpt_downloadboot()
3756 CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwAddress, load_addr); in mpt_downloadboot()
3759 CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwData, *ptrFw++); in mpt_downloadboot()
3765 …ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Write IopResetVector Addr=%x! \n", ioc->name, pFwHeader-… in mpt_downloadboot()
3766 CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwAddress, pFwHeader->IopResetRegAddr); in mpt_downloadboot()
3769 …ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Write IopResetVector Value=%x! \n", ioc->name, pFwHeader-… in mpt_downloadboot()
3770 CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwData, pFwHeader->IopResetVectorValue); in mpt_downloadboot()
3775 if (ioc->bus_type == SPI) { in mpt_downloadboot()
3780 CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwAddress, 0x3F000000); in mpt_downloadboot()
3781 diagRwData = CHIPREG_PIO_READ32(&ioc->pio_chip->DiagRwData); in mpt_downloadboot()
3783 CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwAddress, 0x3F000000); in mpt_downloadboot()
3784 CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwData, diagRwData); in mpt_downloadboot()
3787 diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic); in mpt_downloadboot()
3788 CHIPREG_WRITE32(&ioc->chip->Diagnostic, diag0val | in mpt_downloadboot()
3799 if (ioc->errata_flag_1064) in mpt_downloadboot()
3800 pci_disable_io_access(ioc->pcidev); in mpt_downloadboot()
3802 diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic); in mpt_downloadboot()
3803 ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "downloadboot diag0val=%x, " in mpt_downloadboot()
3805 ioc->name, diag0val)); in mpt_downloadboot()
3807 ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "downloadboot now diag0val=%x\n", in mpt_downloadboot()
3808 ioc->name, diag0val)); in mpt_downloadboot()
3809 CHIPREG_WRITE32(&ioc->chip->Diagnostic, diag0val); in mpt_downloadboot()
3812 CHIPREG_WRITE32(&ioc->chip->WriteSequence, 0xFF); in mpt_downloadboot()
3814 if (ioc->bus_type == SAS) { in mpt_downloadboot()
3815 ioc_state = mpt_GetIocState(ioc, 0); in mpt_downloadboot()
3816 if ( (GetIocFacts(ioc, sleepFlag, in mpt_downloadboot()
3818 ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "GetIocFacts failed: IocState=%x\n", in mpt_downloadboot()
3819 ioc->name, ioc_state)); in mpt_downloadboot()
3825 if ((ioc_state = mpt_GetIocState(ioc, 0)) & MPI_IOC_STATE_READY) { in mpt_downloadboot()
3826 ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_downloadboot()
3828 ioc->name, count, ioc_state)); in mpt_downloadboot()
3829 if (ioc->bus_type == SAS) { in mpt_downloadboot()
3832 if ((SendIocInit(ioc, sleepFlag)) != 0) { in mpt_downloadboot()
3833 ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_downloadboot()
3835 ioc->name)); in mpt_downloadboot()
3838 ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_downloadboot()
3840 ioc->name)); in mpt_downloadboot()
3849 ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_downloadboot()
3850 "downloadboot failed! IocState=%x\n",ioc->name, ioc_state)); in mpt_downloadboot()
3881 KickStart(MPT_ADAPTER *ioc, int force, int sleepFlag) in KickStart() argument
3887 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "KickStarting!\n", ioc->name)); in KickStart()
3888 if (ioc->bus_type == SPI) { in KickStart()
3892 SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, sleepFlag); in KickStart()
3901 hard_reset_done = mpt_diag_reset(ioc, force, sleepFlag); in KickStart()
3905 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Diagnostic reset successful!\n", in KickStart()
3906 ioc->name)); in KickStart()
3910 ioc_state = mpt_GetIocState(ioc, 1); in KickStart()
3912 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "KickStart successful! (cnt=%d)\n", in KickStart()
3913 ioc->name, cnt)); in KickStart()
3923 dinitprintk(ioc, printk(MYIOC_s_ERR_FMT "Failed to come READY after reset! IocState=%x\n", in KickStart()
3924 ioc->name, mpt_GetIocState(ioc, 0))); in KickStart()
3948 mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag) in mpt_diag_reset() argument
3959 CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); in mpt_diag_reset()
3961 if (ioc->pcidev->device == MPI_MANUFACTPAGE_DEVID_SAS1078) { in mpt_diag_reset()
3966 drsprintk(ioc, printk(MYIOC_s_WARN_FMT "%s: Doorbell=%p; 1078 reset " in mpt_diag_reset()
3967 "address=%p\n", ioc->name, __func__, in mpt_diag_reset()
3968 &ioc->chip->Doorbell, &ioc->chip->Reset_1078)); in mpt_diag_reset()
3969 CHIPREG_WRITE32(&ioc->chip->Reset_1078, 0x07); in mpt_diag_reset()
3983 (*(MptResetHandlers[cb_idx]))(ioc, in mpt_diag_reset()
3988 doorbell = CHIPREG_READ32(&ioc->chip->Doorbell); in mpt_diag_reset()
3991 drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_diag_reset()
3994 ioc->name, doorbell, count)); in mpt_diag_reset()
4010 diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic); in mpt_diag_reset()
4012 if (ioc->debug_level & MPT_DEBUG) { in mpt_diag_reset()
4013 if (ioc->alt_ioc) in mpt_diag_reset()
4014 diag1val = CHIPREG_READ32(&ioc->alt_ioc->chip->Diagnostic); in mpt_diag_reset()
4015 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "DbG1: diag0=%08x, diag1=%08x\n", in mpt_diag_reset()
4016 ioc->name, diag0val, diag1val)); in mpt_diag_reset()
4027 CHIPREG_WRITE32(&ioc->chip->WriteSequence, 0xFF); in mpt_diag_reset()
4028 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_1ST_KEY_VALUE); in mpt_diag_reset()
4029 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_2ND_KEY_VALUE); in mpt_diag_reset()
4030 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_3RD_KEY_VALUE); in mpt_diag_reset()
4031 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_4TH_KEY_VALUE); in mpt_diag_reset()
4032 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_5TH_KEY_VALUE); in mpt_diag_reset()
4044 ioc->name, diag0val); in mpt_diag_reset()
4049 diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic); in mpt_diag_reset()
4051 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Wrote magic DiagWriteEn sequence (%x)\n", in mpt_diag_reset()
4052 ioc->name, diag0val)); in mpt_diag_reset()
4055 if (ioc->debug_level & MPT_DEBUG) { in mpt_diag_reset()
4056 if (ioc->alt_ioc) in mpt_diag_reset()
4057 diag1val = CHIPREG_READ32(&ioc->alt_ioc->chip->Diagnostic); in mpt_diag_reset()
4058 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "DbG2: diag0=%08x, diag1=%08x\n", in mpt_diag_reset()
4059 ioc->name, diag0val, diag1val)); in mpt_diag_reset()
4065 CHIPREG_WRITE32(&ioc->chip->Diagnostic, diag0val | MPI_DIAG_DISABLE_ARM); in mpt_diag_reset()
4072 CHIPREG_WRITE32(&ioc->chip->Diagnostic, diag0val | MPI_DIAG_RESET_ADAPTER); in mpt_diag_reset()
4074 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Diagnostic reset performed\n", in mpt_diag_reset()
4075 ioc->name)); in mpt_diag_reset()
4086 ioc, MPT_IOC_PRE_RESET); in mpt_diag_reset()
4087 if (ioc->alt_ioc) { in mpt_diag_reset()
4089 ioc->alt_ioc, MPT_IOC_PRE_RESET); in mpt_diag_reset()
4094 if (ioc->cached_fw) in mpt_diag_reset()
4095 cached_fw = (MpiFwHeader_t *)ioc->cached_fw; in mpt_diag_reset()
4096 else if (ioc->alt_ioc && ioc->alt_ioc->cached_fw) in mpt_diag_reset()
4097 cached_fw = (MpiFwHeader_t *)ioc->alt_ioc->cached_fw; in mpt_diag_reset()
4106 diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic); in mpt_diag_reset()
4111 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "cached_fw: diag0val=%x count=%d\n", in mpt_diag_reset()
4112 ioc->name, diag0val, count)); in mpt_diag_reset()
4120 if ((count = mpt_downloadboot(ioc, cached_fw, sleepFlag)) < 0) { in mpt_diag_reset()
4122 "firmware downloadboot failure (%d)!\n", ioc->name, count); in mpt_diag_reset()
4133 doorbell = CHIPREG_READ32(&ioc->chip->Doorbell); in mpt_diag_reset()
4136 drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_diag_reset()
4138 " count=%d\n", ioc->name, doorbell, count)); in mpt_diag_reset()
4154 "after reset! IocState=%x", ioc->name, in mpt_diag_reset()
4159 diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic); in mpt_diag_reset()
4160 if (ioc->debug_level & MPT_DEBUG) { in mpt_diag_reset()
4161 if (ioc->alt_ioc) in mpt_diag_reset()
4162 diag1val = CHIPREG_READ32(&ioc->alt_ioc->chip->Diagnostic); in mpt_diag_reset()
4163 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "DbG3: diag0=%08x, diag1=%08x\n", in mpt_diag_reset()
4164 ioc->name, diag0val, diag1val)); in mpt_diag_reset()
4170 diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic); in mpt_diag_reset()
4176 CHIPREG_WRITE32(&ioc->chip->WriteSequence, 0xFF); in mpt_diag_reset()
4177 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_1ST_KEY_VALUE); in mpt_diag_reset()
4178 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_2ND_KEY_VALUE); in mpt_diag_reset()
4179 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_3RD_KEY_VALUE); in mpt_diag_reset()
4180 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_4TH_KEY_VALUE); in mpt_diag_reset()
4181 CHIPREG_WRITE32(&ioc->chip->WriteSequence, MPI_WRSEQ_5TH_KEY_VALUE); in mpt_diag_reset()
4193 ioc->name, diag0val); in mpt_diag_reset()
4196 diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic); in mpt_diag_reset()
4199 CHIPREG_WRITE32(&ioc->chip->Diagnostic, diag0val); in mpt_diag_reset()
4200 diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic); in mpt_diag_reset()
4203 ioc->name); in mpt_diag_reset()
4208 CHIPREG_WRITE32(&ioc->chip->WriteSequence, 0xFFFFFFFF); in mpt_diag_reset()
4212 diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic); in mpt_diag_reset()
4215 ioc->name, diag0val); in mpt_diag_reset()
4219 if (ioc->debug_level & MPT_DEBUG) { in mpt_diag_reset()
4220 if (ioc->alt_ioc) in mpt_diag_reset()
4221 diag1val = CHIPREG_READ32(&ioc->alt_ioc->chip->Diagnostic); in mpt_diag_reset()
4222 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "DbG4: diag0=%08x, diag1=%08x\n", in mpt_diag_reset()
4223 ioc->name, diag0val, diag1val)); in mpt_diag_reset()
4229 ioc->facts.EventState = 0; in mpt_diag_reset()
4231 if (ioc->alt_ioc) in mpt_diag_reset()
4232 ioc->alt_ioc->facts.EventState = 0; in mpt_diag_reset()
4250 SendIocReset(MPT_ADAPTER *ioc, u8 reset_type, int sleepFlag) in SendIocReset() argument
4256 drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending IOC reset(0x%02x)!\n", in SendIocReset()
4257 ioc->name, reset_type)); in SendIocReset()
4258 CHIPREG_WRITE32(&ioc->chip->Doorbell, reset_type<<MPI_DOORBELL_FUNCTION_SHIFT); in SendIocReset()
4259 if ((r = WaitForDoorbellAck(ioc, 5, sleepFlag)) < 0) in SendIocReset()
4267 while ((state = mpt_GetIocState(ioc, 1)) != MPI_IOC_STATE_READY) { in SendIocReset()
4276 ioc->name, state, (int)((count+5)/HZ)); in SendIocReset()
4291 if (ioc->facts.Function) in SendIocReset()
4292 ioc->facts.EventState = 0; in SendIocReset()
4306 initChainBuffers(MPT_ADAPTER *ioc) in initChainBuffers() argument
4315 if (ioc->ReqToChain == NULL) { in initChainBuffers()
4316 sz = ioc->req_depth * sizeof(int); in initChainBuffers()
4321 ioc->ReqToChain = (int *) mem; in initChainBuffers()
4322 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ReqToChain alloc @ %p, sz=%d bytes\n", in initChainBuffers()
4323 ioc->name, mem, sz)); in initChainBuffers()
4328 ioc->RequestNB = (int *) mem; in initChainBuffers()
4329 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "RequestNB alloc @ %p, sz=%d bytes\n", in initChainBuffers()
4330 ioc->name, mem, sz)); in initChainBuffers()
4332 for (ii = 0; ii < ioc->req_depth; ii++) { in initChainBuffers()
4333 ioc->ReqToChain[ii] = MPT_HOST_NO_CHAIN; in initChainBuffers()
4346 scale = ioc->req_sz / ioc->SGE_size; in initChainBuffers()
4347 if (ioc->sg_addr_size == sizeof(u64)) in initChainBuffers()
4348 num_sge = scale + (ioc->req_sz - 60) / ioc->SGE_size; in initChainBuffers()
4350 num_sge = 1 + scale + (ioc->req_sz - 64) / ioc->SGE_size; in initChainBuffers()
4352 if (ioc->sg_addr_size == sizeof(u64)) { in initChainBuffers()
4353 numSGE = (scale - 1) * (ioc->facts.MaxChainDepth-1) + scale + in initChainBuffers()
4354 (ioc->req_sz - 60) / ioc->SGE_size; in initChainBuffers()
4356 numSGE = 1 + (scale - 1) * (ioc->facts.MaxChainDepth-1) + in initChainBuffers()
4357 scale + (ioc->req_sz - 64) / ioc->SGE_size; in initChainBuffers()
4359 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "num_sge=%d numSGE=%d\n", in initChainBuffers()
4360 ioc->name, num_sge, numSGE)); in initChainBuffers()
4362 if (ioc->bus_type == FC) { in initChainBuffers()
4377 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Now numSGE=%d num_sge=%d num_chain=%d\n", in initChainBuffers()
4378 ioc->name, numSGE, num_sge, num_chain)); in initChainBuffers()
4380 if (ioc->bus_type == SPI) in initChainBuffers()
4382 else if (ioc->bus_type == SAS) in initChainBuffers()
4387 ioc->num_chain = num_chain; in initChainBuffers()
4390 if (ioc->ChainToChain == NULL) { in initChainBuffers()
4395 ioc->ChainToChain = (int *) mem; in initChainBuffers()
4396 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ChainToChain alloc @ %p, sz=%d bytes\n", in initChainBuffers()
4397 ioc->name, mem, sz)); in initChainBuffers()
4399 mem = (u8 *) ioc->ChainToChain; in initChainBuffers()
4417 PrimeIocFifos(MPT_ADAPTER *ioc) in PrimeIocFifos() argument
4430 if (ioc->reply_frames == NULL) { in PrimeIocFifos()
4431 if ( (num_chain = initChainBuffers(ioc)) < 0) in PrimeIocFifos()
4436 if (ioc->pcidev->device == MPI_MANUFACTPAGE_DEVID_SAS1078 && in PrimeIocFifos()
4437 ioc->dma_mask > DMA_BIT_MASK(35)) { in PrimeIocFifos()
4438 if (!pci_set_dma_mask(ioc->pcidev, DMA_BIT_MASK(32)) in PrimeIocFifos()
4439 && !pci_set_consistent_dma_mask(ioc->pcidev, in PrimeIocFifos()
4442 d36memprintk(ioc, printk(MYIOC_s_DEBUG_FMT in PrimeIocFifos()
4445 ioc->name)); in PrimeIocFifos()
4448 pci_set_dma_mask(ioc->pcidev, in PrimeIocFifos()
4450 pci_set_consistent_dma_mask(ioc->pcidev, in PrimeIocFifos()
4456 ioc->name); in PrimeIocFifos()
4461 total_size = reply_sz = (ioc->reply_sz * ioc->reply_depth); in PrimeIocFifos()
4462 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ReplyBuffer sz=%d bytes, ReplyDepth=%d\n", in PrimeIocFifos()
4463 ioc->name, ioc->reply_sz, ioc->reply_depth)); in PrimeIocFifos()
4464 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ReplyBuffer sz=%d[%x] bytes\n", in PrimeIocFifos()
4465 ioc->name, reply_sz, reply_sz)); in PrimeIocFifos()
4467 sz = (ioc->req_sz * ioc->req_depth); in PrimeIocFifos()
4468 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "RequestBuffer sz=%d bytes, RequestDepth=%d\n", in PrimeIocFifos()
4469 ioc->name, ioc->req_sz, ioc->req_depth)); in PrimeIocFifos()
4470 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "RequestBuffer sz=%d[%x] bytes\n", in PrimeIocFifos()
4471 ioc->name, sz, sz)); in PrimeIocFifos()
4474 sz = num_chain * ioc->req_sz; /* chain buffer pool size */ in PrimeIocFifos()
4475 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ChainBuffer sz=%d bytes, ChainDepth=%d\n", in PrimeIocFifos()
4476 ioc->name, ioc->req_sz, num_chain)); in PrimeIocFifos()
4477 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ChainBuffer sz=%d[%x] bytes num_chain=%d\n", in PrimeIocFifos()
4478 ioc->name, sz, sz, num_chain)); in PrimeIocFifos()
4481 mem = pci_alloc_consistent(ioc->pcidev, total_size, &alloc_dma); in PrimeIocFifos()
4484 ioc->name); in PrimeIocFifos()
4488 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Total alloc @ %p[%p], sz=%d[%x] bytes\n", in PrimeIocFifos()
4489 ioc->name, mem, (void *)(ulong)alloc_dma, total_size, total_size)); in PrimeIocFifos()
4492 ioc->alloc_total += total_size; in PrimeIocFifos()
4493 ioc->alloc = mem; in PrimeIocFifos()
4494 ioc->alloc_dma = alloc_dma; in PrimeIocFifos()
4495 ioc->alloc_sz = total_size; in PrimeIocFifos()
4496 ioc->reply_frames = (MPT_FRAME_HDR *) mem; in PrimeIocFifos()
4497 ioc->reply_frames_low_dma = (u32) (alloc_dma & 0xFFFFFFFF); in PrimeIocFifos()
4499 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ReplyBuffers @ %p[%p]\n", in PrimeIocFifos()
4500 ioc->name, ioc->reply_frames, (void *)(ulong)alloc_dma)); in PrimeIocFifos()
4507 ioc->req_frames = (MPT_FRAME_HDR *) mem; in PrimeIocFifos()
4508 ioc->req_frames_dma = alloc_dma; in PrimeIocFifos()
4510 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "RequestBuffers @ %p[%p]\n", in PrimeIocFifos()
4511 ioc->name, mem, (void *)(ulong)alloc_dma)); in PrimeIocFifos()
4513 ioc->req_frames_low_dma = (u32) (alloc_dma & 0xFFFFFFFF); in PrimeIocFifos()
4521 ioc->mtrr_reg = mtrr_add(ioc->req_frames_dma, in PrimeIocFifos()
4524 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "MTRR region registered (base:size=%08x:%x)\n", in PrimeIocFifos()
4525 ioc->name, ioc->req_frames_dma, sz)); in PrimeIocFifos()
4528 for (i = 0; i < ioc->req_depth; i++) { in PrimeIocFifos()
4529 alloc_dma += ioc->req_sz; in PrimeIocFifos()
4530 mem += ioc->req_sz; in PrimeIocFifos()
4533 ioc->ChainBuffer = mem; in PrimeIocFifos()
4534 ioc->ChainBufferDMA = alloc_dma; in PrimeIocFifos()
4536 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ChainBuffers @ %p(%p)\n", in PrimeIocFifos()
4537 ioc->name, ioc->ChainBuffer, (void *)(ulong)ioc->ChainBufferDMA)); in PrimeIocFifos()
4542 INIT_LIST_HEAD(&ioc->FreeChainQ); in PrimeIocFifos()
4546 mem = (u8 *)ioc->ChainBuffer; in PrimeIocFifos()
4549 list_add_tail(&mf->u.frame.linkage.list, &ioc->FreeChainQ); in PrimeIocFifos()
4550 mem += ioc->req_sz; in PrimeIocFifos()
4555 alloc_dma = ioc->req_frames_dma; in PrimeIocFifos()
4556 mem = (u8 *) ioc->req_frames; in PrimeIocFifos()
4558 spin_lock_irqsave(&ioc->FreeQlock, flags); in PrimeIocFifos()
4559 INIT_LIST_HEAD(&ioc->FreeQ); in PrimeIocFifos()
4560 for (i = 0; i < ioc->req_depth; i++) { in PrimeIocFifos()
4564 list_add_tail(&mf->u.frame.linkage.list, &ioc->FreeQ); in PrimeIocFifos()
4566 mem += ioc->req_sz; in PrimeIocFifos()
4568 spin_unlock_irqrestore(&ioc->FreeQlock, flags); in PrimeIocFifos()
4570 sz = (ioc->req_depth * MPT_SENSE_BUFFER_ALLOC); in PrimeIocFifos()
4571 ioc->sense_buf_pool = in PrimeIocFifos()
4572 pci_alloc_consistent(ioc->pcidev, sz, &ioc->sense_buf_pool_dma); in PrimeIocFifos()
4573 if (ioc->sense_buf_pool == NULL) { in PrimeIocFifos()
4575 ioc->name); in PrimeIocFifos()
4579 ioc->sense_buf_low_dma = (u32) (ioc->sense_buf_pool_dma & 0xFFFFFFFF); in PrimeIocFifos()
4580 ioc->alloc_total += sz; in PrimeIocFifos()
4581 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SenseBuffers @ %p[%p]\n", in PrimeIocFifos()
4582 ioc->name, ioc->sense_buf_pool, (void *)(ulong)ioc->sense_buf_pool_dma)); in PrimeIocFifos()
4588 alloc_dma = ioc->alloc_dma; in PrimeIocFifos()
4589 dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ReplyBuffers @ %p[%p]\n", in PrimeIocFifos()
4590 ioc->name, ioc->reply_frames, (void *)(ulong)alloc_dma)); in PrimeIocFifos()
4592 for (i = 0; i < ioc->reply_depth; i++) { in PrimeIocFifos()
4594 CHIPREG_WRITE32(&ioc->chip->ReplyFifo, alloc_dma); in PrimeIocFifos()
4595 alloc_dma += ioc->reply_sz; in PrimeIocFifos()
4598 if (dma_mask == DMA_BIT_MASK(35) && !pci_set_dma_mask(ioc->pcidev, in PrimeIocFifos()
4599 ioc->dma_mask) && !pci_set_consistent_dma_mask(ioc->pcidev, in PrimeIocFifos()
4600 ioc->dma_mask)) in PrimeIocFifos()
4601 d36memprintk(ioc, printk(MYIOC_s_DEBUG_FMT in PrimeIocFifos()
4602 "restoring 64 bit addressing\n", ioc->name)); in PrimeIocFifos()
4608 if (ioc->alloc != NULL) { in PrimeIocFifos()
4609 sz = ioc->alloc_sz; in PrimeIocFifos()
4610 pci_free_consistent(ioc->pcidev, in PrimeIocFifos()
4612 ioc->alloc, ioc->alloc_dma); in PrimeIocFifos()
4613 ioc->reply_frames = NULL; in PrimeIocFifos()
4614 ioc->req_frames = NULL; in PrimeIocFifos()
4615 ioc->alloc_total -= sz; in PrimeIocFifos()
4617 if (ioc->sense_buf_pool != NULL) { in PrimeIocFifos()
4618 sz = (ioc->req_depth * MPT_SENSE_BUFFER_ALLOC); in PrimeIocFifos()
4619 pci_free_consistent(ioc->pcidev, in PrimeIocFifos()
4621 ioc->sense_buf_pool, ioc->sense_buf_pool_dma); in PrimeIocFifos()
4622 ioc->sense_buf_pool = NULL; in PrimeIocFifos()
4625 if (dma_mask == DMA_BIT_MASK(35) && !pci_set_dma_mask(ioc->pcidev, in PrimeIocFifos()
4626 DMA_BIT_MASK(64)) && !pci_set_consistent_dma_mask(ioc->pcidev, in PrimeIocFifos()
4628 d36memprintk(ioc, printk(MYIOC_s_DEBUG_FMT in PrimeIocFifos()
4629 "restoring 64 bit addressing\n", ioc->name)); in PrimeIocFifos()
4654 mpt_handshake_req_reply_wait(MPT_ADAPTER *ioc, int reqBytes, u32 *req, in mpt_handshake_req_reply_wait() argument
4664 ioc->hs_reply_idx = 0; in mpt_handshake_req_reply_wait()
4665 mptReply = (MPIDefaultReply_t *) ioc->hs_reply; in mpt_handshake_req_reply_wait()
4673 CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); in mpt_handshake_req_reply_wait()
4674 CHIPREG_WRITE32(&ioc->chip->Doorbell, in mpt_handshake_req_reply_wait()
4681 if ((t = WaitForDoorbellInt(ioc, 5, sleepFlag)) < 0) in mpt_handshake_req_reply_wait()
4684 dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "HandShake request start reqBytes=%d, WaitCnt=%d%s\n", in mpt_handshake_req_reply_wait()
4685 ioc->name, reqBytes, t, failcnt ? " - MISSING DOORBELL HANDSHAKE!" : "")); in mpt_handshake_req_reply_wait()
4688 if (!(CHIPREG_READ32(&ioc->chip->Doorbell) & MPI_DOORBELL_ACTIVE)) in mpt_handshake_req_reply_wait()
4696 CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); in mpt_handshake_req_reply_wait()
4697 if (!failcnt && (t = WaitForDoorbellAck(ioc, 5, sleepFlag)) < 0) in mpt_handshake_req_reply_wait()
4714 CHIPREG_WRITE32(&ioc->chip->Doorbell, word); in mpt_handshake_req_reply_wait()
4715 if ((t = WaitForDoorbellAck(ioc, 5, sleepFlag)) < 0) in mpt_handshake_req_reply_wait()
4719 …dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Handshake request frame (@%p) header\n", ioc->name, req)); in mpt_handshake_req_reply_wait()
4720 DBG_DUMP_REQUEST_FRAME_HDR(ioc, (u32 *)req); in mpt_handshake_req_reply_wait()
4722 dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "HandShake request post done, WaitCnt=%d%s\n", in mpt_handshake_req_reply_wait()
4723 ioc->name, t, failcnt ? " - MISSING DOORBELL ACK!" : "")); in mpt_handshake_req_reply_wait()
4728 if (!failcnt && (t = WaitForDoorbellReply(ioc, maxwait, sleepFlag)) < 0) in mpt_handshake_req_reply_wait()
4731 dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "HandShake reply count=%d%s\n", in mpt_handshake_req_reply_wait()
4732 ioc->name, t, failcnt ? " - MISSING DOORBELL REPLY!" : "")); in mpt_handshake_req_reply_wait()
4738 u16reply[ii] = ioc->hs_reply[ii]; in mpt_handshake_req_reply_wait()
4760 WaitForDoorbellAck(MPT_ADAPTER *ioc, int howlong, int sleepFlag) in WaitForDoorbellAck() argument
4771 intstat = CHIPREG_READ32(&ioc->chip->IntStatus); in WaitForDoorbellAck()
4779 intstat = CHIPREG_READ32(&ioc->chip->IntStatus); in WaitForDoorbellAck()
4787 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "WaitForDoorbell ACK (count=%d)\n", in WaitForDoorbellAck()
4788 ioc->name, count)); in WaitForDoorbellAck()
4793 ioc->name, count, intstat); in WaitForDoorbellAck()
4810 WaitForDoorbellInt(MPT_ADAPTER *ioc, int howlong, int sleepFlag) in WaitForDoorbellInt() argument
4819 intstat = CHIPREG_READ32(&ioc->chip->IntStatus); in WaitForDoorbellInt()
4827 intstat = CHIPREG_READ32(&ioc->chip->IntStatus); in WaitForDoorbellInt()
4836 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "WaitForDoorbell INT (cnt=%d) howlong=%d\n", in WaitForDoorbellInt()
4837 ioc->name, count, howlong)); in WaitForDoorbellInt()
4842 ioc->name, count, intstat); in WaitForDoorbellInt()
4860 WaitForDoorbellReply(MPT_ADAPTER *ioc, int howlong, int sleepFlag) in WaitForDoorbellReply() argument
4865 u16 *hs_reply = ioc->hs_reply; in WaitForDoorbellReply()
4866 volatile MPIDefaultReply_t *mptReply = (MPIDefaultReply_t *) ioc->hs_reply; in WaitForDoorbellReply()
4875 if ((t = WaitForDoorbellInt(ioc, howlong, sleepFlag)) < 0) { in WaitForDoorbellReply()
4878 hs_reply[u16cnt++] = le16_to_cpu(CHIPREG_READ32(&ioc->chip->Doorbell) & 0x0000FFFF); in WaitForDoorbellReply()
4879 CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); in WaitForDoorbellReply()
4880 if ((t = WaitForDoorbellInt(ioc, 5, sleepFlag)) < 0) in WaitForDoorbellReply()
4883 hs_reply[u16cnt++] = le16_to_cpu(CHIPREG_READ32(&ioc->chip->Doorbell) & 0x0000FFFF); in WaitForDoorbellReply()
4884 CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); in WaitForDoorbellReply()
4888 dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "WaitCnt=%d First handshake reply word=%08x%s\n", in WaitForDoorbellReply()
4889 ioc->name, t, le32_to_cpu(*(u32 *)hs_reply), in WaitForDoorbellReply()
4897 if ((t = WaitForDoorbellInt(ioc, 5, sleepFlag)) < 0) in WaitForDoorbellReply()
4899 hword = le16_to_cpu(CHIPREG_READ32(&ioc->chip->Doorbell) & 0x0000FFFF); in WaitForDoorbellReply()
4901 if (u16cnt < ARRAY_SIZE(ioc->hs_reply)) in WaitForDoorbellReply()
4903 CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); in WaitForDoorbellReply()
4906 if (!failcnt && (t = WaitForDoorbellInt(ioc, 5, sleepFlag)) < 0) in WaitForDoorbellReply()
4908 CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); in WaitForDoorbellReply()
4912 ioc->name); in WaitForDoorbellReply()
4924 dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Got Handshake reply:\n", ioc->name)); in WaitForDoorbellReply()
4925 DBG_DUMP_REPLY_FRAME(ioc, (u32 *)mptReply); in WaitForDoorbellReply()
4927 dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "WaitForDoorbell REPLY WaitCnt=%d (sz=%d)\n", in WaitForDoorbellReply()
4928 ioc->name, t, u16cnt/2)); in WaitForDoorbellReply()
4944 GetLanConfigPages(MPT_ADAPTER *ioc) in GetLanConfigPages() argument
4968 if ((rc = mpt_config(ioc, &cfg)) != 0) in GetLanConfigPages()
4973 ppage0_alloc = (LANPage0_t *) pci_alloc_consistent(ioc->pcidev, data_sz, &page0_dma); in GetLanConfigPages()
4980 if ((rc = mpt_config(ioc, &cfg)) == 0) { in GetLanConfigPages()
4983 memcpy(&ioc->lan_cnfg_page0, ppage0_alloc, copy_sz); in GetLanConfigPages()
4987 pci_free_consistent(ioc->pcidev, data_sz, (u8 *) ppage0_alloc, page0_dma); in GetLanConfigPages()
5011 if ((rc = mpt_config(ioc, &cfg)) != 0) in GetLanConfigPages()
5019 ppage1_alloc = (LANPage1_t *) pci_alloc_consistent(ioc->pcidev, data_sz, &page1_dma); in GetLanConfigPages()
5025 if ((rc = mpt_config(ioc, &cfg)) == 0) { in GetLanConfigPages()
5028 memcpy(&ioc->lan_cnfg_page1, ppage1_alloc, copy_sz); in GetLanConfigPages()
5031 pci_free_consistent(ioc->pcidev, data_sz, (u8 *) ppage1_alloc, page1_dma); in GetLanConfigPages()
5060 mptbase_sas_persist_operation(MPT_ADAPTER *ioc, u8 persist_opcode) in mptbase_sas_persist_operation() argument
5069 mutex_lock(&ioc->mptbase_cmds.mutex); in mptbase_sas_persist_operation()
5072 memset(ioc->mptbase_cmds.reply, 0 , MPT_DEFAULT_FRAME_SIZE); in mptbase_sas_persist_operation()
5073 INITIALIZE_MGMT_STATUS(ioc->mptbase_cmds.status) in mptbase_sas_persist_operation()
5092 if ((mf = mpt_get_msg_frame(mpt_base_index, ioc)) == NULL) { in mptbase_sas_persist_operation()
5105 mpt_put_msg_frame(mpt_base_index, ioc, mf); in mptbase_sas_persist_operation()
5106 timeleft = wait_for_completion_timeout(&ioc->mptbase_cmds.done, 10*HZ); in mptbase_sas_persist_operation()
5107 if (!(ioc->mptbase_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { in mptbase_sas_persist_operation()
5110 if (ioc->mptbase_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) in mptbase_sas_persist_operation()
5115 ioc->name, __func__, mpt_GetIocState(ioc, 0)); in mptbase_sas_persist_operation()
5116 mpt_Soft_Hard_ResetHandler(ioc, CAN_SLEEP); in mptbase_sas_persist_operation()
5117 mpt_free_msg_frame(ioc, mf); in mptbase_sas_persist_operation()
5122 if (!(ioc->mptbase_cmds.status & MPT_MGMT_STATUS_RF_VALID)) { in mptbase_sas_persist_operation()
5128 (SasIoUnitControlReply_t *)ioc->mptbase_cmds.reply; in mptbase_sas_persist_operation()
5139 CLEAR_MGMT_STATUS(ioc->mptbase_cmds.status) in mptbase_sas_persist_operation()
5140 mutex_unlock(&ioc->mptbase_cmds.mutex); in mptbase_sas_persist_operation()
5147 mptbase_raid_process_event_data(MPT_ADAPTER *ioc, in mptbase_raid_process_event_data() argument
5172 ioc->name, disk, volume); in mptbase_raid_process_event_data()
5175 ioc->name, volume); in mptbase_raid_process_event_data()
5181 ioc->name); in mptbase_raid_process_event_data()
5187 ioc->name); in mptbase_raid_process_event_data()
5192 ioc->name); in mptbase_raid_process_event_data()
5197 ioc->name, in mptbase_raid_process_event_data()
5215 ioc->name, disk); in mptbase_raid_process_event_data()
5220 ioc->name); in mptbase_raid_process_event_data()
5225 ioc->name); in mptbase_raid_process_event_data()
5230 ioc->name); in mptbase_raid_process_event_data()
5235 ioc->name, in mptbase_raid_process_event_data()
5261 ioc->name, disk); in mptbase_raid_process_event_data()
5266 ioc->name, pRaidEventData->ASC, pRaidEventData->ASCQ); in mptbase_raid_process_event_data()
5271 ioc->name, disk); in mptbase_raid_process_event_data()
5288 GetIoUnitPage2(MPT_ADAPTER *ioc) in GetIoUnitPage2() argument
5309 if ((rc = mpt_config(ioc, &cfg)) != 0) in GetIoUnitPage2()
5318 ppage_alloc = (IOUnitPage2_t *) pci_alloc_consistent(ioc->pcidev, data_sz, &page_dma); in GetIoUnitPage2()
5325 if ((rc = mpt_config(ioc, &cfg)) == 0) in GetIoUnitPage2()
5326 ioc->biosVersion = le32_to_cpu(ppage_alloc->BiosVersion); in GetIoUnitPage2()
5328 pci_free_consistent(ioc->pcidev, data_sz, (u8 *) ppage_alloc, page_dma); in GetIoUnitPage2()
5356 mpt_GetScsiPortSettings(MPT_ADAPTER *ioc, int portnum) in mpt_GetScsiPortSettings() argument
5367 if (!ioc->spi_data.nvram) { in mpt_GetScsiPortSettings()
5375 ioc->spi_data.nvram = (int *) mem; in mpt_GetScsiPortSettings()
5377 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SCSI device NVRAM settings @ %p, sz=%d\n", in mpt_GetScsiPortSettings()
5378 ioc->name, ioc->spi_data.nvram, sz)); in mpt_GetScsiPortSettings()
5384 ioc->spi_data.nvram[ii] = MPT_HOST_NVRAM_INVALID; in mpt_GetScsiPortSettings()
5399 if (mpt_config(ioc, &cfg) != 0) in mpt_GetScsiPortSettings()
5403 pbuf = pci_alloc_consistent(ioc->pcidev, header.PageLength * 4, &buf_dma); in mpt_GetScsiPortSettings()
5407 if (mpt_config(ioc, &cfg) != 0) { in mpt_GetScsiPortSettings()
5408 ioc->spi_data.maxBusWidth = MPT_NARROW; in mpt_GetScsiPortSettings()
5409 ioc->spi_data.maxSyncOffset = 0; in mpt_GetScsiPortSettings()
5410 ioc->spi_data.minSyncFactor = MPT_ASYNC; in mpt_GetScsiPortSettings()
5411 ioc->spi_data.busType = MPT_HOST_BUS_UNKNOWN; in mpt_GetScsiPortSettings()
5413 ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_GetScsiPortSettings()
5415 ioc->name, ioc->spi_data.minSyncFactor)); in mpt_GetScsiPortSettings()
5424 ioc->spi_data.noQas |= MPT_TARGET_NO_NEGO_QAS; in mpt_GetScsiPortSettings()
5425 ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_GetScsiPortSettings()
5427 ioc->name, pPP0->Capabilities)); in mpt_GetScsiPortSettings()
5429 ioc->spi_data.maxBusWidth = pPP0->Capabilities & MPI_SCSIPORTPAGE0_CAP_WIDE ? 1 : 0; in mpt_GetScsiPortSettings()
5432 ioc->spi_data.maxSyncOffset = (u8) (data >> 16); in mpt_GetScsiPortSettings()
5434 ioc->spi_data.minSyncFactor = (u8) (data >> 8); in mpt_GetScsiPortSettings()
5435 ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_GetScsiPortSettings()
5437 ioc->name, ioc->spi_data.minSyncFactor)); in mpt_GetScsiPortSettings()
5439 ioc->spi_data.maxSyncOffset = 0; in mpt_GetScsiPortSettings()
5440 ioc->spi_data.minSyncFactor = MPT_ASYNC; in mpt_GetScsiPortSettings()
5443 ioc->spi_data.busType = pPP0->PhysicalInterface & MPI_SCSIPORTPAGE0_PHY_SIGNAL_TYPE_MASK; in mpt_GetScsiPortSettings()
5447 if ((ioc->spi_data.busType == MPI_SCSIPORTPAGE0_PHY_SIGNAL_HVD) || in mpt_GetScsiPortSettings()
5448 (ioc->spi_data.busType == MPI_SCSIPORTPAGE0_PHY_SIGNAL_SE)) { in mpt_GetScsiPortSettings()
5450 if (ioc->spi_data.minSyncFactor < MPT_ULTRA) { in mpt_GetScsiPortSettings()
5451 ioc->spi_data.minSyncFactor = MPT_ULTRA; in mpt_GetScsiPortSettings()
5452 ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_GetScsiPortSettings()
5454 ioc->name, ioc->spi_data.minSyncFactor)); in mpt_GetScsiPortSettings()
5459 pci_free_consistent(ioc->pcidev, header.PageLength * 4, pbuf, buf_dma); in mpt_GetScsiPortSettings()
5475 if (mpt_config(ioc, &cfg) != 0) in mpt_GetScsiPortSettings()
5481 pbuf = pci_alloc_consistent(ioc->pcidev, header.PageLength * 4, &buf_dma); in mpt_GetScsiPortSettings()
5485 if (mpt_config(ioc, &cfg) != 0) { in mpt_GetScsiPortSettings()
5489 } else if (ioc->pcidev->vendor == PCI_VENDOR_ID_ATTO) { in mpt_GetScsiPortSettings()
5519 ioc->spi_data.nvram[ii] = data; in mpt_GetScsiPortSettings()
5528 ioc->spi_data.bus_reset = in mpt_GetScsiPortSettings()
5537 ioc->spi_data.PortFlags = data; in mpt_GetScsiPortSettings()
5542 ioc->spi_data.nvram[ii] = data; in mpt_GetScsiPortSettings()
5546 pci_free_consistent(ioc->pcidev, header.PageLength * 4, pbuf, buf_dma); in mpt_GetScsiPortSettings()
5568 mpt_readScsiDevicePageHeaders(MPT_ADAPTER *ioc, int portnum) in mpt_readScsiDevicePageHeaders() argument
5585 if (mpt_config(ioc, &cfg) != 0) in mpt_readScsiDevicePageHeaders()
5588 ioc->spi_data.sdp1version = cfg.cfghdr.hdr->PageVersion; in mpt_readScsiDevicePageHeaders()
5589 ioc->spi_data.sdp1length = cfg.cfghdr.hdr->PageLength; in mpt_readScsiDevicePageHeaders()
5595 if (mpt_config(ioc, &cfg) != 0) in mpt_readScsiDevicePageHeaders()
5598 ioc->spi_data.sdp0version = cfg.cfghdr.hdr->PageVersion; in mpt_readScsiDevicePageHeaders()
5599 ioc->spi_data.sdp0length = cfg.cfghdr.hdr->PageLength; in mpt_readScsiDevicePageHeaders()
5601 dcprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Headers: 0: version %d length %d\n", in mpt_readScsiDevicePageHeaders()
5602 ioc->name, ioc->spi_data.sdp0version, ioc->spi_data.sdp0length)); in mpt_readScsiDevicePageHeaders()
5604 dcprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Headers: 1: version %d length %d\n", in mpt_readScsiDevicePageHeaders()
5605 ioc->name, ioc->spi_data.sdp1version, ioc->spi_data.sdp1length)); in mpt_readScsiDevicePageHeaders()
5614 mpt_inactive_raid_list_free(MPT_ADAPTER *ioc) in mpt_inactive_raid_list_free() argument
5618 if (list_empty(&ioc->raid_data.inactive_list)) in mpt_inactive_raid_list_free()
5621 mutex_lock(&ioc->raid_data.inactive_list_mutex); in mpt_inactive_raid_list_free()
5623 &ioc->raid_data.inactive_list, list) { in mpt_inactive_raid_list_free()
5627 mutex_unlock(&ioc->raid_data.inactive_list_mutex); in mpt_inactive_raid_list_free()
5638 mpt_inactive_raid_volumes(MPT_ADAPTER *ioc, u8 channel, u8 id) in mpt_inactive_raid_volumes() argument
5656 if (mpt_config(ioc, &cfg) != 0) in mpt_inactive_raid_volumes()
5662 buffer = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4, in mpt_inactive_raid_volumes()
5671 if (mpt_config(ioc, &cfg) != 0) in mpt_inactive_raid_volumes()
5686 mutex_lock(&ioc->raid_data.inactive_list_mutex); in mpt_inactive_raid_volumes()
5688 if(mpt_raid_phys_disk_pg0(ioc, in mpt_inactive_raid_volumes()
5704 &ioc->raid_data.inactive_list); in mpt_inactive_raid_volumes()
5706 mutex_unlock(&ioc->raid_data.inactive_list_mutex); in mpt_inactive_raid_volumes()
5710 pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, buffer, in mpt_inactive_raid_volumes()
5726 mpt_raid_phys_disk_pg0(MPT_ADAPTER *ioc, u8 phys_disk_num, in mpt_raid_phys_disk_pg0() argument
5745 if (mpt_config(ioc, &cfg) != 0) { in mpt_raid_phys_disk_pg0()
5755 buffer = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4, in mpt_raid_phys_disk_pg0()
5767 if (mpt_config(ioc, &cfg) != 0) { in mpt_raid_phys_disk_pg0()
5779 pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, buffer, in mpt_raid_phys_disk_pg0()
5794 mpt_raid_phys_disk_get_num_paths(MPT_ADAPTER *ioc, u8 phys_disk_num) in mpt_raid_phys_disk_get_num_paths() argument
5812 if (mpt_config(ioc, &cfg) != 0) { in mpt_raid_phys_disk_get_num_paths()
5822 buffer = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4, in mpt_raid_phys_disk_get_num_paths()
5834 if (mpt_config(ioc, &cfg) != 0) { in mpt_raid_phys_disk_get_num_paths()
5843 pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, buffer, in mpt_raid_phys_disk_get_num_paths()
5862 mpt_raid_phys_disk_pg1(MPT_ADAPTER *ioc, u8 phys_disk_num, in mpt_raid_phys_disk_pg1() argument
5884 if (mpt_config(ioc, &cfg) != 0) { in mpt_raid_phys_disk_pg1()
5894 buffer = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4, in mpt_raid_phys_disk_pg1()
5906 if (mpt_config(ioc, &cfg) != 0) { in mpt_raid_phys_disk_pg1()
5932 pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, buffer, in mpt_raid_phys_disk_pg1()
5950 mpt_findImVolumes(MPT_ADAPTER *ioc) in mpt_findImVolumes() argument
5961 if (!ioc->ir_firmware) in mpt_findImVolumes()
5966 kfree(ioc->raid_data.pIocPg2); in mpt_findImVolumes()
5967 ioc->raid_data.pIocPg2 = NULL; in mpt_findImVolumes()
5968 mpt_inactive_raid_list_free(ioc); in mpt_findImVolumes()
5982 if (mpt_config(ioc, &cfg) != 0) in mpt_findImVolumes()
5989 pIoc2 = pci_alloc_consistent(ioc->pcidev, iocpage2sz, &ioc2_dma); in mpt_findImVolumes()
5995 if (mpt_config(ioc, &cfg) != 0) in mpt_findImVolumes()
6005 ioc->raid_data.pIocPg2 = (IOCPage2_t *) mem; in mpt_findImVolumes()
6007 mpt_read_ioc_pg_3(ioc); in mpt_findImVolumes()
6010 mpt_inactive_raid_volumes(ioc, in mpt_findImVolumes()
6015 pci_free_consistent(ioc->pcidev, iocpage2sz, pIoc2, ioc2_dma); in mpt_findImVolumes()
6021 mpt_read_ioc_pg_3(MPT_ADAPTER *ioc) in mpt_read_ioc_pg_3() argument
6032 kfree(ioc->raid_data.pIocPg3); in mpt_read_ioc_pg_3()
6033 ioc->raid_data.pIocPg3 = NULL; in mpt_read_ioc_pg_3()
6048 if (mpt_config(ioc, &cfg) != 0) in mpt_read_ioc_pg_3()
6057 pIoc3 = pci_alloc_consistent(ioc->pcidev, iocpage3sz, &ioc3_dma); in mpt_read_ioc_pg_3()
6066 if (mpt_config(ioc, &cfg) == 0) { in mpt_read_ioc_pg_3()
6070 ioc->raid_data.pIocPg3 = (IOCPage3_t *) mem; in mpt_read_ioc_pg_3()
6074 pci_free_consistent(ioc->pcidev, iocpage3sz, pIoc3, ioc3_dma); in mpt_read_ioc_pg_3()
6080 mpt_read_ioc_pg_4(MPT_ADAPTER *ioc) in mpt_read_ioc_pg_4() argument
6100 if (mpt_config(ioc, &cfg) != 0) in mpt_read_ioc_pg_4()
6106 if ( (pIoc4 = ioc->spi_data.pIocPg4) == NULL ) { in mpt_read_ioc_pg_4()
6108 pIoc4 = pci_alloc_consistent(ioc->pcidev, iocpage4sz, &ioc4_dma); in mpt_read_ioc_pg_4()
6111 ioc->alloc_total += iocpage4sz; in mpt_read_ioc_pg_4()
6113 ioc4_dma = ioc->spi_data.IocPg4_dma; in mpt_read_ioc_pg_4()
6114 iocpage4sz = ioc->spi_data.IocPg4Sz; in mpt_read_ioc_pg_4()
6121 if (mpt_config(ioc, &cfg) == 0) { in mpt_read_ioc_pg_4()
6122 ioc->spi_data.pIocPg4 = (IOCPage4_t *) pIoc4; in mpt_read_ioc_pg_4()
6123 ioc->spi_data.IocPg4_dma = ioc4_dma; in mpt_read_ioc_pg_4()
6124 ioc->spi_data.IocPg4Sz = iocpage4sz; in mpt_read_ioc_pg_4()
6126 pci_free_consistent(ioc->pcidev, iocpage4sz, pIoc4, ioc4_dma); in mpt_read_ioc_pg_4()
6127 ioc->spi_data.pIocPg4 = NULL; in mpt_read_ioc_pg_4()
6128 ioc->alloc_total -= iocpage4sz; in mpt_read_ioc_pg_4()
6133 mpt_read_ioc_pg_1(MPT_ADAPTER *ioc) in mpt_read_ioc_pg_1() argument
6154 if (mpt_config(ioc, &cfg) != 0) in mpt_read_ioc_pg_1()
6163 pIoc1 = pci_alloc_consistent(ioc->pcidev, iocpage1sz, &ioc1_dma); in mpt_read_ioc_pg_1()
6171 if (mpt_config(ioc, &cfg) == 0) { in mpt_read_ioc_pg_1()
6177 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Coalescing Enabled Timeout = %d\n", in mpt_read_ioc_pg_1()
6178 ioc->name, tmp)); in mpt_read_ioc_pg_1()
6187 if (mpt_config(ioc, &cfg) == 0) { in mpt_read_ioc_pg_1()
6188 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Reset Current Coalescing Timeout to = %d\n", in mpt_read_ioc_pg_1()
6189 ioc->name, MPT_COALESCING_TIMEOUT)); in mpt_read_ioc_pg_1()
6192 if (mpt_config(ioc, &cfg) == 0) { in mpt_read_ioc_pg_1()
6193 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_read_ioc_pg_1()
6195 ioc->name, MPT_COALESCING_TIMEOUT)); in mpt_read_ioc_pg_1()
6197 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_read_ioc_pg_1()
6199 ioc->name)); in mpt_read_ioc_pg_1()
6203 dprintk(ioc, printk(MYIOC_s_WARN_FMT in mpt_read_ioc_pg_1()
6205 ioc->name)); in mpt_read_ioc_pg_1()
6210 dprintk(ioc, printk(MYIOC_s_WARN_FMT "Coalescing Disabled\n", ioc->name)); in mpt_read_ioc_pg_1()
6214 pci_free_consistent(ioc->pcidev, iocpage1sz, pIoc1, ioc1_dma); in mpt_read_ioc_pg_1()
6220 mpt_get_manufacturing_pg_0(MPT_ADAPTER *ioc) in mpt_get_manufacturing_pg_0() argument
6236 if (mpt_config(ioc, &cfg) != 0) in mpt_get_manufacturing_pg_0()
6243 pbuf = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4, &buf_dma); in mpt_get_manufacturing_pg_0()
6249 if (mpt_config(ioc, &cfg) != 0) in mpt_get_manufacturing_pg_0()
6252 memcpy(ioc->board_name, pbuf->BoardName, sizeof(ioc->board_name)); in mpt_get_manufacturing_pg_0()
6253 memcpy(ioc->board_assembly, pbuf->BoardAssembly, sizeof(ioc->board_assembly)); in mpt_get_manufacturing_pg_0()
6254 memcpy(ioc->board_tracer, pbuf->BoardTracerNumber, sizeof(ioc->board_tracer)); in mpt_get_manufacturing_pg_0()
6259 pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, pbuf, buf_dma); in mpt_get_manufacturing_pg_0()
6270 SendEventNotification(MPT_ADAPTER *ioc, u8 EvSwitch, int sleepFlag) in SendEventNotification() argument
6282 devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT in SendEventNotification()
6284 ioc->name, EvSwitch, &evn)); in SendEventNotification()
6286 return mpt_handshake_req_reply_wait(ioc, sizeof(EventNotification_t), in SendEventNotification()
6298 SendEventAck(MPT_ADAPTER *ioc, EventNotificationReply_t *evnp) in SendEventAck() argument
6302 if ((pAck = (EventAck_t *) mpt_get_msg_frame(mpt_base_index, ioc)) == NULL) { in SendEventAck()
6303 dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, no msg frames!!\n", in SendEventAck()
6304 ioc->name, __func__)); in SendEventAck()
6308 devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending EventAck\n", ioc->name)); in SendEventAck()
6318 mpt_put_msg_frame(mpt_base_index, ioc, (MPT_FRAME_HDR *)pAck); in SendEventAck()
6338 mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg) in mpt_config() argument
6360 dcprintk(ioc, printk(MYIOC_s_WARN_FMT "Config request not allowed in ISR context!\n", in mpt_config()
6361 ioc->name)); in mpt_config()
6366 spin_lock_irqsave(&ioc->taskmgmt_lock, flags); in mpt_config()
6367 if (ioc->ioc_reset_in_progress) { in mpt_config()
6368 dfailprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_config()
6369 "%s: busy with host reset\n", ioc->name, __func__)); in mpt_config()
6370 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); in mpt_config()
6373 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); in mpt_config()
6376 if (!ioc->active || in mpt_config()
6377 mpt_GetIocState(ioc, 1) != MPI_IOC_STATE_OPERATIONAL) { in mpt_config()
6378 dfailprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_config()
6380 ioc->name, __func__, ioc->active, in mpt_config()
6381 mpt_GetIocState(ioc, 0))); in mpt_config()
6386 mutex_lock(&ioc->mptbase_cmds.mutex); in mpt_config()
6388 memset(ioc->mptbase_cmds.reply, 0 , MPT_DEFAULT_FRAME_SIZE); in mpt_config()
6389 INITIALIZE_MGMT_STATUS(ioc->mptbase_cmds.status) in mpt_config()
6393 if ((mf = mpt_get_msg_frame(mpt_base_index, ioc)) == NULL) { in mpt_config()
6394 dcprintk(ioc, printk(MYIOC_s_WARN_FMT in mpt_config()
6395 "mpt_config: no msg frames!\n", ioc->name)); in mpt_config()
6451 dcprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_config()
6453 ioc->name, page_type, pReq->Header.PageNumber, pReq->Action)); in mpt_config()
6455 ioc->add_sge((char *)&pReq->PageBufferSGE, flagsLength, pCfg->physAddr); in mpt_config()
6457 mpt_put_msg_frame(mpt_base_index, ioc, mf); in mpt_config()
6458 timeleft = wait_for_completion_timeout(&ioc->mptbase_cmds.done, in mpt_config()
6460 if (!(ioc->mptbase_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { in mpt_config()
6462 dfailprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_config()
6465 ioc->name, page_type, pReq->Header.PageNumber, in mpt_config()
6466 pReq->Action, ioc->mptbase_cmds.status, timeleft)); in mpt_config()
6467 if (ioc->mptbase_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) in mpt_config()
6470 spin_lock_irqsave(&ioc->taskmgmt_lock, flags); in mpt_config()
6471 if (ioc->ioc_reset_in_progress) { in mpt_config()
6472 spin_unlock_irqrestore(&ioc->taskmgmt_lock, in mpt_config()
6476 __func__, ioc->name); in mpt_config()
6477 mutex_unlock(&ioc->mptbase_cmds.mutex); in mpt_config()
6480 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); in mpt_config()
6486 if (!(ioc->mptbase_cmds.status & MPT_MGMT_STATUS_RF_VALID)) { in mpt_config()
6490 pReply = (ConfigReply_t *)ioc->mptbase_cmds.reply; in mpt_config()
6509 ioc->name, ret, timeleft); in mpt_config()
6511 dcprintk(ioc, printk(KERN_DEBUG "IOCStatus=%04xh, IOCLogInfo=%08xh\n", in mpt_config()
6516 CLEAR_MGMT_STATUS(ioc->mptbase_cmds.status) in mpt_config()
6517 mutex_unlock(&ioc->mptbase_cmds.mutex); in mpt_config()
6522 ioc->name, __func__, mpt_GetIocState(ioc, 0)); in mpt_config()
6524 if (mpt_Soft_Hard_ResetHandler(ioc, CAN_SLEEP) != 0) in mpt_config()
6527 mpt_HardResetHandler(ioc, CAN_SLEEP); in mpt_config()
6529 mpt_free_msg_frame(ioc, mf); in mpt_config()
6535 " action %d\n", ioc->name, page_type, in mpt_config()
6554 mpt_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) in mpt_ioc_reset() argument
6558 ioc->taskmgmt_quiesce_io = 1; in mpt_ioc_reset()
6559 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_ioc_reset()
6560 "%s: MPT_IOC_SETUP_RESET\n", ioc->name, __func__)); in mpt_ioc_reset()
6563 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_ioc_reset()
6564 "%s: MPT_IOC_PRE_RESET\n", ioc->name, __func__)); in mpt_ioc_reset()
6567 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_ioc_reset()
6568 "%s: MPT_IOC_POST_RESET\n", ioc->name, __func__)); in mpt_ioc_reset()
6570 if (ioc->mptbase_cmds.status & MPT_MGMT_STATUS_PENDING) { in mpt_ioc_reset()
6571 ioc->mptbase_cmds.status |= in mpt_ioc_reset()
6573 complete(&ioc->mptbase_cmds.done); in mpt_ioc_reset()
6576 if (ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_PENDING) { in mpt_ioc_reset()
6577 ioc->taskmgmt_cmds.status |= in mpt_ioc_reset()
6579 complete(&ioc->taskmgmt_cmds.done); in mpt_ioc_reset()
6631 static void seq_mpt_print_ioc_summary(MPT_ADAPTER *ioc, struct seq_file *m, int showlan);
6635 MPT_ADAPTER *ioc = m->private; in mpt_summary_proc_show() local
6637 if (ioc) { in mpt_summary_proc_show()
6638 seq_mpt_print_ioc_summary(ioc, m, 1); in mpt_summary_proc_show()
6640 list_for_each_entry(ioc, &ioc_list, list) { in mpt_summary_proc_show()
6641 seq_mpt_print_ioc_summary(ioc, m, 1); in mpt_summary_proc_show()
6718 MPT_ADAPTER *ioc = m->private; in mpt_iocinfo_proc_show() local
6723 mpt_get_fw_exp_ver(expVer, ioc); in mpt_iocinfo_proc_show()
6725 seq_printf(m, "%s:", ioc->name); in mpt_iocinfo_proc_show()
6726 if (ioc->facts.Flags & MPI_IOCFACTS_FLAGS_FW_DOWNLOAD_BOOT) in mpt_iocinfo_proc_show()
6732 ioc->facts.ProductID, in mpt_iocinfo_proc_show()
6733 ioc->prod_name); in mpt_iocinfo_proc_show()
6734 seq_printf(m, " FWVersion = 0x%08x%s", ioc->facts.FWVersion.Word, expVer); in mpt_iocinfo_proc_show()
6735 if (ioc->facts.FWImageSize) in mpt_iocinfo_proc_show()
6736 seq_printf(m, " (fw_size=%d)", ioc->facts.FWImageSize); in mpt_iocinfo_proc_show()
6737 seq_printf(m, "\n MsgVersion = 0x%04x\n", ioc->facts.MsgVersion); in mpt_iocinfo_proc_show()
6738 seq_printf(m, " FirstWhoInit = 0x%02x\n", ioc->FirstWhoInit); in mpt_iocinfo_proc_show()
6739 seq_printf(m, " EventState = 0x%02x\n", ioc->facts.EventState); in mpt_iocinfo_proc_show()
6742 ioc->facts.CurrentHostMfaHighAddr); in mpt_iocinfo_proc_show()
6744 ioc->facts.CurrentSenseBufferHighAddr); in mpt_iocinfo_proc_show()
6746 seq_printf(m, " MaxChainDepth = 0x%02x frames\n", ioc->facts.MaxChainDepth); in mpt_iocinfo_proc_show()
6747 seq_printf(m, " MinBlockSize = 0x%02x bytes\n", 4*ioc->facts.BlockSize); in mpt_iocinfo_proc_show()
6750 (void *)ioc->req_frames, (void *)(ulong)ioc->req_frames_dma); in mpt_iocinfo_proc_show()
6754 sz = (ioc->req_sz * ioc->req_depth) + 128; in mpt_iocinfo_proc_show()
6757 ioc->req_sz, ioc->req_depth, ioc->req_sz*ioc->req_depth, sz); in mpt_iocinfo_proc_show()
6759 4*ioc->facts.RequestFrameSize, in mpt_iocinfo_proc_show()
6760 ioc->facts.GlobalCredits); in mpt_iocinfo_proc_show()
6763 (void *)ioc->alloc, (void *)(ulong)ioc->alloc_dma); in mpt_iocinfo_proc_show()
6764 sz = (ioc->reply_sz * ioc->reply_depth) + 128; in mpt_iocinfo_proc_show()
6766 ioc->reply_sz, ioc->reply_depth, ioc->reply_sz*ioc->reply_depth, sz); in mpt_iocinfo_proc_show()
6768 ioc->facts.CurReplyFrameSize, in mpt_iocinfo_proc_show()
6769 ioc->facts.ReplyQueueDepth); in mpt_iocinfo_proc_show()
6772 (ioc->facts.MaxDevices==0) ? 255 : ioc->facts.MaxDevices); in mpt_iocinfo_proc_show()
6773 seq_printf(m, " MaxBuses = %d\n", ioc->facts.MaxBuses); in mpt_iocinfo_proc_show()
6776 for (p=0; p < ioc->facts.NumberOfPorts; p++) { in mpt_iocinfo_proc_show()
6779 ioc->facts.NumberOfPorts); in mpt_iocinfo_proc_show()
6780 if (ioc->bus_type == FC) { in mpt_iocinfo_proc_show()
6781 if (ioc->pfacts[p].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_LAN) { in mpt_iocinfo_proc_show()
6782 u8 *a = (u8*)&ioc->lan_cnfg_page1.HardwareAddressLow; in mpt_iocinfo_proc_show()
6787 ioc->fc_port_page0[p].WWNN.High, in mpt_iocinfo_proc_show()
6788 ioc->fc_port_page0[p].WWNN.Low, in mpt_iocinfo_proc_show()
6789 ioc->fc_port_page0[p].WWPN.High, in mpt_iocinfo_proc_show()
6790 ioc->fc_port_page0[p].WWPN.Low); in mpt_iocinfo_proc_show()
6813 mpt_get_fw_exp_ver(char *buf, MPT_ADAPTER *ioc) in mpt_get_fw_exp_ver() argument
6816 if ((ioc->facts.FWVersion.Word >> 24) == 0x0E) { in mpt_get_fw_exp_ver()
6818 (ioc->facts.FWVersion.Word >> 16) & 0x00FF, /* Month */ in mpt_get_fw_exp_ver()
6819 (ioc->facts.FWVersion.Word >> 8) & 0x1F); /* Day */ in mpt_get_fw_exp_ver()
6822 if ((ioc->facts.FWVersion.Word >> 8) & 0x80) in mpt_get_fw_exp_ver()
6840 mpt_print_ioc_summary(MPT_ADAPTER *ioc, char *buffer, int *size, int len, int showlan) in mpt_print_ioc_summary() argument
6845 mpt_get_fw_exp_ver(expVer, ioc); in mpt_print_ioc_summary()
6851 ioc->name, in mpt_print_ioc_summary()
6852 ioc->prod_name, in mpt_print_ioc_summary()
6854 ioc->facts.FWVersion.Word, in mpt_print_ioc_summary()
6856 ioc->facts.NumberOfPorts, in mpt_print_ioc_summary()
6857 ioc->req_depth); in mpt_print_ioc_summary()
6859 if (showlan && (ioc->pfacts[0].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_LAN)) { in mpt_print_ioc_summary()
6860 u8 *a = (u8*)&ioc->lan_cnfg_page1.HardwareAddressLow; in mpt_print_ioc_summary()
6865 y += sprintf(buffer+len+y, ", IRQ=%d", ioc->pci_irq); in mpt_print_ioc_summary()
6867 if (!ioc->active) in mpt_print_ioc_summary()
6875 static void seq_mpt_print_ioc_summary(MPT_ADAPTER *ioc, struct seq_file *m, int showlan) in seq_mpt_print_ioc_summary() argument
6879 mpt_get_fw_exp_ver(expVer, ioc); in seq_mpt_print_ioc_summary()
6885 ioc->name, in seq_mpt_print_ioc_summary()
6886 ioc->prod_name, in seq_mpt_print_ioc_summary()
6888 ioc->facts.FWVersion.Word, in seq_mpt_print_ioc_summary()
6890 ioc->facts.NumberOfPorts, in seq_mpt_print_ioc_summary()
6891 ioc->req_depth); in seq_mpt_print_ioc_summary()
6893 if (showlan && (ioc->pfacts[0].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_LAN)) { in seq_mpt_print_ioc_summary()
6894 u8 *a = (u8*)&ioc->lan_cnfg_page1.HardwareAddressLow; in seq_mpt_print_ioc_summary()
6899 seq_printf(m, ", IRQ=%d", ioc->pci_irq); in seq_mpt_print_ioc_summary()
6901 if (!ioc->active) in seq_mpt_print_ioc_summary()
6916 mpt_set_taskmgmt_in_progress_flag(MPT_ADAPTER *ioc) in mpt_set_taskmgmt_in_progress_flag() argument
6921 spin_lock_irqsave(&ioc->taskmgmt_lock, flags); in mpt_set_taskmgmt_in_progress_flag()
6922 if (ioc->ioc_reset_in_progress || ioc->taskmgmt_in_progress || in mpt_set_taskmgmt_in_progress_flag()
6923 (ioc->alt_ioc && ioc->alt_ioc->taskmgmt_in_progress)) { in mpt_set_taskmgmt_in_progress_flag()
6928 ioc->taskmgmt_in_progress = 1; in mpt_set_taskmgmt_in_progress_flag()
6929 ioc->taskmgmt_quiesce_io = 1; in mpt_set_taskmgmt_in_progress_flag()
6930 if (ioc->alt_ioc) { in mpt_set_taskmgmt_in_progress_flag()
6931 ioc->alt_ioc->taskmgmt_in_progress = 1; in mpt_set_taskmgmt_in_progress_flag()
6932 ioc->alt_ioc->taskmgmt_quiesce_io = 1; in mpt_set_taskmgmt_in_progress_flag()
6935 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); in mpt_set_taskmgmt_in_progress_flag()
6946 mpt_clear_taskmgmt_in_progress_flag(MPT_ADAPTER *ioc) in mpt_clear_taskmgmt_in_progress_flag() argument
6950 spin_lock_irqsave(&ioc->taskmgmt_lock, flags); in mpt_clear_taskmgmt_in_progress_flag()
6951 ioc->taskmgmt_in_progress = 0; in mpt_clear_taskmgmt_in_progress_flag()
6952 ioc->taskmgmt_quiesce_io = 0; in mpt_clear_taskmgmt_in_progress_flag()
6953 if (ioc->alt_ioc) { in mpt_clear_taskmgmt_in_progress_flag()
6954 ioc->alt_ioc->taskmgmt_in_progress = 0; in mpt_clear_taskmgmt_in_progress_flag()
6955 ioc->alt_ioc->taskmgmt_quiesce_io = 0; in mpt_clear_taskmgmt_in_progress_flag()
6957 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); in mpt_clear_taskmgmt_in_progress_flag()
6969 mpt_halt_firmware(MPT_ADAPTER *ioc) in mpt_halt_firmware() argument
6973 ioc_raw_state = mpt_GetIocState(ioc, 0); in mpt_halt_firmware()
6977 ioc->name, ioc_raw_state & MPI_DOORBELL_DATA_MASK); in mpt_halt_firmware()
6978 panic("%s: IOC Fault (%04xh)!!!\n", ioc->name, in mpt_halt_firmware()
6981 CHIPREG_WRITE32(&ioc->chip->Doorbell, 0xC0FFEE00); in mpt_halt_firmware()
6983 ioc->name); in mpt_halt_firmware()
7002 mpt_SoftResetHandler(MPT_ADAPTER *ioc, int sleepFlag) in mpt_SoftResetHandler() argument
7011 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SoftResetHandler Entered!\n", in mpt_SoftResetHandler()
7012 ioc->name)); in mpt_SoftResetHandler()
7014 ioc_state = mpt_GetIocState(ioc, 0) & MPI_IOC_STATE_MASK; in mpt_SoftResetHandler()
7017 mpt_halt_firmware(ioc); in mpt_SoftResetHandler()
7021 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_SoftResetHandler()
7022 "skipping, either in FAULT or RESET state!\n", ioc->name)); in mpt_SoftResetHandler()
7026 if (ioc->bus_type == FC) { in mpt_SoftResetHandler()
7027 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_SoftResetHandler()
7028 "skipping, because the bus type is FC!\n", ioc->name)); in mpt_SoftResetHandler()
7032 spin_lock_irqsave(&ioc->taskmgmt_lock, flags); in mpt_SoftResetHandler()
7033 if (ioc->ioc_reset_in_progress) { in mpt_SoftResetHandler()
7034 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); in mpt_SoftResetHandler()
7037 ioc->ioc_reset_in_progress = 1; in mpt_SoftResetHandler()
7038 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); in mpt_SoftResetHandler()
7044 mpt_signal_reset(cb_idx, ioc, MPT_IOC_SETUP_RESET); in mpt_SoftResetHandler()
7047 spin_lock_irqsave(&ioc->taskmgmt_lock, flags); in mpt_SoftResetHandler()
7048 if (ioc->taskmgmt_in_progress) { in mpt_SoftResetHandler()
7049 ioc->ioc_reset_in_progress = 0; in mpt_SoftResetHandler()
7050 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); in mpt_SoftResetHandler()
7053 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); in mpt_SoftResetHandler()
7055 CHIPREG_WRITE32(&ioc->chip->IntMask, 0xFFFFFFFF); in mpt_SoftResetHandler()
7056 ioc->active = 0; in mpt_SoftResetHandler()
7059 rc = SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, sleepFlag); in mpt_SoftResetHandler()
7063 mpt_signal_reset(cb_idx, ioc, MPT_IOC_PRE_RESET); in mpt_SoftResetHandler()
7069 ioc_state = mpt_GetIocState(ioc, 0) & MPI_IOC_STATE_MASK; in mpt_SoftResetHandler()
7075 rc = GetIocFacts(ioc, sleepFlag, in mpt_SoftResetHandler()
7087 rc = PrimeIocFifos(ioc); in mpt_SoftResetHandler()
7091 rc = SendIocInit(ioc, sleepFlag); in mpt_SoftResetHandler()
7095 rc = SendEventNotification(ioc, 1, sleepFlag); in mpt_SoftResetHandler()
7099 if (ioc->hard_resets < -1) in mpt_SoftResetHandler()
7100 ioc->hard_resets++; in mpt_SoftResetHandler()
7106 ioc->active = 1; in mpt_SoftResetHandler()
7107 CHIPREG_WRITE32(&ioc->chip->IntMask, MPI_HIM_DIM); in mpt_SoftResetHandler()
7110 spin_lock_irqsave(&ioc->taskmgmt_lock, flags); in mpt_SoftResetHandler()
7111 ioc->ioc_reset_in_progress = 0; in mpt_SoftResetHandler()
7112 ioc->taskmgmt_quiesce_io = 0; in mpt_SoftResetHandler()
7113 ioc->taskmgmt_in_progress = 0; in mpt_SoftResetHandler()
7114 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); in mpt_SoftResetHandler()
7116 if (ioc->active) { /* otherwise, hard reset coming */ in mpt_SoftResetHandler()
7119 mpt_signal_reset(cb_idx, ioc, in mpt_SoftResetHandler()
7124 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_SoftResetHandler()
7126 ioc->name, jiffies_to_msecs(jiffies - time_count)/1000, in mpt_SoftResetHandler()
7142 mpt_Soft_Hard_ResetHandler(MPT_ADAPTER *ioc, int sleepFlag) { in mpt_Soft_Hard_ResetHandler() argument
7145 ret = mpt_SoftResetHandler(ioc, sleepFlag); in mpt_Soft_Hard_ResetHandler()
7148 ret = mpt_HardResetHandler(ioc, sleepFlag); in mpt_Soft_Hard_ResetHandler()
7175 mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag) in mpt_HardResetHandler() argument
7182 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "HardResetHandler Entered!\n", ioc->name)); in mpt_HardResetHandler()
7184 printk(MYIOC_s_INFO_FMT "HardResetHandler Entered!\n", ioc->name); in mpt_HardResetHandler()
7185 printk("MF count 0x%x !\n", ioc->mfcnt); in mpt_HardResetHandler()
7188 mpt_halt_firmware(ioc); in mpt_HardResetHandler()
7193 spin_lock_irqsave(&ioc->taskmgmt_lock, flags); in mpt_HardResetHandler()
7194 if (ioc->ioc_reset_in_progress) { in mpt_HardResetHandler()
7195 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); in mpt_HardResetHandler()
7196 ioc->wait_on_reset_completion = 1; in mpt_HardResetHandler()
7199 } while (ioc->ioc_reset_in_progress == 1); in mpt_HardResetHandler()
7200 ioc->wait_on_reset_completion = 0; in mpt_HardResetHandler()
7201 return ioc->reset_status; in mpt_HardResetHandler()
7203 if (ioc->wait_on_reset_completion) { in mpt_HardResetHandler()
7204 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); in mpt_HardResetHandler()
7209 ioc->ioc_reset_in_progress = 1; in mpt_HardResetHandler()
7210 if (ioc->alt_ioc) in mpt_HardResetHandler()
7211 ioc->alt_ioc->ioc_reset_in_progress = 1; in mpt_HardResetHandler()
7212 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); in mpt_HardResetHandler()
7222 mpt_signal_reset(cb_idx, ioc, MPT_IOC_SETUP_RESET); in mpt_HardResetHandler()
7223 if (ioc->alt_ioc) in mpt_HardResetHandler()
7224 mpt_signal_reset(cb_idx, ioc->alt_ioc, in mpt_HardResetHandler()
7230 rc = mpt_do_ioc_recovery(ioc, MPT_HOSTEVENT_IOC_RECOVER, sleepFlag); in mpt_HardResetHandler()
7234 rc, ioc->name, mpt_GetIocState(ioc, 0)); in mpt_HardResetHandler()
7236 if (ioc->hard_resets < -1) in mpt_HardResetHandler()
7237 ioc->hard_resets++; in mpt_HardResetHandler()
7240 spin_lock_irqsave(&ioc->taskmgmt_lock, flags); in mpt_HardResetHandler()
7241 ioc->ioc_reset_in_progress = 0; in mpt_HardResetHandler()
7242 ioc->taskmgmt_quiesce_io = 0; in mpt_HardResetHandler()
7243 ioc->taskmgmt_in_progress = 0; in mpt_HardResetHandler()
7244 ioc->reset_status = rc; in mpt_HardResetHandler()
7245 if (ioc->alt_ioc) { in mpt_HardResetHandler()
7246 ioc->alt_ioc->ioc_reset_in_progress = 0; in mpt_HardResetHandler()
7247 ioc->alt_ioc->taskmgmt_quiesce_io = 0; in mpt_HardResetHandler()
7248 ioc->alt_ioc->taskmgmt_in_progress = 0; in mpt_HardResetHandler()
7250 spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); in mpt_HardResetHandler()
7254 mpt_signal_reset(cb_idx, ioc, MPT_IOC_POST_RESET); in mpt_HardResetHandler()
7255 if (ioc->alt_ioc) in mpt_HardResetHandler()
7257 ioc->alt_ioc, MPT_IOC_POST_RESET); in mpt_HardResetHandler()
7261 dtmprintk(ioc, in mpt_HardResetHandler()
7263 "HardResetHandler: completed (%d seconds): %s\n", ioc->name, in mpt_HardResetHandler()
7272 mpt_display_event_info(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply) in mpt_display_event_info() argument
7278 char *evStr = ioc->evStr; in mpt_display_event_info()
7704 devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT in mpt_display_event_info()
7706 ioc->name, event, evStr)); in mpt_display_event_info()
7708 devtverboseprintk(ioc, printk(KERN_DEBUG MYNAM in mpt_display_event_info()
7711 devtverboseprintk(ioc, printk(" %08x", in mpt_display_event_info()
7713 devtverboseprintk(ioc, printk(KERN_DEBUG "\n")); in mpt_display_event_info()
7728 ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply, int *evHandlers) in ProcessEventNotification() argument
7749 mpt_display_event_info(ioc, pEventReply); in ProcessEventNotification()
7763 if (ioc->facts.Function) { in ProcessEventNotification()
7764 ioc->facts.EventState = evState; in ProcessEventNotification()
7769 mptbase_raid_process_event_data(ioc, in ProcessEventNotification()
7780 if (ioc->events && (ioc->eventTypes & ( 1 << event))) { in ProcessEventNotification()
7783 idx = ioc->eventContext % MPTCTL_EVENT_LOG_SIZE; in ProcessEventNotification()
7785 ioc->events[idx].event = event; in ProcessEventNotification()
7786 ioc->events[idx].eventContext = ioc->eventContext; in ProcessEventNotification()
7790 ioc->events[idx].data[ii] = le32_to_cpu(pEventReply->Data[ii]); in ProcessEventNotification()
7792 ioc->events[idx].data[ii] = 0; in ProcessEventNotification()
7795 ioc->eventContext++; in ProcessEventNotification()
7804 devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT in ProcessEventNotification()
7806 ioc->name, cb_idx)); in ProcessEventNotification()
7807 r += (*(MptEvHandlers[cb_idx]))(ioc, pEventReply); in ProcessEventNotification()
7817 devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT in ProcessEventNotification()
7818 "EventAck required\n",ioc->name)); in ProcessEventNotification()
7819 if ((ii = SendEventAck(ioc, pEventReply)) != 0) { in ProcessEventNotification()
7820 devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SendEventAck returned %d\n", in ProcessEventNotification()
7821 ioc->name, ii)); in ProcessEventNotification()
7838 mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info) in mpt_fc_log_info() argument
7870 ioc->name, log_info, desc, (log_info & 0xFFFFFF)); in mpt_fc_log_info()
7882 mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info) in mpt_spi_log_info() argument
7938 printk(MYIOC_s_INFO_FMT "LogInfo(0x%08x): F/W: %s\n", ioc->name, log_info, desc); in mpt_spi_log_info()
8094 mpt_sas_log_info(MPT_ADAPTER *ioc, u32 log_info, u8 cb_idx) in mpt_sas_log_info() argument
8149 ioc->name, log_info, originator_desc, code_desc, in mpt_sas_log_info()
8155 ioc->name, log_info, originator_desc, code_desc, in mpt_sas_log_info()
8161 ioc->name, log_info, originator_desc, in mpt_sas_log_info()
8176 mpt_iocstatus_info_config(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf) in mpt_iocstatus_info_config() argument
8241 dreplyprintk(ioc, printk(MYIOC_s_DEBUG_FMT "IOCStatus(0x%04X): %s: %s\n", in mpt_iocstatus_info_config()
8242 ioc->name, ioc_status, desc, extend_desc)); in mpt_iocstatus_info_config()
8254 mpt_iocstatus_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf) in mpt_iocstatus_info() argument
8307 mpt_iocstatus_info_config(ioc, status, mf); in mpt_iocstatus_info()
8468 dreplyprintk(ioc, printk(MYIOC_s_DEBUG_FMT "IOCStatus(0x%04X): %s\n", in mpt_iocstatus_info()
8469 ioc->name, status, desc)); in mpt_iocstatus_info()