📄 qla1280.c
字号:
goto fail; if (mb[1] != 0xAAAA || mb[2] != 0x5555 || mb[3] != 0xAA55 || mb[4] != 0x55AA || mb[5] != 0xA5A5 || mb[6] != 0x5A5A || mb[7] != 0x2525) { printk(KERN_INFO "qla1280: Failed mbox check\n"); goto fail; } dprintk(3, "qla1280_chip_diag: exiting normally\n"); return 0; fail: dprintk(2, "qla1280_chip_diag: **** FAILED ****\n"); return status;}static intqla1280_load_firmware_pio(struct scsi_qla_host *ha){ uint16_t risc_address, *risc_code_address, risc_code_size; uint16_t mb[MAILBOX_REGISTER_COUNT], i; int err; /* Load RISC code. */ risc_address = *ql1280_board_tbl[ha->devnum].fwstart; risc_code_address = ql1280_board_tbl[ha->devnum].fwcode; risc_code_size = *ql1280_board_tbl[ha->devnum].fwlen; for (i = 0; i < risc_code_size; i++) { mb[0] = MBC_WRITE_RAM_WORD; mb[1] = risc_address + i; mb[2] = risc_code_address[i]; err = qla1280_mailbox_command(ha, BIT_0 | BIT_1 | BIT_2, mb); if (err) { printk(KERN_ERR "scsi(%li): Failed to load firmware\n", ha->host_no); return err; } } return 0;}#define DUMP_IT_BACK 0 /* for debug of RISC loading */static intqla1280_load_firmware_dma(struct scsi_qla_host *ha){ uint16_t risc_address, *risc_code_address, risc_code_size; uint16_t mb[MAILBOX_REGISTER_COUNT], cnt; int err = 0, num, i;#if DUMP_IT_BACK uint8_t *sp, *tbuf; dma_addr_t p_tbuf; tbuf = pci_alloc_consistent(ha->pdev, 8000, &p_tbuf); if (!tbuf) return -ENOMEM;#endif /* Load RISC code. */ risc_address = *ql1280_board_tbl[ha->devnum].fwstart; risc_code_address = ql1280_board_tbl[ha->devnum].fwcode; risc_code_size = *ql1280_board_tbl[ha->devnum].fwlen; dprintk(1, "%s: DMA RISC code (%i) words\n", __FUNCTION__, risc_code_size); num = 0; while (risc_code_size > 0) { int warn __attribute__((unused)) = 0; cnt = 2000 >> 1; if (cnt > risc_code_size) cnt = risc_code_size; dprintk(2, "qla1280_setup_chip: loading risc @ =(0x%p)," "%d,%d(0x%x)\n", risc_code_address, cnt, num, risc_address); for(i = 0; i < cnt; i++) ((__le16 *)ha->request_ring)[i] = cpu_to_le16(risc_code_address[i]); mb[0] = MBC_LOAD_RAM; mb[1] = risc_address; mb[4] = cnt; mb[3] = ha->request_dma & 0xffff; mb[2] = (ha->request_dma >> 16) & 0xffff; mb[7] = pci_dma_hi32(ha->request_dma) & 0xffff; mb[6] = pci_dma_hi32(ha->request_dma) >> 16; dprintk(2, "%s: op=%d 0x%p = 0x%4x,0x%4x,0x%4x,0x%4x\n", __FUNCTION__, mb[0], (void *)(long)ha->request_dma, mb[6], mb[7], mb[2], mb[3]); err = qla1280_mailbox_command(ha, BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0, mb); if (err) { printk(KERN_ERR "scsi(%li): Failed to load partial " "segment of f\n", ha->host_no); goto out; }#if DUMP_IT_BACK mb[0] = MBC_DUMP_RAM; mb[1] = risc_address; mb[4] = cnt; mb[3] = p_tbuf & 0xffff; mb[2] = (p_tbuf >> 16) & 0xffff; mb[7] = pci_dma_hi32(p_tbuf) & 0xffff; mb[6] = pci_dma_hi32(p_tbuf) >> 16; err = qla1280_mailbox_command(ha, BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0, mb); if (err) { printk(KERN_ERR "Failed to dump partial segment of f/w\n"); goto out; } sp = (uint8_t *)ha->request_ring; for (i = 0; i < (cnt << 1); i++) { if (tbuf[i] != sp[i] && warn++ < 10) { printk(KERN_ERR "%s: FW compare error @ " "byte(0x%x) loop#=%x\n", __FUNCTION__, i, num); printk(KERN_ERR "%s: FWbyte=%x " "FWfromChip=%x\n", __FUNCTION__, sp[i], tbuf[i]); /*break; */ } }#endif risc_address += cnt; risc_code_size = risc_code_size - cnt; risc_code_address = risc_code_address + cnt; num++; } out:#if DUMP_IT_BACK pci_free_consistent(ha->pdev, 8000, tbuf, p_tbuf);#endif return err;}static intqla1280_start_firmware(struct scsi_qla_host *ha){ uint16_t mb[MAILBOX_REGISTER_COUNT]; int err; dprintk(1, "%s: Verifying checksum of loaded RISC code.\n", __FUNCTION__); /* Verify checksum of loaded RISC code. */ mb[0] = MBC_VERIFY_CHECKSUM; /* mb[1] = ql12_risc_code_addr01; */ mb[1] = *ql1280_board_tbl[ha->devnum].fwstart; err = qla1280_mailbox_command(ha, BIT_1 | BIT_0, mb); if (err) { printk(KERN_ERR "scsi(%li): RISC checksum failed.\n", ha->host_no); return err; } /* Start firmware execution. */ dprintk(1, "%s: start firmware running.\n", __FUNCTION__); mb[0] = MBC_EXECUTE_FIRMWARE; mb[1] = *ql1280_board_tbl[ha->devnum].fwstart; err = qla1280_mailbox_command(ha, BIT_1 | BIT_0, &mb[0]); if (err) { printk(KERN_ERR "scsi(%li): Failed to start firmware\n", ha->host_no); } return err;}static intqla1280_load_firmware(struct scsi_qla_host *ha){ int err; err = qla1280_chip_diag(ha); if (err) goto out; if (IS_ISP1040(ha)) err = qla1280_load_firmware_pio(ha); else err = qla1280_load_firmware_dma(ha); if (err) goto out; err = qla1280_start_firmware(ha); out: return err;}/* * Initialize rings * * Input: * ha = adapter block pointer. * ha->request_ring = request ring virtual address * ha->response_ring = response ring virtual address * ha->request_dma = request ring physical address * ha->response_dma = response ring physical address * * Returns: * 0 = success. */static intqla1280_init_rings(struct scsi_qla_host *ha){ uint16_t mb[MAILBOX_REGISTER_COUNT]; int status = 0; ENTER("qla1280_init_rings"); /* Clear outstanding commands array. */ memset(ha->outstanding_cmds, 0, sizeof(struct srb *) * MAX_OUTSTANDING_COMMANDS); /* Initialize request queue. */ ha->request_ring_ptr = ha->request_ring; ha->req_ring_index = 0; ha->req_q_cnt = REQUEST_ENTRY_CNT; /* mb[0] = MBC_INIT_REQUEST_QUEUE; */ mb[0] = MBC_INIT_REQUEST_QUEUE_A64; mb[1] = REQUEST_ENTRY_CNT; mb[3] = ha->request_dma & 0xffff; mb[2] = (ha->request_dma >> 16) & 0xffff; mb[4] = 0; mb[7] = pci_dma_hi32(ha->request_dma) & 0xffff; mb[6] = pci_dma_hi32(ha->request_dma) >> 16; if (!(status = qla1280_mailbox_command(ha, BIT_7 | BIT_6 | BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0, &mb[0]))) { /* Initialize response queue. */ ha->response_ring_ptr = ha->response_ring; ha->rsp_ring_index = 0; /* mb[0] = MBC_INIT_RESPONSE_QUEUE; */ mb[0] = MBC_INIT_RESPONSE_QUEUE_A64; mb[1] = RESPONSE_ENTRY_CNT; mb[3] = ha->response_dma & 0xffff; mb[2] = (ha->response_dma >> 16) & 0xffff; mb[5] = 0; mb[7] = pci_dma_hi32(ha->response_dma) & 0xffff; mb[6] = pci_dma_hi32(ha->response_dma) >> 16; status = qla1280_mailbox_command(ha, BIT_7 | BIT_6 | BIT_5 | BIT_3 | BIT_2 | BIT_1 | BIT_0, &mb[0]); } if (status) dprintk(2, "qla1280_init_rings: **** FAILED ****\n"); LEAVE("qla1280_init_rings"); return status;}static voidqla1280_print_settings(struct nvram *nv){ dprintk(1, "qla1280 : initiator scsi id bus[0]=%d\n", nv->bus[0].config_1.initiator_id); dprintk(1, "qla1280 : initiator scsi id bus[1]=%d\n", nv->bus[1].config_1.initiator_id); dprintk(1, "qla1280 : bus reset delay[0]=%d\n", nv->bus[0].bus_reset_delay); dprintk(1, "qla1280 : bus reset delay[1]=%d\n", nv->bus[1].bus_reset_delay); dprintk(1, "qla1280 : retry count[0]=%d\n", nv->bus[0].retry_count); dprintk(1, "qla1280 : retry delay[0]=%d\n", nv->bus[0].retry_delay); dprintk(1, "qla1280 : retry count[1]=%d\n", nv->bus[1].retry_count); dprintk(1, "qla1280 : retry delay[1]=%d\n", nv->bus[1].retry_delay); dprintk(1, "qla1280 : async data setup time[0]=%d\n", nv->bus[0].config_2.async_data_setup_time); dprintk(1, "qla1280 : async data setup time[1]=%d\n", nv->bus[1].config_2.async_data_setup_time); dprintk(1, "qla1280 : req/ack active negation[0]=%d\n", nv->bus[0].config_2.req_ack_active_negation); dprintk(1, "qla1280 : req/ack active negation[1]=%d\n", nv->bus[1].config_2.req_ack_active_negation); dprintk(1, "qla1280 : data line active negation[0]=%d\n", nv->bus[0].config_2.data_line_active_negation); dprintk(1, "qla1280 : data line active negation[1]=%d\n", nv->bus[1].config_2.data_line_active_negation); dprintk(1, "qla1280 : disable loading risc code=%d\n", nv->cntr_flags_1.disable_loading_risc_code); dprintk(1, "qla1280 : enable 64bit addressing=%d\n", nv->cntr_flags_1.enable_64bit_addressing); dprintk(1, "qla1280 : selection timeout limit[0]=%d\n", nv->bus[0].selection_timeout); dprintk(1, "qla1280 : selection timeout limit[1]=%d\n", nv->bus[1].selection_timeout); dprintk(1, "qla1280 : max queue depth[0]=%d\n", nv->bus[0].max_queue_depth); dprintk(1, "qla1280 : max queue depth[1]=%d\n", nv->bus[1].max_queue_depth);}static voidqla1280_set_target_defaults(struct scsi_qla_host *ha, int bus, int target){ struct nvram *nv = &ha->nvram; nv->bus[bus].target[target].parameter.renegotiate_on_error = 1; nv->bus[bus].target[target].parameter.auto_request_sense = 1; nv->bus[bus].target[target].parameter.tag_queuing = 1; nv->bus[bus].target[target].parameter.enable_sync = 1;#if 1 /* Some SCSI Processors do not seem to like this */ nv->bus[bus].target[target].parameter.enable_wide = 1;#endif nv->bus[bus].target[target].execution_throttle = nv->bus[bus].max_queue_depth - 1; nv->bus[bus].target[target].parameter.parity_checking = 1; nv->bus[bus].target[target].parameter.disconnect_allowed = 1; if (IS_ISP1x160(ha)) { nv->bus[bus].target[target].flags.flags1x160.device_enable = 1; nv->bus[bus].target[target].flags.flags1x160.sync_offset = 0x0e; nv->bus[bus].target[target].sync_period = 9; nv->bus[bus].target[target].ppr_1x160.flags.enable_ppr = 1; nv->bus[bus].target[target].ppr_1x160.flags.ppr_options = 2; nv->bus[bus].target[target].ppr_1x160.flags.ppr_bus_width = 1; } else { nv->bus[bus].target[target].flags.flags1x80.device_enable = 1; nv->bus[bus].target[target].flags.flags1x80.sync_offset = 12; nv->bus[bus].target[target].sync_period = 10; }}static voidqla1280_set_defaults(struct scsi_qla_host *ha){ struct nvram *nv = &ha->nvram; int bus, target; dprintk(1, "Using defaults for NVRAM: \n"); memset(nv, 0, sizeof(struct nvram)); /* nv->cntr_flags_1.disable_loading_risc_code = 1; */ nv->firmware_feature.f.enable_fast_posting = 1; nv->firmware_feature.f.disable_synchronous_backoff = 1; nv->termination.scsi_bus_0_control = 3; nv->termination.scsi_bus_1_control = 3; nv->termination.auto_term_support = 1; /* * Set default FIFO magic - What appropriate values would be here * is unknown. This is what I have found testing with 12160s. * * Now, I would love the magic decoder ring for this one, the * header file provided by QLogic seems to be bogus or incomplete * at best. */ nv->isp_config.burst_enable = 1; if (IS_ISP1040(ha)) nv->isp_config.fifo_threshold |= 3; else nv->isp_config.fifo_threshold |= 4; if (IS_ISP1x160(ha)) nv->isp_parameter = 0x01; /* fast memory enable */ for (bus = 0; bus < MAX_BUSES; bus++) { nv->bus[bus].config_1.initiator_id = 7; nv->bus[bus].config_2.req_ack_active_negation = 1; nv->bus[bus].config_2.data_line_active_negation = 1; nv->bus[bus].selection_timeout = 250; nv->bus[bus].max_queue_depth = 256; if (IS_ISP1040(ha)) { nv->bus[bus].bus_reset_delay = 3; nv->bus[bus].config_2.async_data_setup_time = 6; nv->bus[bus].retry_delay = 1; } else { nv->bus[bus].bus_reset_delay = 5; nv->bus[bus].config_2.async_data_setup_time = 8; } for (target = 0; target < MAX_TARGETS; target++) qla1280_set_target_defaults(ha, bus, target); }}static intqla1280_config_target(struct scsi_qla_host *ha, int bus, int target){ struct nvram *nv = &ha->nvram; uint16_t mb[MAILBOX_REGISTER_COUNT]; int status, lun; uint16_t flag; /* Set Target Parameters. */ mb[0] = MBC_SET_TARGET_PARAMETERS; mb[1] = (uint16_t)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -