27 #include <linux/types.h>
28 #include <linux/errno.h>
29 #include <linux/kernel.h>
32 #include <linux/pci.h>
33 #include <linux/wait.h>
35 #include <linux/sched.h>
39 #include <linux/module.h>
43 #include <linux/slab.h>
45 #include <asm/processor.h>
48 #include <scsi/scsi.h>
61 static unsigned int pmcraid_debug_log;
62 static unsigned int pmcraid_disable_aen;
64 static unsigned int pmcraid_enable_msix;
77 static unsigned int pmcraid_major;
78 static struct class *pmcraid_class;
91 "Enables firmware error code logging, default :1 high-severity"
92 " errors, 2: all errors including high-severity errors,"
93 " 0: disables logging");
97 "Enable driver verbose message logging. Set 1 to enable."
102 "Disable driver aen notifications to apps. Set 1 to disable."
113 .global_intr_mask = 0x00034,
114 .ioa_host_intr = 0x0009C,
115 .ioa_host_intr_clr = 0x000A0,
116 .ioa_host_msix_intr = 0x7FC40,
117 .ioa_host_mask = 0x7FC28,
118 .ioa_host_mask_clr = 0x7FC28,
119 .host_ioa_intr = 0x00020,
120 .host_ioa_intr_clr = 0x00020,
121 .transop_timeout = 300
151 static int pmcraid_slave_alloc(
struct scsi_device *scsi_dev)
160 pinstance = shost_priv(scsi_dev->
host);
177 target = temp->
cfg_entry.array_id & 0xFF;
191 if (bus == scsi_dev->
channel &&
192 target == scsi_dev->
id &&
193 lun == scsi_dev->
lun) {
207 spin_unlock_irqrestore(&pinstance->
resource_lock, lock_flags);
224 static int pmcraid_slave_configure(
struct scsi_device *scsi_dev)
237 scsi_dev->
host->unique_id,
254 scsi_activate_tcq(scsi_dev, scsi_dev->
queue_depth);
256 scsi_dev->
host->cmd_per_lun);
259 scsi_dev->
host->cmd_per_lun);
276 static void pmcraid_slave_destroy(
struct scsi_device *scsi_dev)
297 static int pmcraid_change_queue_depth(
struct scsi_device *scsi_dev,
int depth,
319 static int pmcraid_change_queue_type(
struct scsi_device *scsi_dev,
int tag)
327 scsi_set_tag_type(scsi_dev, tag);
330 scsi_activate_tcq(scsi_dev, scsi_dev->
queue_depth);
332 scsi_deactivate_tcq(scsi_dev, scsi_dev->
queue_depth);
379 cmd->
ioa_cb->ioasa.ioasc = 0;
380 cmd->
ioa_cb->ioasa.residual_data_length = 0;
433 pmcraid_reinit_cmdblk(cmd);
478 static void pmcraid_disable_interrupts(
492 pinstance->
int_regs.ioa_host_interrupt_mask_reg);
506 static void pmcraid_enable_interrupts(
518 pinstance->
int_regs.ioa_host_interrupt_mask_reg);
522 pmcraid_info(
"enabled interrupts global mask = %x intr_mask = %x\n",
535 static void pmcraid_clr_trans_op(
543 pinstance->
int_regs.ioa_host_interrupt_mask_reg);
546 pinstance->
int_regs.ioa_host_interrupt_clr_reg);
553 pinstance->
host->host_lock, lock_flags);
555 spin_unlock_irqrestore(
556 pinstance->
host->host_lock, lock_flags);
598 static void pmcraid_ioa_reset(
struct pmcraid_cmd *);
600 static void pmcraid_bist_done(
struct pmcraid_cmd *cmd)
612 pmcraid_info(
"BIST not complete, waiting another 2 secs\n");
616 cmd->
timer.function =
617 (
void (*)(
unsigned long))pmcraid_bist_done;
621 pmcraid_info(
"BIST is complete, proceeding with reset\n");
623 pmcraid_ioa_reset(cmd);
624 spin_unlock_irqrestore(pinstance->
host->host_lock, lock_flags);
634 static void pmcraid_start_bist(
struct pmcraid_cmd *cmd)
637 u32 doorbells, intrs;
641 pinstance->
int_regs.host_ioa_interrupt_reg);
644 pmcraid_info(
"doorbells after start bist: %x intrs: %x\n",
650 cmd->
timer.function = (
void (*)(
unsigned long))pmcraid_bist_done;
660 static void pmcraid_reset_alert_done(
struct pmcraid_cmd *cmd)
672 pmcraid_info(
"critical op is reset proceeding with reset\n");
674 pmcraid_ioa_reset(cmd);
675 spin_unlock_irqrestore(pinstance->
host->host_lock, lock_flags);
677 pmcraid_info(
"critical op is not yet reset waiting again\n");
682 cmd->
timer.function =
683 (
void (*)(
unsigned long))pmcraid_reset_alert_done;
698 static void pmcraid_reset_alert(
struct pmcraid_cmd *cmd)
721 cmd->
timer.function =
722 (
void (*)(
unsigned long))pmcraid_reset_alert_done;
726 pinstance->
int_regs.host_ioa_interrupt_reg);
729 pmcraid_info(
"doorbells after reset alert: %x\n", doorbells);
731 pmcraid_info(
"PCI config is not accessible starting BIST\n");
733 pmcraid_start_bist(cmd);
747 static void pmcraid_timeout_handler(
struct pmcraid_cmd *cmd)
753 "Adapter being reset due to cmd(CDB[0] = %x) timeout\n",
754 cmd->
ioa_cb->ioarcb.cdb[0]);
765 cmd = pmcraid_get_free_cmd(pinstance);
771 spin_unlock_irqrestore(pinstance->
host->host_lock,
773 pmcraid_err(
"no free cmnd block for timeout handler\n");
787 pmcraid_err(
"cmd is pending but reset in progress\n");
802 pmcraid_notify_ioastate(pinstance,
807 pmcraid_reset_alert(cmd);
808 spin_unlock_irqrestore(pinstance->
host->host_lock, lock_flags);
819 static void pmcraid_internal_done(
struct pmcraid_cmd *cmd)
821 pmcraid_info(
"response internal cmd CDB[0] = %x ioasc = %x\n",
822 cmd->
ioa_cb->ioarcb.cdb[0],
857 static void pmcraid_reinit_cfgtable_done(
struct pmcraid_cmd *cmd)
859 pmcraid_info(
"response internal cmd CDB[0] = %x ioasc = %x\n",
860 cmd->
ioa_cb->ioarcb.cdb[0],
867 pmcraid_info(
"scheduling worker for config table reinitialization\n");
881 static void pmcraid_erp_done(
struct pmcraid_cmd *cmd)
890 "command CDB[0] = %x failed with IOASC: 0x%08X\n",
891 cmd->
ioa_cb->ioarcb.cdb[0], ioasc);
924 static void _pmcraid_fire_command(
struct pmcraid_cmd *cmd)
959 static void pmcraid_send_cmd(
962 unsigned long timeout,
978 _pmcraid_fire_command(cmd);
988 static void pmcraid_ioa_shutdown_done(
struct pmcraid_cmd *cmd)
994 pmcraid_ioa_reset(cmd);
995 spin_unlock_irqrestore(pinstance->
host->host_lock, lock_flags);
1006 static void pmcraid_ioa_shutdown(
struct pmcraid_cmd *cmd)
1008 pmcraid_info(
"response for Cancel CCN CDB[0] = %x ioasc = %x\n",
1009 cmd->
ioa_cb->ioarcb.cdb[0],
1015 pmcraid_reinit_cmdblk(cmd);
1017 cmd->
ioa_cb->ioarcb.resource_handle =
1023 pmcraid_info(
"firing normal shutdown command (%d) to IOA\n",
1028 pmcraid_send_cmd(cmd, pmcraid_ioa_shutdown_done,
1030 pmcraid_timeout_handler);
1041 static void pmcraid_querycfg(
struct pmcraid_cmd *);
1043 static void pmcraid_get_fwversion_done(
struct pmcraid_cmd *cmd)
1054 pmcraid_err(
"IOA Inquiry failed with %x\n", ioasc);
1057 pmcraid_reset_alert(cmd);
1058 spin_unlock_irqrestore(pinstance->
host->host_lock, lock_flags);
1060 pmcraid_querycfg(cmd);
1072 static void pmcraid_get_fwversion(
struct pmcraid_cmd *cmd)
1079 pmcraid_reinit_cmdblk(cmd);
1084 ioarcb->
cdb[2] = 0xD0;
1085 ioarcb->
cdb[3] = (data_size >> 8) & 0xFF;
1086 ioarcb->
cdb[4] = data_size & 0xFF;
1098 ioadl = &(ioarcb->
add_data.u.ioadl[0]);
1103 pmcraid_send_cmd(cmd, pmcraid_get_fwversion_done,
1114 static void pmcraid_identify_hrrq(
struct pmcraid_cmd *cmd)
1123 pmcraid_reinit_cmdblk(cmd);
1127 done_function = pmcraid_identify_hrrq;
1130 done_function = pmcraid_get_fwversion;
1145 pmcraid_info(
"HRRQ_IDENTIFY with hrrq:ioarcb:index => %llx:%llx:%x\n",
1148 memcpy(&(ioarcb->
cdb[2]), &hrrq_addr,
sizeof(hrrq_addr));
1149 memcpy(&(ioarcb->
cdb[10]), &hrrq_size,
sizeof(hrrq_size));
1155 pmcraid_send_cmd(cmd, done_function,
1157 pmcraid_timeout_handler);
1160 static void pmcraid_process_ccn(
struct pmcraid_cmd *cmd);
1161 static void pmcraid_process_ldn(
struct pmcraid_cmd *cmd);
1171 static void pmcraid_send_hcam_cmd(
struct pmcraid_cmd *cmd)
1204 cmd = pmcraid_get_free_cmd(pinstance);
1215 hcam = &pinstance->
ccn;
1220 hcam = &pinstance->
ldn;
1226 ioarcb = &cmd->
ioa_cb->ioarcb;
1238 ioarcb->
cdb[7] = (rcb_size >> 8) & 0xFF;
1239 ioarcb->
cdb[8] = (rcb_size) & 0xFF;
1263 struct pmcraid_cmd *cmd = pmcraid_init_hcam(pinstance, type);
1264 pmcraid_send_hcam_cmd(cmd);
1274 static void pmcraid_prepare_cancel_cmd(
1280 __be64 ioarcb_addr = cmd_to_cancel->
ioa_cb->ioarcb.ioarcb_bus_addr;
1295 memcpy(&(ioarcb->
cdb[2]), &ioarcb_addr,
sizeof(ioarcb_addr));
1305 static void pmcraid_cancel_hcam(
1316 &pinstance->
ldn : &pinstance->
ccn;
1324 pmcraid_prepare_cancel_cmd(cmd, hcam->
cmd);
1331 pmcraid_timeout_handler);
1339 static void pmcraid_cancel_ccn(
struct pmcraid_cmd *cmd)
1341 pmcraid_info(
"response for Cancel LDN CDB[0] = %x ioasc = %x\n",
1342 cmd->
ioa_cb->ioarcb.cdb[0],
1345 pmcraid_reinit_cmdblk(cmd);
1347 pmcraid_cancel_hcam(cmd,
1349 pmcraid_ioa_shutdown);
1357 static void pmcraid_cancel_ldn(
struct pmcraid_cmd *cmd)
1359 pmcraid_cancel_hcam(cmd,
1361 pmcraid_cancel_ccn);
1373 static int pmcraid_expose_resource(
u16 fw_version,
1397 #define PMCRAID_AEN_ATTR_MAX (__PMCRAID_AEN_ATTR_MAX - 1)
1405 #define PMCRAID_AEN_CMD_MAX (__PMCRAID_AEN_CMD_MAX - 1)
1407 static struct genl_family pmcraid_event_family = {
1421 static int pmcraid_netlink_init(
void)
1431 pmcraid_event_family.
id);
1442 static void pmcraid_netlink_release(
void)
1455 static int pmcraid_notify_aen(
1466 aen_msg->
hostno = (pinstance->
host->unique_id << 16 |
1470 data_size +=
sizeof(*aen_msg);
1472 total_size = nla_total_size(data_size);
1474 nla_genl_hdr_total_size =
1476 ((
struct genl_family *)&pmcraid_event_family)->hdrsize)
1482 pmcraid_err(
"Failed to allocate aen data SKB of size: %x\n",
1489 &pmcraid_event_family, 0,
1500 pmcraid_err(
"failed to copy AEN attribute data\n");
1506 result = genlmsg_end(
skb, msg_header);
1521 pmcraid_info(
"error (%x) sending aen event message\n", result);
1534 return pmcraid_notify_aen(pinstance,
1536 pinstance->
ccn.hcam->data_len +
1549 return pmcraid_notify_aen(pinstance,
1551 pinstance->
ldn.hcam->data_len +
1565 pinstance->
scn.ioa_state =
evt;
1566 pmcraid_notify_aen(pinstance,
1567 &pinstance->
scn.msg,
1579 static void pmcraid_handle_config_change(
struct pmcraid_instance *pinstance)
1587 unsigned long host_lock_flags;
1589 u32 hidden_entry = 0;
1597 pmcraid_info(
"CCN(%x): %x timestamp: %llx type: %x lost: %x flags: %x \
1598 res: %x:%x:%x:%x\n",
1599 pinstance->
ccn.hcam->ilid,
1600 pinstance->
ccn.hcam->op_code,
1601 ((pinstance->
ccn.hcam->timestamp1) |
1602 ((pinstance->
ccn.hcam->timestamp2 & 0xffffffffLL) << 32)),
1603 pinstance->
ccn.hcam->notification_type,
1604 pinstance->
ccn.hcam->notification_lost,
1605 pinstance->
ccn.hcam->flags,
1606 pinstance->
host->unique_id,
1619 if (pinstance->
ccn.hcam->notification_lost) {
1620 cfgcmd = pmcraid_get_free_cmd(pinstance);
1624 pmcraid_querycfg(cfgcmd);
1626 pmcraid_err(
"lost CCN, no free cmd for querycfg\n");
1628 goto out_notify_apps;
1635 if (pinstance->
ccn.hcam->notification_type ==
1644 }
else if (!pmcraid_expose_resource(fw_version, cfg_entry)) {
1645 goto out_notify_apps;
1664 goto out_notify_apps;
1677 pmcraid_send_hcam(pinstance,
1679 spin_unlock_irqrestore(pinstance->
host->host_lock,
1695 if (pinstance->
ccn.hcam->notification_type ==
1714 spin_unlock_irqrestore(&pinstance->
resource_lock, lock_flags);
1719 if (!pmcraid_disable_aen)
1720 pmcraid_notify_ccn(pinstance);
1724 pmcraid_send_hcam_cmd(cmd);
1736 for (i = 0; i <
ARRAY_SIZE(pmcraid_ioasc_error_table); i++) {
1737 if (pmcraid_ioasc_error_table[i].
ioasc_code == ioasc)
1738 return &pmcraid_ioasc_error_table[
i];
1752 if (error_info ==
NULL ||
1757 pmcraid_err(
"cmd [%x] for resource %x failed with %x(%s)\n",
1758 cmd->
ioa_cb->ioarcb.cdb[0],
1759 cmd->
ioa_cb->ioarcb.resource_handle,
1779 (
"LDN(%x): %x type: %x lost: %x flags: %x overlay id: %x\n",
1780 pinstance->
ldn.hcam->ilid,
1781 pinstance->
ldn.hcam->op_code,
1782 pinstance->
ldn.hcam->notification_type,
1783 pinstance->
ldn.hcam->notification_lost,
1784 pinstance->
ldn.hcam->flags,
1785 pinstance->
ldn.hcam->overlay_id);
1788 if (pinstance->
ldn.hcam->notification_type !=
1792 if (pinstance->
ldn.hcam->notification_lost ==
1794 dev_info(&pinstance->
pdev->dev,
"Error notifications lost\n");
1801 "UnitAttention due to IOA Bus Reset\n");
1820 static void pmcraid_process_ccn(
struct pmcraid_cmd *cmd)
1838 "Host RCB (CCN) failed with IOASC: 0x%08X\n", ioasc);
1841 spin_unlock_irqrestore(pinstance->
host->host_lock, lock_flags);
1843 pmcraid_handle_config_change(pinstance);
1855 static void pmcraid_set_timestamp(
struct pmcraid_cmd *cmd);
1857 static void pmcraid_process_ldn(
struct pmcraid_cmd *cmd)
1877 }
else if (!ioasc) {
1878 pmcraid_handle_error_log(pinstance);
1882 pmcraid_initiate_reset(pinstance);
1883 spin_unlock_irqrestore(pinstance->
host->host_lock,
1889 pmcraid_set_timestamp(cmd);
1893 "Host RCB(LDN) failed with IOASC: 0x%08X\n", ioasc);
1896 if (!pmcraid_disable_aen)
1897 pmcraid_notify_ldn(pinstance);
1901 pmcraid_send_hcam_cmd(cmd);
1922 static void pmcraid_unregister_hcams(
struct pmcraid_cmd *cmd)
1943 pmcraid_reset_alert(cmd);
1951 pmcraid_cancel_ldn(cmd);
1966 pmcraid_reinit_buffers(pinstance);
1967 intrs = pmcraid_read_interrupts(pinstance);
1973 iowrite32(INTRS_TRANSITION_TO_OPERATIONAL,
1975 ioa_host_interrupt_mask_reg);
1976 iowrite32(INTRS_TRANSITION_TO_OPERATIONAL,
1977 pinstance->
int_regs.ioa_host_interrupt_clr_reg);
1992 static void pmcraid_soft_reset(
struct pmcraid_cmd *cmd)
2006 cmd->
timer.function = (
void (*)(
unsigned long))pmcraid_timeout_handler;
2008 if (!timer_pending(&cmd->
timer))
2022 pinstance->
int_regs.host_ioa_interrupt_reg);
2030 pmcraid_info(
"Waiting for IOA to become operational %x:%x\n",
2060 static void pmcraid_fail_outstanding_cmds(
struct pmcraid_instance *pinstance)
2074 cmd->
ioa_cb->ioasa.ioasc =
2076 cmd->
ioa_cb->ioasa.ilid =
2099 cmd->
ioa_cb->ioarcb.cdb[0],
2102 }
else if (cmd->
cmd_done == pmcraid_internal_done ||
2103 cmd->
cmd_done == pmcraid_erp_done) {
2105 }
else if (cmd->
cmd_done != pmcraid_ioa_reset &&
2106 cmd->
cmd_done != pmcraid_ioa_shutdown_done) {
2132 static void pmcraid_ioa_reset(
struct pmcraid_cmd *cmd)
2135 u8 reset_complete = 0;
2140 pmcraid_err(
"reset is called with different command block\n");
2144 pmcraid_info(
"reset_engine: state = %d, command = %p\n",
2154 pmcraid_err(
"IOA is offline no reset is possible\n");
2163 pmcraid_disable_interrupts(pinstance, ~0);
2165 pmcraid_reset_alert(cmd);
2180 INTRS_TRANSITION_TO_OPERATIONAL) {
2183 pmcraid_reinit_cmdblk(cmd);
2184 pmcraid_identify_hrrq(cmd);
2187 pmcraid_soft_reset(cmd);
2194 pmcraid_reset_alert(cmd);
2205 pmcraid_start_bist(cmd);
2214 pmcraid_err(
"IOA didn't respond marking it as dead\n");
2218 pmcraid_notify_ioastate(pinstance,
2221 pmcraid_notify_ioastate(pinstance,
2233 pmcraid_fail_outstanding_cmds(pinstance);
2239 pmcraid_get_dump(pinstance);
2242 pmcraid_reset_alert(cmd);
2255 pmcraid_notify_ioastate(pinstance,
2263 if (pmcraid_reset_enable_ioa(pinstance)) {
2266 pmcraid_reinit_cmdblk(cmd);
2267 pmcraid_identify_hrrq(cmd);
2270 pmcraid_soft_reset(cmd);
2279 pmcraid_info(
"In softreset proceeding with bring-up\n");
2286 pmcraid_identify_hrrq(cmd);
2306 pmcraid_notify_ioastate(pinstance,
2312 pmcraid_reinit_cmdblk(cmd);
2313 pmcraid_unregister_hcams(cmd);
2323 if (reset_complete) {
2335 pmcraid_register_hcams(pinstance);
2363 cmd = pmcraid_get_free_cmd(pinstance);
2366 pmcraid_err(
"no cmnd blocks for initiate_reset\n");
2373 pmcraid_notify_ioastate(pinstance,
2375 pmcraid_ioa_reset(cmd);
2393 static int pmcraid_reset_reload(
2406 pmcraid_info(
"reset_reload: reset is already in progress\n");
2408 spin_unlock_irqrestore(pinstance->
host->host_lock, lock_flags);
2416 spin_unlock_irqrestore(pinstance->
host->host_lock,
2420 }
else if (pinstance->
ioa_state == target_state) {
2428 reset_cmd = pmcraid_get_free_cmd(pinstance);
2430 if (reset_cmd ==
NULL) {
2432 spin_unlock_irqrestore(pinstance->
host->host_lock,
2444 pmcraid_ioa_reset(reset_cmd);
2445 spin_unlock_irqrestore(pinstance->
host->host_lock, lock_flags);
2446 pmcraid_info(
"reset_reload: waiting for reset to complete\n");
2452 if (pinstance->
ioa_state == target_state)
2469 return pmcraid_reset_reload(pinstance,
2486 return pmcraid_reset_reload(pinstance,
2498 static void pmcraid_request_sense(
struct pmcraid_cmd *cmd)
2510 (
"couldn't allocate sense buffer for request sense\n");
2511 pmcraid_erp_done(cmd);
2541 pmcraid_send_cmd(cmd, pmcraid_erp_done,
2543 pmcraid_timeout_handler);
2559 : pmcraid_request_sense;
2579 pmcraid_timeout_handler);
2590 static void pmcraid_frame_auto_sense(
struct pmcraid_cmd *cmd)
2603 ioasa->
u.
vset.failing_lba_hi != 0) {
2605 sense_buf[0] = 0x72;
2612 sense_buf[9] = 0x0A;
2613 sense_buf[10] = 0x80;
2617 sense_buf[12] = (failing_lba & 0xff000000) >> 24;
2618 sense_buf[13] = (failing_lba & 0x00ff0000) >> 16;
2619 sense_buf[14] = (failing_lba & 0x0000ff00) >> 8;
2620 sense_buf[15] = failing_lba & 0x000000ff;
2624 sense_buf[16] = (failing_lba & 0xff000000) >> 24;
2625 sense_buf[17] = (failing_lba & 0x00ff0000) >> 16;
2626 sense_buf[18] = (failing_lba & 0x0000ff00) >> 8;
2627 sense_buf[19] = failing_lba & 0x000000ff;
2629 sense_buf[0] = 0x70;
2638 vset.failing_lba_lo);
2639 sense_buf[0] |= 0x80;
2640 sense_buf[3] = (failing_lba >> 24) & 0xff;
2641 sense_buf[4] = (failing_lba >> 16) & 0xff;
2642 sense_buf[5] = (failing_lba >> 8) & 0xff;
2643 sense_buf[6] = failing_lba & 0xff;
2662 static int pmcraid_error_handler(
struct pmcraid_cmd *cmd)
2670 u32 sense_copied = 0;
2685 pmcraid_frame_auto_sense(cmd);
2691 switch (masked_ioasc) {
2715 scsi_cmd->
device->channel);
2746 pmcraid_cancel_all(cmd, sense_copied);
2747 else if (sense_copied)
2748 pmcraid_erp_done(cmd);
2750 pmcraid_request_sense(cmd);
2778 static int pmcraid_reset_device(
2780 unsigned long timeout,
2793 res = scsi_cmd->
device->hostdata;
2797 "reset_device: NULL resource pointer\n");
2808 spin_unlock_irqrestore(pinstance->
host->host_lock, lock_flags);
2819 cmd = pmcraid_get_free_cmd(pinstance);
2822 spin_unlock_irqrestore(pinstance->
host->host_lock, lock_flags);
2823 pmcraid_err(
"%s: no cmd blocks are available\n", __func__);
2827 ioarcb = &cmd->
ioa_cb->ioarcb;
2841 pmcraid_info(
"cmd(CDB[0] = %x) for %x with index = %d\n",
2842 cmd->
ioa_cb->ioarcb.cdb[0],
2846 pmcraid_send_cmd(cmd,
2847 pmcraid_internal_done,
2849 pmcraid_timeout_handler);
2851 spin_unlock_irqrestore(pinstance->
host->host_lock, lock_flags);
2886 static int _pmcraid_io_done(
struct pmcraid_cmd *cmd,
int reslen,
int ioasc)
2891 scsi_set_resid(scsi_cmd, reslen);
2893 pmcraid_info(
"response(%d) CDB[0] = %x ioasc:result: %x:%x\n",
2895 cmd->
ioa_cb->ioarcb.cdb[0],
2896 ioasc, scsi_cmd->
result);
2899 rc = pmcraid_error_handler(cmd);
2921 static void pmcraid_io_done(
struct pmcraid_cmd *cmd)
2926 if (_pmcraid_io_done(cmd, reslen, ioasc) == 0)
2945 res = cmd->
scsi_cmd->device->hostdata;
2947 cancel_cmd = pmcraid_get_free_cmd(pinstance);
2949 if (cancel_cmd ==
NULL) {
2950 pmcraid_err(
"%s: no cmd blocks are available\n", __func__);
2954 pmcraid_prepare_cancel_cmd(cancel_cmd, cmd);
2956 pmcraid_info(
"aborting command CDB[0]= %x with index = %d\n",
2957 cmd->
ioa_cb->ioarcb.cdb[0],
2958 cmd->
ioa_cb->ioarcb.response_handle >> 2);
2965 cancel_cmd->
ioa_cb->ioarcb.cdb[0],
2968 pmcraid_send_cmd(cancel_cmd,
2969 pmcraid_internal_done,
2971 pmcraid_timeout_handler);
2984 static int pmcraid_abort_complete(
struct pmcraid_cmd *cancel_cmd)
2990 res = cancel_cmd->
res;
3021 static int pmcraid_eh_abort_handler(
struct scsi_cmnd *scsi_cmd)
3026 unsigned long host_lock_flags;
3027 unsigned long pending_lock_flags;
3036 "I/O command timed out, aborting it.\n");
3038 res = scsi_cmd->
device->hostdata;
3052 spin_unlock_irqrestore(pinstance->
host->host_lock,
3072 pending_lock_flags);
3078 cancel_cmd = pmcraid_abort_cmd(cmd);
3080 spin_unlock_irqrestore(pinstance->
host->host_lock,
3084 cancel_cmd->
res = cmd->
scsi_cmd->device->hostdata;
3085 rc = pmcraid_abort_complete(cancel_cmd);
3088 return cmd_found ? rc :
SUCCESS;
3105 static int pmcraid_eh_device_reset_handler(
struct scsi_cmnd *scmd)
3108 "resetting device due to an I/O command timeout.\n");
3109 return pmcraid_reset_device(scmd,
3114 static int pmcraid_eh_bus_reset_handler(
struct scsi_cmnd *scmd)
3117 "Doing bus reset due to an I/O command timeout.\n");
3118 return pmcraid_reset_device(scmd,
3123 static int pmcraid_eh_target_reset_handler(
struct scsi_cmnd *scmd)
3126 "Doing target reset due to an I/O command timeout.\n");
3127 return pmcraid_reset_device(scmd,
3129 RESET_DEVICE_TARGET);
3142 static int pmcraid_eh_host_reset_handler(
struct scsi_cmnd *scmd)
3162 "Adapter being reset due to an I/O command timeout.\n");
3163 return pmcraid_reset_bringup(pinstance) == 0 ?
SUCCESS :
FAILED;
3173 static u8 pmcraid_task_attributes(
struct scsi_cmnd *scsi_cmd)
3178 if (scsi_populate_tag_msg(scsi_cmd, tag)) {
3210 int ioadl_count = 0;
3228 ioadl = &ioarcb->
add_data.u.ioadl[3];
3235 ioadl = &ioarcb->
add_data.u.ioadl[ioadl_count];
3254 static int pmcraid_build_ioadl(
3279 "sg count is (%d) more than allowed!\n", nseg);
3316 for (i = 0; i < sglist->
num_sg; i++)
3344 order = (sg_size > 0) ?
get_order(sg_size) : 0;
3348 if (buflen % bsize_elem)
3349 num_elem = (buflen / bsize_elem) + 1;
3351 num_elem = buflen / bsize_elem;
3355 (
sizeof(
struct scatterlist) * (num_elem - 1)),
3364 sglist->
num_sg = num_elem;
3367 for (i = 0; i < num_elem; i++) {
3370 for (j = i - 1; j >= 0; j--)
3376 sg_set_page(&scatterlist[i], page,
3377 sg_size < bsize_elem ? sg_size : bsize_elem, 0);
3378 sg_size -= bsize_elem;
3396 static int pmcraid_copy_sglist(
3403 struct scatterlist *scatterlist;
3414 for (i = 0; i < (len / bsize_elem); i++, buffer += bsize_elem) {
3415 struct page *page = sg_page(&scatterlist[i]);
3428 pmcraid_err(
"failed to copy user data into sg list\n");
3432 scatterlist[
i].length = bsize_elem;
3435 if (len % bsize_elem) {
3436 struct page *page = sg_page(&scatterlist[i]);
3451 scatterlist[
i].length = len % bsize_elem;
3455 pmcraid_err(
"failed to copy user data into sg list\n");
3476 static int pmcraid_queuecommand_lck(
3492 res = scsi_cmd->
device->hostdata;
3499 pmcraid_info(
"IOA is dead, but queuecommand is scheduled\n");
3513 pmcraid_info(
"SYNC_CACHE(0x35), completing in driver itself\n");
3519 cmd = pmcraid_get_free_cmd(pinstance);
3522 pmcraid_err(
"free command block is not available\n");
3527 ioarcb = &(cmd->
ioa_cb->ioarcb);
3557 rc = pmcraid_build_ioadl(pinstance, cmd);
3559 pmcraid_info(
"command (%d) CDB[0] = %x for %x:%x:%x:%x\n",
3561 scsi_cmd->
cmnd[0], pinstance->
host->unique_id,
3572 _pmcraid_fire_command(cmd);
3574 pmcraid_err(
"queuecommand could not build ioadl\n");
3596 filep->private_data = pinstance;
3604 static int pmcraid_chr_release(
struct inode *inode,
struct file *filep)
3620 static int pmcraid_chr_fasync(
int fd,
struct file *filep,
int mode)
3645 static int pmcraid_build_passthrough_ioadls(
3652 struct scatterlist *
sg =
NULL;
3657 sglist = pmcraid_alloc_sglist(buflen);
3660 pmcraid_err(
"can't allocate memory for passthrough SGls\n");
3666 sglist->
num_sg, direction);
3670 "Failed to map passthrough buffer!\n");
3671 pmcraid_free_sglist(sglist);
3704 static void pmcraid_release_passthrough_ioadls(
3717 pmcraid_free_sglist(sglist);
3732 static long pmcraid_ioctl_passthrough(
3734 unsigned int ioctl_cmd,
3735 unsigned int buflen,
3744 unsigned long request_offset;
3776 pmcraid_err(
"no memory for passthrough buffer\n");
3783 request_buffer = arg + request_offset;
3794 pmcraid_err(
"ioctl: can't copy passthrough buffer\n");
3796 goto out_free_buffer;
3799 request_size = buffer->
ioarcb.data_transfer_length;
3809 if (request_size > 0) {
3810 rc =
access_ok(access, arg, request_offset + request_size);
3814 goto out_free_buffer;
3816 }
else if (request_size < 0) {
3818 goto out_free_buffer;
3824 goto out_free_buffer;
3827 cmd = pmcraid_get_free_cmd(pinstance);
3830 pmcraid_err(
"free command block is not available\n");
3832 goto out_free_buffer;
3836 ioarcb = &(cmd->
ioa_cb->ioarcb);
3847 if (buffer->
ioarcb.add_cmd_param_length) {
3849 buffer->
ioarcb.add_cmd_param_length;
3851 buffer->
ioarcb.add_cmd_param_offset;
3853 buffer->
ioarcb.add_data.u.add_cmd_params,
3854 buffer->
ioarcb.add_cmd_param_length);
3866 rc = pmcraid_build_passthrough_ioadls(cmd,
3870 pmcraid_err(
"couldn't build passthrough ioadls\n");
3871 goto out_free_buffer;
3873 }
else if (request_size < 0) {
3875 goto out_free_buffer;
3882 rc = pmcraid_copy_sglist(cmd->
sglist,
3888 goto out_free_sglist;
3895 cmd->
cmd_done = pmcraid_internal_done;
3901 cmd->
ioa_cb->ioarcb.cdb[0],
3905 _pmcraid_fire_command(cmd);
3906 spin_unlock_irqrestore(pinstance->
host->host_lock, lock_flags);
3914 buffer->
ioarcb.cmd_timeout = 0;
3920 if (buffer->
ioarcb.cmd_timeout == 0) {
3926 pmcraid_info(
"aborting cmd %d (CDB[0] = %x) due to timeout\n",
3928 cmd->
ioa_cb->ioarcb.cdb[0]);
3931 cancel_cmd = pmcraid_abort_cmd(cmd);
3932 spin_unlock_irqrestore(pinstance->
host->host_lock, lock_flags);
3936 ioasc = cancel_cmd->
ioa_cb->ioasa.ioasc;
3949 goto out_handle_response;
3960 pmcraid_reset_bringup(cmd->
drv_inst);
3965 out_handle_response:
3972 pmcraid_err(
"failed to copy ioasa buffer to user\n");
3980 rc = pmcraid_copy_sglist(cmd->
sglist,
3991 pmcraid_release_passthrough_ioadls(cmd, request_size, direction);
4014 static long pmcraid_ioctl_driver(
4017 unsigned int buflen,
4018 void __user *user_buffer
4024 pmcraid_err(
"ioctl_driver: access fault in request buffer\n");
4030 pmcraid_reset_bringup(pinstance);
4053 static int pmcraid_check_ioctl_buffer(
4063 pmcraid_err(
"couldn't copy ioctl header from user buffer\n");
4084 pmcraid_err(
"access failed for user buffer of size %d\n",
4095 static long pmcraid_chr_ioctl(
4108 pmcraid_err(
"failed to allocate memory for ioctl header\n");
4112 retval = pmcraid_check_ioctl_buffer(cmd, (
void *)arg, hdr);
4137 retval = pmcraid_ioctl_passthrough(pinstance,
4148 retval = pmcraid_ioctl_driver(pinstance,
4151 (
void __user *)arg);
4169 .open = pmcraid_chr_open,
4170 .release = pmcraid_chr_release,
4171 .fasync = pmcraid_chr_fasync,
4172 .unlocked_ioctl = pmcraid_chr_ioctl,
4173 #ifdef CONFIG_COMPAT
4174 .compat_ioctl = pmcraid_chr_ioctl,
4190 static ssize_t pmcraid_show_log_level(
4210 static ssize_t pmcraid_store_log_level(
4236 .name =
"log_level",
4239 .show = pmcraid_show_log_level,
4240 .store = pmcraid_store_log_level,
4251 static ssize_t pmcraid_show_drv_version(
4263 .name =
"drv_version",
4266 .show = pmcraid_show_drv_version,
4277 static ssize_t pmcraid_show_adapter_id(
4287 pinstance->
pdev->devfn;
4288 u32 aen_group = pmcraid_event_family.
id;
4291 "adapter id: %d\nminor: %d\naen group: %d\n",
4297 .name =
"adapter_id",
4300 .show = pmcraid_show_adapter_id,
4304 &pmcraid_log_level_attr,
4305 &pmcraid_driver_version_attr,
4306 &pmcraid_adapter_id_attr,
4315 .queuecommand = pmcraid_queuecommand,
4316 .eh_abort_handler = pmcraid_eh_abort_handler,
4317 .eh_bus_reset_handler = pmcraid_eh_bus_reset_handler,
4318 .eh_target_reset_handler = pmcraid_eh_target_reset_handler,
4319 .eh_device_reset_handler = pmcraid_eh_device_reset_handler,
4320 .eh_host_reset_handler = pmcraid_eh_host_reset_handler,
4322 .slave_alloc = pmcraid_slave_alloc,
4323 .slave_configure = pmcraid_slave_configure,
4324 .slave_destroy = pmcraid_slave_destroy,
4325 .change_queue_depth = pmcraid_change_queue_depth,
4326 .change_queue_type = pmcraid_change_queue_type,
4333 .shost_attrs = pmcraid_host_attrs,
4355 hrrq_id = hrrq_vector->
hrrq_id;
4360 intrs_val = pmcraid_read_interrupts(pinstance);
4369 if (intrs_val & PMCRAID_ERROR_INTERRUPTS) {
4374 initiating reset\n", intrs_val);
4377 pmcraid_initiate_reset(pinstance);
4378 spin_unlock_irqrestore(
4379 pinstance->
host->host_lock,
4386 if (intrs_val & INTRS_TRANSITION_TO_OPERATIONAL)
4387 pmcraid_clr_trans_op(pinstance);
4394 pinstance->
int_regs.host_ioa_interrupt_reg);
4401 tasklet_schedule(&(pinstance->
isr_tasklet[hrrq_id]));
4415 static irqreturn_t pmcraid_isr(
int irq,
void *dev_id)
4433 intrs = pmcraid_read_interrupts(pinstance);
4442 if (intrs & PMCRAID_ERROR_INTERRUPTS) {
4448 pinstance->
int_regs.ioa_host_interrupt_clr_reg);
4449 pmcraid_err(
"ISR: error interrupts: %x initiating reset\n",
4452 pinstance->
int_regs.ioa_host_interrupt_clr_reg);
4454 pmcraid_initiate_reset(pinstance);
4455 spin_unlock_irqrestore(pinstance->
host->host_lock, lock_flags);
4461 if (intrs & INTRS_TRANSITION_TO_OPERATIONAL) {
4462 pmcraid_clr_trans_op(pinstance);
4465 pinstance->
int_regs.ioa_host_interrupt_clr_reg);
4467 pinstance->
int_regs.ioa_host_interrupt_clr_reg);
4487 static void pmcraid_worker_function(
struct work_struct *workp)
4494 unsigned long host_lock_flags;
4517 spin_unlock_irqrestore(
4518 pinstance->
host->host_lock,
4522 list_move_tail(&res->
queue,
4524 spin_unlock_irqrestore(
4533 spin_unlock_irqrestore(
4534 pinstance->
host->host_lock,
4544 if (!pmcraid_expose_resource(fw_version,
4553 target = res->
cfg_entry.array_id & 0xFF;
4572 spin_unlock_irqrestore(&pinstance->
resource_lock, lock_flags);
4583 static void pmcraid_tasklet_function(
unsigned long instance)
4587 unsigned long hrrq_lock_flags;
4588 unsigned long pending_lock_flags;
4589 unsigned long host_lock_flags;
4612 int cmd_index = resp >> 2;
4624 pmcraid_err(
"Invalid response handle %d\n", cmd_index);
4629 cmd = pinstance->
cmd_list[cmd_index];
4630 spin_unlock_irqrestore(lockp, hrrq_lock_flags);
4633 pending_lock_flags);
4636 pending_lock_flags);
4640 if (cmd->
cmd_done == pmcraid_ioa_reset) {
4644 spin_unlock_irqrestore(pinstance->
host->host_lock,
4654 spin_unlock_irqrestore(lockp, hrrq_lock_flags);
4668 void pmcraid_unregister_interrupt_handler(
struct pmcraid_instance *pinstance)
4672 for (i = 0; i < pinstance->
num_hrrq; i++)
4695 if ((pmcraid_enable_msix) &&
4705 goto pmcraid_isr_legacy;
4713 goto pmcraid_isr_legacy;
4716 for (i = 0; i < num_hrrq; i++) {
4721 pmcraid_isr_msix, 0,
4727 for (j = 0; j <
i; j++)
4731 goto pmcraid_isr_legacy;
4738 pinstance->
int_regs.host_ioa_interrupt_reg);
4740 goto pmcraid_isr_out;
4768 pmcraid_release_cmd_blocks(
struct pmcraid_instance *pinstance,
int max_index)
4771 for (i = 0; i < max_index; i++) {
4791 pmcraid_release_control_blocks(
4801 for (i = 0; i < max_index; i++) {
4804 pinstance->
cmd_list[i]->ioa_cb_bus_addr);
4806 pinstance->
cmd_list[
i]->ioa_cb_bus_addr = 0;
4827 pinstance->
host->unique_id);
4841 pmcraid_release_cmd_blocks(pinstance, i);
4864 pinstance->
host->unique_id);
4880 &(pinstance->
cmd_list[i]->ioa_cb_bus_addr));
4882 if (!pinstance->
cmd_list[i]->ioa_cb) {
4883 pmcraid_release_control_blocks(pinstance, i);
4901 pmcraid_release_host_rrqs(
struct pmcraid_instance *pinstance,
int maxindex)
4904 for (i = 0; i < maxindex; i++) {
4932 for (i = 0; i < pinstance->
num_hrrq; i++) {
4940 pmcraid_err(
"pci_alloc failed for hrrq vector : %d\n",
4942 pmcraid_release_host_rrqs(pinstance, i);
4966 if (pinstance->
ccn.msg !=
NULL) {
4971 pinstance->
ccn.baddr);
4975 pinstance->
ccn.baddr = 0;
4978 if (pinstance->
ldn.msg !=
NULL) {
4983 pinstance->
ldn.baddr);
4987 pinstance->
ldn.baddr = 0;
5004 &(pinstance->
ccn.baddr));
5010 &(pinstance->
ldn.baddr));
5013 pmcraid_release_hcams(pinstance);
5015 pinstance->
ccn.hcam =
5017 pinstance->
ldn.hcam =
5034 static void pmcraid_release_config_buffers(
struct pmcraid_instance *pinstance)
5055 pmcraid_release_hcams(pinstance);
5075 pmcraid_err(
"failed to allocate memory for resource table\n");
5089 pmcraid_err(
"couldn't alloc DMA memory for config table\n");
5090 pmcraid_release_config_buffers(pinstance);
5094 if (pmcraid_allocate_hcams(pinstance)) {
5095 pmcraid_err(
"could not alloc DMA memory for HCAMS\n");
5096 pmcraid_release_config_buffers(pinstance);
5114 for (i = 0; i < pinstance->
num_hrrq; i++)
5116 pmcraid_tasklet_function,
5131 for (i = 0; i < pinstance->
num_hrrq; i++)
5145 pmcraid_release_config_buffers(pinstance);
5146 pmcraid_release_control_blocks(pinstance, PMCRAID_MAX_CMD);
5147 pmcraid_release_cmd_blocks(pinstance, PMCRAID_MAX_CMD);
5148 pmcraid_release_host_rrqs(pinstance, pinstance->
num_hrrq);
5188 if (pmcraid_allocate_host_rrqs(pinstance)) {
5189 pmcraid_err(
"couldn't allocate memory for %d host rrqs\n",
5194 if (pmcraid_allocate_config_buffers(pinstance)) {
5195 pmcraid_err(
"couldn't allocate memory for config buffers\n");
5196 pmcraid_release_host_rrqs(pinstance, pinstance->
num_hrrq);
5200 if (pmcraid_allocate_cmd_blocks(pinstance)) {
5201 pmcraid_err(
"couldn't allocate memory for cmd blocks\n");
5202 pmcraid_release_config_buffers(pinstance);
5203 pmcraid_release_host_rrqs(pinstance, pinstance->
num_hrrq);
5207 if (pmcraid_allocate_control_blocks(pinstance)) {
5208 pmcraid_err(
"couldn't allocate memory control blocks\n");
5209 pmcraid_release_config_buffers(pinstance);
5210 pmcraid_release_cmd_blocks(pinstance, PMCRAID_MAX_CMD);
5211 pmcraid_release_host_rrqs(pinstance, pinstance->
num_hrrq);
5222 pmcraid_err(
"couldn't allocate DMA memory for INQUIRY\n");
5223 pmcraid_release_buffers(pinstance);
5235 set time_stamp \n");
5236 pmcraid_release_buffers(pinstance);
5266 for (i = 0; i < pinstance->
num_hrrq; i++) {
5284 static int __devinit pmcraid_init_instance(
5293 pinstance->
host = host;
5294 pinstance->
pdev = pdev;
5306 pint_regs->ioa_host_interrupt_reg =
5307 mapped_pci_addr +
chip_cfg->ioa_host_intr;
5308 pint_regs->ioa_host_interrupt_clr_reg =
5309 mapped_pci_addr +
chip_cfg->ioa_host_intr_clr;
5310 pint_regs->ioa_host_msix_interrupt_reg =
5311 mapped_pci_addr +
chip_cfg->ioa_host_msix_intr;
5312 pint_regs->host_ioa_interrupt_reg =
5313 mapped_pci_addr +
chip_cfg->host_ioa_intr;
5314 pint_regs->host_ioa_interrupt_clr_reg =
5315 mapped_pci_addr +
chip_cfg->host_ioa_intr_clr;
5322 pint_regs->ioa_host_interrupt_mask_reg =
5323 mapped_pci_addr +
chip_cfg->ioa_host_mask;
5324 pint_regs->ioa_host_interrupt_mask_clr_reg =
5325 mapped_pci_addr +
chip_cfg->ioa_host_mask_clr;
5326 pint_regs->global_interrupt_mask_reg =
5327 mapped_pci_addr +
chip_cfg->global_intr_mask;
5368 static void pmcraid_shutdown(
struct pci_dev *pdev)
5371 pmcraid_reset_bringdown(pinstance);
5378 static unsigned short pmcraid_get_minor(
void)
5390 static void pmcraid_release_minor(
unsigned short minor)
5408 minor = pmcraid_get_minor();
5415 pmcraid_release_minor(minor);
5432 pmcraid_release_minor(
MINOR(pinstance->
cdev.dev));
5450 pmcraid_release_chrdev(pinstance);
5459 pmcraid_shutdown(pdev);
5461 pmcraid_disable_interrupts(pinstance, ~0);
5464 pmcraid_kill_tasklets(pinstance);
5465 pmcraid_unregister_interrupt_handler(pinstance);
5466 pmcraid_release_buffers(pinstance);
5487 pmcraid_shutdown(pdev);
5488 pmcraid_disable_interrupts(pinstance, ~0);
5489 pmcraid_kill_tasklets(pinstance);
5490 pci_set_drvdata(pinstance->
pdev, pinstance);
5491 pmcraid_unregister_interrupt_handler(pinstance);
5512 pci_enable_wake(pdev,
PCI_D0, 0);
5518 dev_err(&pdev->
dev,
"resume: Enable device failed\n");
5529 rc = pci_set_consistent_dma_mask(pdev,
DMA_BIT_MASK(32));
5532 dev_err(&pdev->
dev,
"resume: Failed to set PCI DMA mask\n");
5533 goto disable_device;
5536 pmcraid_disable_interrupts(pinstance, ~0);
5538 rc = pmcraid_register_interrupt_handler(pinstance);
5542 "resume: couldn't register interrupt handlers\n");
5547 pmcraid_init_tasklets(pinstance);
5548 pmcraid_enable_interrupts(pinstance, PMCRAID_PCI_INTERRUPTS);
5558 if (pmcraid_reset_bringup(pinstance)) {
5559 dev_err(&pdev->
dev,
"couldn't initialize IOA\n");
5561 goto release_tasklets;
5567 pmcraid_disable_interrupts(pinstance, ~0);
5568 pmcraid_kill_tasklets(pinstance);
5569 pmcraid_unregister_interrupt_handler(pinstance);
5582 #define pmcraid_suspend NULL
5583 #define pmcraid_resume NULL
5592 static void pmcraid_complete_ioa_reset(
struct pmcraid_cmd *cmd)
5595 unsigned long flags;
5598 pmcraid_ioa_reset(cmd);
5599 spin_unlock_irqrestore(pinstance->
host->host_lock, flags);
5612 static void pmcraid_set_supported_devs(
struct pmcraid_cmd *cmd)
5617 pmcraid_reinit_cmdblk(cmd);
5628 if (cmd->
drv_inst->reinit_cfg_table) {
5629 cmd->
drv_inst->reinit_cfg_table = 0;
5631 cmd_done = pmcraid_reinit_cfgtable_done;
5638 pmcraid_send_cmd(cmd,
5641 pmcraid_timeout_handler);
5653 static void pmcraid_set_timestamp(
struct pmcraid_cmd *cmd)
5664 timestamp = tv.tv_sec * 1000;
5673 pmcraid_reinit_cmdblk(cmd);
5678 memcpy(&(ioarcb->
cdb[6]), &time_stamp_len,
sizeof(time_stamp_len));
5690 ioadl = &(ioarcb->
add_data.u.ioadl[0]);
5697 pmcraid_send_cmd(cmd, pmcraid_set_supported_devs,
5719 static void pmcraid_init_res_table(
struct pmcraid_cmd *cmd)
5741 list_move_tail(&res->
queue, &old_res);
5751 if (!pmcraid_expose_resource(fw_version, cfgte))
5763 list_move_tail(&res->
queue,
5817 spin_unlock_irqrestore(&pinstance->
resource_lock, lock_flags);
5818 pmcraid_set_timestamp(cmd);
5831 static void pmcraid_querycfg(
struct pmcraid_cmd *cmd)
5852 memcpy(&(ioarcb->
cdb[10]), &cfg_table_size,
sizeof(cfg_table_size));
5867 ioadl = &(ioarcb->
add_data.u.ioadl[0]);
5872 pmcraid_send_cmd(cmd, pmcraid_init_res_table,
5893 void __iomem *mapped_pci_addr;
5898 (
"maximum number(%d) of supported adapters reached\n",
5907 dev_err(&pdev->
dev,
"Cannot enable adapter\n");
5913 "Found new IOA(%x:%x), Total IOA count: %d\n",
5921 "Couldn't register memory range of registers\n");
5922 goto out_disable_device;
5925 mapped_pci_addr = pci_iomap(pdev, 0, 0);
5927 if (!mapped_pci_addr) {
5928 dev_err(&pdev->
dev,
"Couldn't map PCI registers memory\n");
5930 goto out_release_regions;
5950 rc = pci_set_consistent_dma_mask(pdev,
DMA_BIT_MASK(32));
5953 dev_err(&pdev->
dev,
"Failed to set PCI DMA mask\n");
5961 dev_err(&pdev->
dev,
"scsi_host_alloc failed!\n");
5974 memset(pinstance, 0,
sizeof(*pinstance));
5979 rc = pmcraid_init_instance(pdev, host, mapped_pci_addr);
5982 dev_err(&pdev->
dev,
"failed to initialize adapter instance\n");
5983 goto out_scsi_host_put;
5986 pci_set_drvdata(pdev, pinstance);
5992 dev_err(&pdev->
dev,
"Failed to save PCI config space\n");
5993 goto out_scsi_host_put;
5996 pmcraid_disable_interrupts(pinstance, ~0);
5998 rc = pmcraid_register_interrupt_handler(pinstance);
6001 dev_err(&pdev->
dev,
"couldn't register interrupt handler\n");
6002 goto out_scsi_host_put;
6005 pmcraid_init_tasklets(pinstance);
6008 rc = pmcraid_init_buffers(pinstance);
6012 goto out_unregister_isr;
6016 pmcraid_reset_type(pinstance);
6018 pmcraid_enable_interrupts(pinstance, PMCRAID_PCI_INTERRUPTS);
6023 pmcraid_info(
"starting IOA initialization sequence\n");
6024 if (pmcraid_reset_bringup(pinstance)) {
6025 dev_err(&pdev->
dev,
"couldn't initialize IOA\n");
6027 goto out_release_bufs;
6031 rc = scsi_add_host(pinstance->
host, &pdev->
dev);
6033 pmcraid_err(
"couldn't add host into mid-layer: %d\n", rc);
6034 goto out_release_bufs;
6039 rc = pmcraid_setup_chrdev(pinstance);
6042 pmcraid_err(
"couldn't create mgmt interface, error: %x\n",
6044 goto out_remove_host;
6058 pmcraid_release_buffers(pinstance);
6061 pmcraid_kill_tasklets(pinstance);
6062 pmcraid_unregister_interrupt_handler(pinstance);
6070 out_release_regions:
6075 pci_set_drvdata(pdev,
NULL);
6085 .id_table = pmcraid_pci_table,
6086 .probe = pmcraid_probe,
6087 .remove = pmcraid_remove,
6090 .shutdown = pmcraid_shutdown
6096 static int __init pmcraid_init(
void)
6109 pmcraid_err(
"failed to get a major number for adapters\n");
6113 pmcraid_major =
MAJOR(dev);
6116 if (IS_ERR(pmcraid_class)) {
6117 error = PTR_ERR(pmcraid_class);
6118 pmcraid_err(
"failed to register with with sysfs, error = %x\n",
6120 goto out_unreg_chrdev;
6123 error = pmcraid_netlink_init();
6126 goto out_unreg_chrdev;
6128 error = pci_register_driver(&pmcraid_driver);
6133 pmcraid_err(
"failed to register pmcraid driver, error = %x\n",
6136 pmcraid_netlink_release();
6148 static void __exit pmcraid_exit(
void)
6150 pmcraid_netlink_release();