Lines Matching +full:t +full:- +full:phy

2  * PMC-Sierra SPC 8001 SAS/SATA based host adapters driver
4 * Copyright (c) 2008-2009 USI Co., Ltd.
18 * 3. Neither the names of the above-listed copyright holders nor the names
47 * read_main_config_table - read the configure table and save it.
52 void __iomem *address = pm8001_ha->main_cfg_tbl_addr; in read_main_config_table()
53 pm8001_ha->main_cfg_tbl.pm8001_tbl.signature = in read_main_config_table()
55 pm8001_ha->main_cfg_tbl.pm8001_tbl.interface_rev = in read_main_config_table()
57 pm8001_ha->main_cfg_tbl.pm8001_tbl.firmware_rev = in read_main_config_table()
59 pm8001_ha->main_cfg_tbl.pm8001_tbl.max_out_io = in read_main_config_table()
61 pm8001_ha->main_cfg_tbl.pm8001_tbl.max_sgl = in read_main_config_table()
63 pm8001_ha->main_cfg_tbl.pm8001_tbl.ctrl_cap_flag = in read_main_config_table()
65 pm8001_ha->main_cfg_tbl.pm8001_tbl.gst_offset = in read_main_config_table()
67 pm8001_ha->main_cfg_tbl.pm8001_tbl.inbound_queue_offset = in read_main_config_table()
69 pm8001_ha->main_cfg_tbl.pm8001_tbl.outbound_queue_offset = in read_main_config_table()
71 pm8001_ha->main_cfg_tbl.pm8001_tbl.hda_mode_flag = in read_main_config_table()
75 pm8001_ha->main_cfg_tbl.pm8001_tbl.anolog_setup_table_offset = in read_main_config_table()
79 pm8001_ha->main_cfg_tbl.pm8001_tbl.fatal_err_dump_offset0 = in read_main_config_table()
81 pm8001_ha->main_cfg_tbl.pm8001_tbl.fatal_err_dump_length0 = in read_main_config_table()
83 pm8001_ha->main_cfg_tbl.pm8001_tbl.fatal_err_dump_offset1 = in read_main_config_table()
85 pm8001_ha->main_cfg_tbl.pm8001_tbl.fatal_err_dump_length1 = in read_main_config_table()
90 * read_general_status_table - read the general status table and save it.
95 void __iomem *address = pm8001_ha->general_stat_tbl_addr; in read_general_status_table()
96 pm8001_ha->gs_tbl.pm8001_tbl.gst_len_mpistate = in read_general_status_table()
98 pm8001_ha->gs_tbl.pm8001_tbl.iq_freeze_state0 = in read_general_status_table()
100 pm8001_ha->gs_tbl.pm8001_tbl.iq_freeze_state1 = in read_general_status_table()
102 pm8001_ha->gs_tbl.pm8001_tbl.msgu_tcnt = in read_general_status_table()
104 pm8001_ha->gs_tbl.pm8001_tbl.iop_tcnt = in read_general_status_table()
106 pm8001_ha->gs_tbl.pm8001_tbl.rsvd = in read_general_status_table()
108 pm8001_ha->gs_tbl.pm8001_tbl.phy_state[0] = in read_general_status_table()
110 pm8001_ha->gs_tbl.pm8001_tbl.phy_state[1] = in read_general_status_table()
112 pm8001_ha->gs_tbl.pm8001_tbl.phy_state[2] = in read_general_status_table()
114 pm8001_ha->gs_tbl.pm8001_tbl.phy_state[3] = in read_general_status_table()
116 pm8001_ha->gs_tbl.pm8001_tbl.phy_state[4] = in read_general_status_table()
118 pm8001_ha->gs_tbl.pm8001_tbl.phy_state[5] = in read_general_status_table()
120 pm8001_ha->gs_tbl.pm8001_tbl.phy_state[6] = in read_general_status_table()
122 pm8001_ha->gs_tbl.pm8001_tbl.phy_state[7] = in read_general_status_table()
124 pm8001_ha->gs_tbl.pm8001_tbl.gpio_input_val = in read_general_status_table()
126 pm8001_ha->gs_tbl.pm8001_tbl.rsvd1[0] = in read_general_status_table()
128 pm8001_ha->gs_tbl.pm8001_tbl.rsvd1[1] = in read_general_status_table()
130 pm8001_ha->gs_tbl.pm8001_tbl.recover_err_info[0] = in read_general_status_table()
132 pm8001_ha->gs_tbl.pm8001_tbl.recover_err_info[1] = in read_general_status_table()
134 pm8001_ha->gs_tbl.pm8001_tbl.recover_err_info[2] = in read_general_status_table()
136 pm8001_ha->gs_tbl.pm8001_tbl.recover_err_info[3] = in read_general_status_table()
138 pm8001_ha->gs_tbl.pm8001_tbl.recover_err_info[4] = in read_general_status_table()
140 pm8001_ha->gs_tbl.pm8001_tbl.recover_err_info[5] = in read_general_status_table()
142 pm8001_ha->gs_tbl.pm8001_tbl.recover_err_info[6] = in read_general_status_table()
144 pm8001_ha->gs_tbl.pm8001_tbl.recover_err_info[7] = in read_general_status_table()
149 * read_inbnd_queue_table - read the inbound queue table and save it.
155 void __iomem *address = pm8001_ha->inbnd_q_tbl_addr; in read_inbnd_queue_table()
158 pm8001_ha->inbnd_q_tbl[i].pi_pci_bar = in read_inbnd_queue_table()
160 pm8001_ha->inbnd_q_tbl[i].pi_offset = in read_inbnd_queue_table()
166 * read_outbnd_queue_table - read the outbound queue table and save it.
172 void __iomem *address = pm8001_ha->outbnd_q_tbl_addr; in read_outbnd_queue_table()
175 pm8001_ha->outbnd_q_tbl[i].ci_pci_bar = in read_outbnd_queue_table()
177 pm8001_ha->outbnd_q_tbl[i].ci_offset = in read_outbnd_queue_table()
183 * init_default_table_values - init the default table.
190 void __iomem *addressib = pm8001_ha->inbnd_q_tbl_addr; in init_default_table_values()
191 void __iomem *addressob = pm8001_ha->outbnd_q_tbl_addr; in init_default_table_values()
192 u32 ib_offset = pm8001_ha->ib_offset; in init_default_table_values()
193 u32 ob_offset = pm8001_ha->ob_offset; in init_default_table_values()
194 u32 ci_offset = pm8001_ha->ci_offset; in init_default_table_values()
195 u32 pi_offset = pm8001_ha->pi_offset; in init_default_table_values()
197 pm8001_ha->main_cfg_tbl.pm8001_tbl.inbound_q_nppd_hppd = 0; in init_default_table_values()
198 pm8001_ha->main_cfg_tbl.pm8001_tbl.outbound_hw_event_pid0_3 = 0; in init_default_table_values()
199 pm8001_ha->main_cfg_tbl.pm8001_tbl.outbound_hw_event_pid4_7 = 0; in init_default_table_values()
200 pm8001_ha->main_cfg_tbl.pm8001_tbl.outbound_ncq_event_pid0_3 = 0; in init_default_table_values()
201 pm8001_ha->main_cfg_tbl.pm8001_tbl.outbound_ncq_event_pid4_7 = 0; in init_default_table_values()
202 pm8001_ha->main_cfg_tbl.pm8001_tbl.outbound_tgt_ITNexus_event_pid0_3 = in init_default_table_values()
204 pm8001_ha->main_cfg_tbl.pm8001_tbl.outbound_tgt_ITNexus_event_pid4_7 = in init_default_table_values()
206 pm8001_ha->main_cfg_tbl.pm8001_tbl.outbound_tgt_ssp_event_pid0_3 = 0; in init_default_table_values()
207 pm8001_ha->main_cfg_tbl.pm8001_tbl.outbound_tgt_ssp_event_pid4_7 = 0; in init_default_table_values()
208 pm8001_ha->main_cfg_tbl.pm8001_tbl.outbound_tgt_smp_event_pid0_3 = 0; in init_default_table_values()
209 pm8001_ha->main_cfg_tbl.pm8001_tbl.outbound_tgt_smp_event_pid4_7 = 0; in init_default_table_values()
211 pm8001_ha->main_cfg_tbl.pm8001_tbl.upper_event_log_addr = in init_default_table_values()
212 pm8001_ha->memoryMap.region[AAP1].phys_addr_hi; in init_default_table_values()
213 pm8001_ha->main_cfg_tbl.pm8001_tbl.lower_event_log_addr = in init_default_table_values()
214 pm8001_ha->memoryMap.region[AAP1].phys_addr_lo; in init_default_table_values()
215 pm8001_ha->main_cfg_tbl.pm8001_tbl.event_log_size = in init_default_table_values()
217 pm8001_ha->main_cfg_tbl.pm8001_tbl.event_log_option = 0x01; in init_default_table_values()
218 pm8001_ha->main_cfg_tbl.pm8001_tbl.upper_iop_event_log_addr = in init_default_table_values()
219 pm8001_ha->memoryMap.region[IOP].phys_addr_hi; in init_default_table_values()
220 pm8001_ha->main_cfg_tbl.pm8001_tbl.lower_iop_event_log_addr = in init_default_table_values()
221 pm8001_ha->memoryMap.region[IOP].phys_addr_lo; in init_default_table_values()
222 pm8001_ha->main_cfg_tbl.pm8001_tbl.iop_event_log_size = in init_default_table_values()
224 pm8001_ha->main_cfg_tbl.pm8001_tbl.iop_event_log_option = 0x01; in init_default_table_values()
225 pm8001_ha->main_cfg_tbl.pm8001_tbl.fatal_err_interrupt = 0x01; in init_default_table_values()
226 for (i = 0; i < pm8001_ha->max_q_num; i++) { in init_default_table_values()
227 pm8001_ha->inbnd_q_tbl[i].element_pri_size_cnt = in init_default_table_values()
228 PM8001_MPI_QUEUE | (pm8001_ha->iomb_size << 16) | (0x00<<30); in init_default_table_values()
229 pm8001_ha->inbnd_q_tbl[i].upper_base_addr = in init_default_table_values()
230 pm8001_ha->memoryMap.region[ib_offset + i].phys_addr_hi; in init_default_table_values()
231 pm8001_ha->inbnd_q_tbl[i].lower_base_addr = in init_default_table_values()
232 pm8001_ha->memoryMap.region[ib_offset + i].phys_addr_lo; in init_default_table_values()
233 pm8001_ha->inbnd_q_tbl[i].base_virt = in init_default_table_values()
234 (u8 *)pm8001_ha->memoryMap.region[ib_offset + i].virt_ptr; in init_default_table_values()
235 pm8001_ha->inbnd_q_tbl[i].total_length = in init_default_table_values()
236 pm8001_ha->memoryMap.region[ib_offset + i].total_len; in init_default_table_values()
237 pm8001_ha->inbnd_q_tbl[i].ci_upper_base_addr = in init_default_table_values()
238 pm8001_ha->memoryMap.region[ci_offset + i].phys_addr_hi; in init_default_table_values()
239 pm8001_ha->inbnd_q_tbl[i].ci_lower_base_addr = in init_default_table_values()
240 pm8001_ha->memoryMap.region[ci_offset + i].phys_addr_lo; in init_default_table_values()
241 pm8001_ha->inbnd_q_tbl[i].ci_virt = in init_default_table_values()
242 pm8001_ha->memoryMap.region[ci_offset + i].virt_ptr; in init_default_table_values()
243 pm8001_write_32(pm8001_ha->inbnd_q_tbl[i].ci_virt, 0, 0); in init_default_table_values()
245 pm8001_ha->inbnd_q_tbl[i].pi_pci_bar = in init_default_table_values()
248 pm8001_ha->inbnd_q_tbl[i].pi_offset = in init_default_table_values()
250 pm8001_ha->inbnd_q_tbl[i].producer_idx = 0; in init_default_table_values()
251 pm8001_ha->inbnd_q_tbl[i].consumer_index = 0; in init_default_table_values()
253 for (i = 0; i < pm8001_ha->max_q_num; i++) { in init_default_table_values()
254 pm8001_ha->outbnd_q_tbl[i].element_size_cnt = in init_default_table_values()
255 PM8001_MPI_QUEUE | (pm8001_ha->iomb_size << 16) | (0x01<<30); in init_default_table_values()
256 pm8001_ha->outbnd_q_tbl[i].upper_base_addr = in init_default_table_values()
257 pm8001_ha->memoryMap.region[ob_offset + i].phys_addr_hi; in init_default_table_values()
258 pm8001_ha->outbnd_q_tbl[i].lower_base_addr = in init_default_table_values()
259 pm8001_ha->memoryMap.region[ob_offset + i].phys_addr_lo; in init_default_table_values()
260 pm8001_ha->outbnd_q_tbl[i].base_virt = in init_default_table_values()
261 (u8 *)pm8001_ha->memoryMap.region[ob_offset + i].virt_ptr; in init_default_table_values()
262 pm8001_ha->outbnd_q_tbl[i].total_length = in init_default_table_values()
263 pm8001_ha->memoryMap.region[ob_offset + i].total_len; in init_default_table_values()
264 pm8001_ha->outbnd_q_tbl[i].pi_upper_base_addr = in init_default_table_values()
265 pm8001_ha->memoryMap.region[pi_offset + i].phys_addr_hi; in init_default_table_values()
266 pm8001_ha->outbnd_q_tbl[i].pi_lower_base_addr = in init_default_table_values()
267 pm8001_ha->memoryMap.region[pi_offset + i].phys_addr_lo; in init_default_table_values()
268 pm8001_ha->outbnd_q_tbl[i].interrup_vec_cnt_delay = in init_default_table_values()
270 pm8001_ha->outbnd_q_tbl[i].pi_virt = in init_default_table_values()
271 pm8001_ha->memoryMap.region[pi_offset + i].virt_ptr; in init_default_table_values()
272 pm8001_write_32(pm8001_ha->outbnd_q_tbl[i].pi_virt, 0, 0); in init_default_table_values()
274 pm8001_ha->outbnd_q_tbl[i].ci_pci_bar = in init_default_table_values()
277 pm8001_ha->outbnd_q_tbl[i].ci_offset = in init_default_table_values()
279 pm8001_ha->outbnd_q_tbl[i].consumer_idx = 0; in init_default_table_values()
280 pm8001_ha->outbnd_q_tbl[i].producer_index = 0; in init_default_table_values()
285 * update_main_config_table - update the main default table to the HBA.
290 void __iomem *address = pm8001_ha->main_cfg_tbl_addr; in update_main_config_table()
292 pm8001_ha->main_cfg_tbl.pm8001_tbl.inbound_q_nppd_hppd); in update_main_config_table()
294 pm8001_ha->main_cfg_tbl.pm8001_tbl.outbound_hw_event_pid0_3); in update_main_config_table()
296 pm8001_ha->main_cfg_tbl.pm8001_tbl.outbound_hw_event_pid4_7); in update_main_config_table()
298 pm8001_ha->main_cfg_tbl.pm8001_tbl.outbound_ncq_event_pid0_3); in update_main_config_table()
300 pm8001_ha->main_cfg_tbl.pm8001_tbl.outbound_ncq_event_pid4_7); in update_main_config_table()
302 pm8001_ha->main_cfg_tbl.pm8001_tbl. in update_main_config_table()
305 pm8001_ha->main_cfg_tbl.pm8001_tbl. in update_main_config_table()
308 pm8001_ha->main_cfg_tbl.pm8001_tbl. in update_main_config_table()
311 pm8001_ha->main_cfg_tbl.pm8001_tbl. in update_main_config_table()
314 pm8001_ha->main_cfg_tbl.pm8001_tbl. in update_main_config_table()
317 pm8001_ha->main_cfg_tbl.pm8001_tbl. in update_main_config_table()
320 pm8001_ha->main_cfg_tbl.pm8001_tbl.upper_event_log_addr); in update_main_config_table()
322 pm8001_ha->main_cfg_tbl.pm8001_tbl.lower_event_log_addr); in update_main_config_table()
324 pm8001_ha->main_cfg_tbl.pm8001_tbl.event_log_size); in update_main_config_table()
326 pm8001_ha->main_cfg_tbl.pm8001_tbl.event_log_option); in update_main_config_table()
328 pm8001_ha->main_cfg_tbl.pm8001_tbl.upper_iop_event_log_addr); in update_main_config_table()
330 pm8001_ha->main_cfg_tbl.pm8001_tbl.lower_iop_event_log_addr); in update_main_config_table()
332 pm8001_ha->main_cfg_tbl.pm8001_tbl.iop_event_log_size); in update_main_config_table()
334 pm8001_ha->main_cfg_tbl.pm8001_tbl.iop_event_log_option); in update_main_config_table()
336 pm8001_ha->main_cfg_tbl.pm8001_tbl.fatal_err_interrupt); in update_main_config_table()
340 * update_inbnd_queue_table - update the inbound queue table to the HBA.
347 void __iomem *address = pm8001_ha->inbnd_q_tbl_addr; in update_inbnd_queue_table()
350 pm8001_ha->inbnd_q_tbl[number].element_pri_size_cnt); in update_inbnd_queue_table()
352 pm8001_ha->inbnd_q_tbl[number].upper_base_addr); in update_inbnd_queue_table()
354 pm8001_ha->inbnd_q_tbl[number].lower_base_addr); in update_inbnd_queue_table()
356 pm8001_ha->inbnd_q_tbl[number].ci_upper_base_addr); in update_inbnd_queue_table()
358 pm8001_ha->inbnd_q_tbl[number].ci_lower_base_addr); in update_inbnd_queue_table()
362 * update_outbnd_queue_table - update the outbound queue table to the HBA.
369 void __iomem *address = pm8001_ha->outbnd_q_tbl_addr; in update_outbnd_queue_table()
372 pm8001_ha->outbnd_q_tbl[number].element_size_cnt); in update_outbnd_queue_table()
374 pm8001_ha->outbnd_q_tbl[number].upper_base_addr); in update_outbnd_queue_table()
376 pm8001_ha->outbnd_q_tbl[number].lower_base_addr); in update_outbnd_queue_table()
378 pm8001_ha->outbnd_q_tbl[number].pi_upper_base_addr); in update_outbnd_queue_table()
380 pm8001_ha->outbnd_q_tbl[number].pi_lower_base_addr); in update_outbnd_queue_table()
382 pm8001_ha->outbnd_q_tbl[number].interrup_vec_cnt_delay); in update_outbnd_queue_table()
386 * pm8001_bar4_shift - function is called to shift BAR base address
408 return -1; in pm8001_bar4_shift()
434 * Using shifted destination address 0x4_0000:0x1074 + 0x4000*(N-4) (N=4:7) in mpi_set_phys_g3_with_ssc()
436 spin_lock_irqsave(&pm8001_ha->lock, flags); in mpi_set_phys_g3_with_ssc()
437 if (-1 == pm8001_bar4_shift(pm8001_ha, in mpi_set_phys_g3_with_ssc()
439 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in mpi_set_phys_g3_with_ssc()
447 /* shift membase 3 for SAS2_SETTINGS_LOCAL_PHY 4 - 7 */ in mpi_set_phys_g3_with_ssc()
448 if (-1 == pm8001_bar4_shift(pm8001_ha, in mpi_set_phys_g3_with_ssc()
450 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in mpi_set_phys_g3_with_ssc()
454 offset = SAS2_SETTINGS_LOCAL_PHY_4_7_OFFSET + 0x4000 * (i-4); in mpi_set_phys_g3_with_ssc()
460 Address: (via MEMBASE-III): in mpi_set_phys_g3_with_ssc()
467 Upon power-up this register will read as 0x8990c016, in mpi_set_phys_g3_with_ssc()
470 This will ensure only down-spreading SSC is enabled on the SPC. in mpi_set_phys_g3_with_ssc()
477 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in mpi_set_phys_g3_with_ssc()
501 spin_lock_irqsave(&pm8001_ha->lock, flags); in mpi_set_open_retry_interval_reg()
502 /* shift bar and set the OPEN_REJECT(RETRY) interval time of PHY 0 -3.*/ in mpi_set_open_retry_interval_reg()
503 if (-1 == pm8001_bar4_shift(pm8001_ha, in mpi_set_open_retry_interval_reg()
505 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in mpi_set_open_retry_interval_reg()
513 if (-1 == pm8001_bar4_shift(pm8001_ha, in mpi_set_open_retry_interval_reg()
515 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in mpi_set_open_retry_interval_reg()
519 offset = OPEN_RETRY_INTERVAL_PHY_4_7_OFFSET + 0x4000 * (i-4); in mpi_set_open_retry_interval_reg()
524 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in mpi_set_open_retry_interval_reg()
529 * mpi_init_check - check firmware initialization status.
546 } while ((value != 0) && (--max_wait_count)); in mpi_init_check()
549 return -1; in mpi_init_check()
550 /* check the MPI-State for initialization */ in mpi_init_check()
552 pm8001_mr32(pm8001_ha->general_stat_tbl_addr, in mpi_init_check()
555 return -1; in mpi_init_check()
559 return -1; in mpi_init_check()
564 * check_fw_ready - The LLDD check if the FW is ready, if not, return error.
578 return -1; in check_fw_ready()
585 return -1; in check_fw_ready()
588 /* bit 4-31 of scratch pad1 should be zeros if it is not in check_fw_ready()
593 return -1; in check_fw_ready()
596 /* bit 2, 4-31 of scratch pad2 should be zeros if it is not in check_fw_ready()
600 return -1; in check_fw_ready()
612 if ((--max_wait_count) == 0) in check_fw_ready()
613 return -1; in check_fw_ready()
632 pm8001_ha->main_cfg_tbl_addr = base_addr = in init_pci_device_addresses()
633 pm8001_ha->io_mem[pcibar].memvirtaddr + offset; in init_pci_device_addresses()
634 pm8001_ha->general_stat_tbl_addr = in init_pci_device_addresses()
636 pm8001_ha->inbnd_q_tbl_addr = in init_pci_device_addresses()
638 pm8001_ha->outbnd_q_tbl_addr = in init_pci_device_addresses()
643 * pm8001_chip_init - the main init function that initialize whole PM8001 chip.
650 pci_read_config_word(pm8001_ha->pdev, PCI_DEVICE_ID, &deviceid); in pm8001_chip_init()
654 if (-1 == pm8001_bar4_shift(pm8001_ha, GSM_SM_BASE)) { in pm8001_chip_init()
658 return -1; in pm8001_chip_init()
662 if (-1 == check_fw_ready(pm8001_ha)) { in pm8001_chip_init()
664 return -EBUSY; in pm8001_chip_init()
676 for (i = 0; i < pm8001_ha->max_q_num; i++) in pm8001_chip_init()
678 for (i = 0; i < pm8001_ha->max_q_num; i++) in pm8001_chip_init()
683 /* 7->130ms, 34->500ms, 119->1.5s */ in pm8001_chip_init()
690 return -EBUSY; in pm8001_chip_init()
691 /*This register is a 16-bit timer with a resolution of 1us. This is the in pm8001_chip_init()
707 pci_read_config_word(pm8001_ha->pdev, PCI_DEVICE_ID, &deviceid); in mpi_uninit_check()
709 if (-1 == pm8001_bar4_shift(pm8001_ha, GSM_SM_BASE)) { in mpi_uninit_check()
713 return -1; in mpi_uninit_check()
727 } while ((value != 0) && (--max_wait_count)); in mpi_uninit_check()
732 return -1; in mpi_uninit_check()
735 /* check the MPI-State for termination in progress */ in mpi_uninit_check()
741 pm8001_mr32(pm8001_ha->general_stat_tbl_addr, in mpi_uninit_check()
746 } while (--max_wait_count); in mpi_uninit_check()
750 return -1; in mpi_uninit_check()
756 * soft_reset_ready_check - Function to check FW is ready for soft reset.
764 return -1; in soft_reset_ready_check()
774 spin_lock_irqsave(&pm8001_ha->lock, flags); in soft_reset_ready_check()
775 if (-1 == pm8001_bar4_shift(pm8001_ha, RB6_ACCESS_REG)) { in soft_reset_ready_check()
776 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in soft_reset_ready_check()
780 return -1; in soft_reset_ready_check()
800 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in soft_reset_ready_check()
801 return -1; in soft_reset_ready_check()
803 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in soft_reset_ready_check()
809 * pm8001_chip_soft_rst - soft reset the PM8001 chip, so that the clear all
825 return -1; in pm8001_chip_soft_rst()
831 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_chip_soft_rst()
832 if (-1 == pm8001_bar4_shift(pm8001_ha, MBIC_AAP1_ADDR_BASE)) { in pm8001_chip_soft_rst()
833 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_chip_soft_rst()
836 return -1; in pm8001_chip_soft_rst()
839 pm8001_dbg(pm8001_ha, INIT, "MBIC - NMI Enable VPE0 (IOP)= 0x%x\n", in pm8001_chip_soft_rst()
843 if (-1 == pm8001_bar4_shift(pm8001_ha, MBIC_IOP_ADDR_BASE)) { in pm8001_chip_soft_rst()
844 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_chip_soft_rst()
847 return -1; in pm8001_chip_soft_rst()
850 pm8001_dbg(pm8001_ha, INIT, "MBIC - NMI Enable VPE0 (AAP1)= 0x%x\n", in pm8001_chip_soft_rst()
855 pm8001_dbg(pm8001_ha, INIT, "PCIE -Event Interrupt Enable = 0x%x\n", in pm8001_chip_soft_rst()
860 pm8001_dbg(pm8001_ha, INIT, "PCIE - Event Interrupt = 0x%x\n", in pm8001_chip_soft_rst()
865 pm8001_dbg(pm8001_ha, INIT, "PCIE -Error Interrupt Enable = 0x%x\n", in pm8001_chip_soft_rst()
870 pm8001_dbg(pm8001_ha, INIT, "PCIE - Error Interrupt = 0x%x\n", regVal); in pm8001_chip_soft_rst()
884 if (-1 == pm8001_bar4_shift(pm8001_ha, GSM_ADDR_BASE)) { in pm8001_chip_soft_rst()
885 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_chip_soft_rst()
888 return -1; in pm8001_chip_soft_rst()
891 "GSM 0x0(0x00007b88)-GSM Configuration and Reset = 0x%x\n", in pm8001_chip_soft_rst()
908 "GSM 0x0 (0x00007b88 ==> 0x00004088) - GSM Configuration and Reset is set to = 0x%x\n", in pm8001_chip_soft_rst()
912 /* disable GSM - Read Address Parity Check */ in pm8001_chip_soft_rst()
915 "GSM 0x700038 - Read Address Parity Check Enable = 0x%x\n", in pm8001_chip_soft_rst()
919 "GSM 0x700038 - Read Address Parity Check Enable is set to = 0x%x\n", in pm8001_chip_soft_rst()
922 /* disable GSM - Write Address Parity Check */ in pm8001_chip_soft_rst()
925 "GSM 0x700040 - Write Address Parity Check Enable = 0x%x\n", in pm8001_chip_soft_rst()
929 "GSM 0x700040 - Write Address Parity Check Enable is set to = 0x%x\n", in pm8001_chip_soft_rst()
932 /* disable GSM - Write Data Parity Check */ in pm8001_chip_soft_rst()
934 pm8001_dbg(pm8001_ha, INIT, "GSM 0x300048 - Write Data Parity Check Enable = 0x%x\n", in pm8001_chip_soft_rst()
938 "GSM 0x300048 - Write Data Parity Check Enable is set to = 0x%x\n", in pm8001_chip_soft_rst()
943 /* step 5-b: set GPIO-0 output control to tristate anyway */ in pm8001_chip_soft_rst()
944 if (-1 == pm8001_bar4_shift(pm8001_ha, GPIO_ADDR_BASE)) { in pm8001_chip_soft_rst()
945 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_chip_soft_rst()
948 return -1; in pm8001_chip_soft_rst()
953 /* set GPIO-0 output control to tri-state */ in pm8001_chip_soft_rst()
959 if (-1 == pm8001_bar4_shift(pm8001_ha, SPC_TOP_LEVEL_ADDR_BASE)) { in pm8001_chip_soft_rst()
960 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_chip_soft_rst()
963 return -1; in pm8001_chip_soft_rst()
994 if (-1 == pm8001_bar4_shift(pm8001_ha, GSM_ADDR_BASE)) { in pm8001_chip_soft_rst()
995 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_chip_soft_rst()
998 return -1; in pm8001_chip_soft_rst()
1001 "GSM 0x0 (0x00007b88)-GSM Configuration and Reset = 0x%x\n", in pm8001_chip_soft_rst()
1014 …pm8001_dbg(pm8001_ha, INIT, "GSM (0x00004088 ==> 0x00007b88) - GSM Configuration and Reset is set … in pm8001_chip_soft_rst()
1017 /* step 12: Restore GSM - Read Address Parity Check */ in pm8001_chip_soft_rst()
1021 "GSM 0x700038 - Read Address Parity Check Enable = 0x%x\n", in pm8001_chip_soft_rst()
1024 pm8001_dbg(pm8001_ha, INIT, "GSM 0x700038 - Read Address Parity Check Enable is set to = 0x%x\n", in pm8001_chip_soft_rst()
1026 /* Restore GSM - Write Address Parity Check */ in pm8001_chip_soft_rst()
1030 "GSM 0x700040 - Write Address Parity Check Enable is set to = 0x%x\n", in pm8001_chip_soft_rst()
1032 /* Restore GSM - Write Data Parity Check */ in pm8001_chip_soft_rst()
1036 "GSM 0x700048 - Write Data Parity Check Enable is set to = 0x%x\n", in pm8001_chip_soft_rst()
1041 if (-1 == pm8001_bar4_shift(pm8001_ha, SPC_TOP_LEVEL_ADDR_BASE)) { in pm8001_chip_soft_rst()
1042 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_chip_soft_rst()
1045 return -1; in pm8001_chip_soft_rst()
1051 /* step 14: delay 10 usec - Normal Mode */ in pm8001_chip_soft_rst()
1062 } while ((regVal != toggleVal) && (--max_wait_count)); in pm8001_chip_soft_rst()
1081 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_chip_soft_rst()
1082 return -1; in pm8001_chip_soft_rst()
1085 /* step 16 (Normal) - Clear ODMR and ODCR */ in pm8001_chip_soft_rst()
1090 ready - 1 sec timeout */ in pm8001_chip_soft_rst()
1092 if (check_fw_ready(pm8001_ha) == -1) { in pm8001_chip_soft_rst()
1111 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_chip_soft_rst()
1112 return -1; in pm8001_chip_soft_rst()
1116 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_chip_soft_rst()
1148 } while ((--i) != 0); in pm8001_hw_chip_rst()
1154 * pm8001_chip_iounmap - which mapped when initialized.
1163 ** bar 0 and 1 - logical BAR0 in pm8001_chip_iounmap()
1164 ** bar 2 and 3 - logical BAR1 in pm8001_chip_iounmap()
1165 ** bar4 - logical BAR2 in pm8001_chip_iounmap()
1166 ** bar5 - logical BAR3 in pm8001_chip_iounmap()
1171 if (pm8001_ha->io_mem[logical].memvirtaddr) { in pm8001_chip_iounmap()
1172 iounmap(pm8001_ha->io_mem[logical].memvirtaddr); in pm8001_chip_iounmap()
1180 * pm8001_chip_intx_interrupt_enable - enable PM8001 chip interrupt
1191 * pm8001_chip_intx_interrupt_disable - disable PM8001 chip interrupt
1203 * pm8001_chip_msix_interrupt_enable - enable PM8001 chip interrupt
1222 * pm8001_chip_msix_interrupt_disable - disable PM8001 chip interrupt
1238 * pm8001_chip_interrupt_enable - enable PM8001 chip interrupt
1253 * pm8001_chip_interrupt_disable - disable PM8001 chip interrupt
1268 * pm8001_mpi_msg_free_get - get the free message buffer for transfer
1284 return -1; in pm8001_mpi_msg_free_get()
1288 consumer_index = pm8001_read_32(circularQ->ci_virt); in pm8001_mpi_msg_free_get()
1289 circularQ->consumer_index = cpu_to_le32(consumer_index); in pm8001_mpi_msg_free_get()
1290 if (((circularQ->producer_idx + bcCount) % PM8001_MPI_QUEUE) == in pm8001_mpi_msg_free_get()
1291 le32_to_cpu(circularQ->consumer_index)) { in pm8001_mpi_msg_free_get()
1293 return -1; in pm8001_mpi_msg_free_get()
1296 offset = circularQ->producer_idx * messageSize; in pm8001_mpi_msg_free_get()
1298 circularQ->producer_idx = (circularQ->producer_idx + bcCount) in pm8001_mpi_msg_free_get()
1302 msgHeader = (struct mpi_msg_hdr *)(circularQ->base_virt + offset); in pm8001_mpi_msg_free_get()
1308 * pm8001_mpi_build_cmd- build the message queue for transfer, update the PI to
1325 int q_index = circularQ - pm8001_ha->inbnd_q_tbl; in pm8001_mpi_build_cmd()
1329 spin_lock_irqsave(&circularQ->iq_lock, flags); in pm8001_mpi_build_cmd()
1330 rv = pm8001_mpi_msg_free_get(circularQ, pm8001_ha->iomb_size, in pm8001_mpi_build_cmd()
1334 rv = -ENOMEM; in pm8001_mpi_build_cmd()
1338 if (nb > (pm8001_ha->iomb_size - sizeof(struct mpi_msg_hdr))) in pm8001_mpi_build_cmd()
1339 nb = pm8001_ha->iomb_size - sizeof(struct mpi_msg_hdr); in pm8001_mpi_build_cmd()
1341 if (nb + sizeof(struct mpi_msg_hdr) < pm8001_ha->iomb_size) in pm8001_mpi_build_cmd()
1342 memset(pMessage + nb, 0, pm8001_ha->iomb_size - in pm8001_mpi_build_cmd()
1350 pm8001_write_32((pMessage - 4), 0, cpu_to_le32(Header)); in pm8001_mpi_build_cmd()
1352 pm8001_cw32(pm8001_ha, circularQ->pi_pci_bar, in pm8001_mpi_build_cmd()
1353 circularQ->pi_offset, circularQ->producer_idx); in pm8001_mpi_build_cmd()
1356 responseQueue, opCode, circularQ->producer_idx, in pm8001_mpi_build_cmd()
1357 circularQ->consumer_index); in pm8001_mpi_build_cmd()
1359 spin_unlock_irqrestore(&circularQ->iq_lock, flags); in pm8001_mpi_build_cmd()
1370 msgHeader = (struct mpi_msg_hdr *)(pMsg - sizeof(struct mpi_msg_hdr)); in pm8001_mpi_msg_free_set()
1371 pOutBoundMsgHeader = (struct mpi_msg_hdr *)(circularQ->base_virt + in pm8001_mpi_msg_free_set()
1372 circularQ->consumer_idx * pm8001_ha->iomb_size); in pm8001_mpi_msg_free_set()
1376 circularQ->consumer_idx, msgHeader); in pm8001_mpi_msg_free_set()
1379 producer_index = pm8001_read_32(circularQ->pi_virt); in pm8001_mpi_msg_free_set()
1380 circularQ->producer_index = cpu_to_le32(producer_index); in pm8001_mpi_msg_free_set()
1383 circularQ->consumer_idx, in pm8001_mpi_msg_free_set()
1384 circularQ->producer_index, msgHeader); in pm8001_mpi_msg_free_set()
1388 circularQ->consumer_idx = (circularQ->consumer_idx + bc) in pm8001_mpi_msg_free_set()
1391 pm8001_cw32(pm8001_ha, circularQ->ci_pci_bar, circularQ->ci_offset, in pm8001_mpi_msg_free_set()
1392 circularQ->consumer_idx); in pm8001_mpi_msg_free_set()
1394 producer_index = pm8001_read_32(circularQ->pi_virt); in pm8001_mpi_msg_free_set()
1395 circularQ->producer_index = cpu_to_le32(producer_index); in pm8001_mpi_msg_free_set()
1397 circularQ->consumer_idx, circularQ->producer_index); in pm8001_mpi_msg_free_set()
1402 * pm8001_mpi_msg_consume- get the MPI message from outbound queue
1417 /* If there are not-yet-delivered messages ... */ in pm8001_mpi_msg_consume()
1418 if (le32_to_cpu(circularQ->producer_index) in pm8001_mpi_msg_consume()
1419 != circularQ->consumer_idx) { in pm8001_mpi_msg_consume()
1422 (circularQ->base_virt + in pm8001_mpi_msg_consume()
1423 circularQ->consumer_idx * pm8001_ha->iomb_size); in pm8001_mpi_msg_consume()
1429 msgHeader_tmp, circularQ->consumer_idx, in pm8001_mpi_msg_consume()
1430 circularQ->producer_index); in pm8001_mpi_msg_consume()
1441 circularQ->consumer_idx, in pm8001_mpi_msg_consume()
1442 circularQ->producer_index, in pm8001_mpi_msg_consume()
1446 circularQ->consumer_idx = in pm8001_mpi_msg_consume()
1447 (circularQ->consumer_idx + in pm8001_mpi_msg_consume()
1455 circularQ->ci_pci_bar, in pm8001_mpi_msg_consume()
1456 circularQ->ci_offset, in pm8001_mpi_msg_consume()
1457 circularQ->consumer_idx); in pm8001_mpi_msg_consume()
1460 circularQ->consumer_idx = in pm8001_mpi_msg_consume()
1461 (circularQ->consumer_idx + in pm8001_mpi_msg_consume()
1467 pm8001_cw32(pm8001_ha, circularQ->ci_pci_bar, in pm8001_mpi_msg_consume()
1468 circularQ->ci_offset, in pm8001_mpi_msg_consume()
1469 circularQ->consumer_idx); in pm8001_mpi_msg_consume()
1474 void *pi_virt = circularQ->pi_virt; in pm8001_mpi_msg_consume()
1476 * kexec-ing and driver doing a doorbell access in pm8001_mpi_msg_consume()
1477 * with the pre-kexec oq interrupt setup in pm8001_mpi_msg_consume()
1483 circularQ->producer_index = cpu_to_le32(producer_index); in pm8001_mpi_msg_consume()
1485 } while (le32_to_cpu(circularQ->producer_index) != in pm8001_mpi_msg_consume()
1486 circularQ->consumer_idx); in pm8001_mpi_msg_consume()
1487 /* while we don't have any more not-yet-delivered message */ in pm8001_mpi_msg_consume()
1504 if (pw->handler != IO_FATAL_ERROR) { in pm8001_work_fn()
1505 pm8001_dev = pw->data; /* Most stash device structure */ in pm8001_work_fn()
1507 || ((pw->handler != IO_XFER_ERROR_BREAK) in pm8001_work_fn()
1508 && (pm8001_dev->dev_type == SAS_PHY_UNUSED))) { in pm8001_work_fn()
1514 switch (pw->handler) { in pm8001_work_fn()
1517 struct sas_task *t = (struct sas_task *)pm8001_dev; in pm8001_work_fn() local
1520 struct pm8001_hba_info *pm8001_ha = pw->pm8001_ha; in pm8001_work_fn()
1525 if (pm8001_query_task(t) == TMF_RESP_FUNC_SUCC) in pm8001_work_fn()
1527 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_work_fn()
1529 spin_lock_irqsave(&t->task_state_lock, flags1); in pm8001_work_fn()
1530 if (unlikely((t->task_state_flags & SAS_TASK_STATE_DONE))) { in pm8001_work_fn()
1531 spin_unlock_irqrestore(&t->task_state_lock, flags1); in pm8001_work_fn()
1532 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_work_fn()
1535 spin_unlock_irqrestore(&t->task_state_lock, flags1); in pm8001_work_fn()
1539 ccb = &pm8001_ha->ccb_info[i]; in pm8001_work_fn()
1540 tag = ccb->ccb_tag; in pm8001_work_fn()
1541 if ((tag != 0xFFFFFFFF) && (ccb->task == t)) in pm8001_work_fn()
1545 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_work_fn()
1548 ts = &t->task_status; in pm8001_work_fn()
1549 ts->resp = SAS_TASK_COMPLETE; in pm8001_work_fn()
1551 ts->stat = SAS_QUEUE_FULL; in pm8001_work_fn()
1552 pm8001_dev = ccb->device; in pm8001_work_fn()
1554 atomic_dec(&pm8001_dev->running_req); in pm8001_work_fn()
1555 spin_lock_irqsave(&t->task_state_lock, flags1); in pm8001_work_fn()
1556 t->task_state_flags &= ~SAS_TASK_STATE_PENDING; in pm8001_work_fn()
1557 t->task_state_flags &= ~SAS_TASK_AT_INITIATOR; in pm8001_work_fn()
1558 t->task_state_flags |= SAS_TASK_STATE_DONE; in pm8001_work_fn()
1559 if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) { in pm8001_work_fn()
1560 spin_unlock_irqrestore(&t->task_state_lock, flags1); in pm8001_work_fn()
1562 t, pw->handler, ts->resp, ts->stat); in pm8001_work_fn()
1563 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); in pm8001_work_fn()
1564 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_work_fn()
1566 spin_unlock_irqrestore(&t->task_state_lock, flags1); in pm8001_work_fn()
1567 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); in pm8001_work_fn()
1569 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_work_fn()
1570 t->task_done(t); in pm8001_work_fn()
1575 struct sas_task *t = (struct sas_task *)pm8001_dev; in pm8001_work_fn() local
1578 struct pm8001_hba_info *pm8001_ha = pw->pm8001_ha; in pm8001_work_fn()
1584 ret = pm8001_query_task(t); in pm8001_work_fn()
1593 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_work_fn()
1595 spin_lock_irqsave(&t->task_state_lock, flags1); in pm8001_work_fn()
1597 if (unlikely((t->task_state_flags & SAS_TASK_STATE_DONE))) { in pm8001_work_fn()
1598 spin_unlock_irqrestore(&t->task_state_lock, flags1); in pm8001_work_fn()
1599 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_work_fn()
1601 (void)pm8001_abort_task(t); in pm8001_work_fn()
1605 spin_unlock_irqrestore(&t->task_state_lock, flags1); in pm8001_work_fn()
1609 ccb = &pm8001_ha->ccb_info[i]; in pm8001_work_fn()
1610 tag = ccb->ccb_tag; in pm8001_work_fn()
1611 if ((tag != 0xFFFFFFFF) && (ccb->task == t)) in pm8001_work_fn()
1615 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_work_fn()
1617 (void)pm8001_abort_task(t); in pm8001_work_fn()
1621 pm8001_dev = ccb->device; in pm8001_work_fn()
1622 dev = pm8001_dev->sas_device; in pm8001_work_fn()
1626 ccb->open_retry = 1; /* Snub completion */ in pm8001_work_fn()
1627 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_work_fn()
1628 ret = pm8001_abort_task(t); in pm8001_work_fn()
1629 ccb->open_retry = 0; in pm8001_work_fn()
1636 pm8001_dbg(pm8001_ha, IO, "...Reset phy\n"); in pm8001_work_fn()
1643 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_work_fn()
1648 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_work_fn()
1650 pm8001_dbg(pm8001_ha, IO, "...Reset phy\n"); in pm8001_work_fn()
1655 t = NULL; in pm8001_work_fn()
1656 pm8001_open_reject_retry(pm8001_ha, t, pm8001_dev); in pm8001_work_fn()
1660 dev = pm8001_dev->sas_device; in pm8001_work_fn()
1664 dev = pm8001_dev->sas_device; in pm8001_work_fn()
1668 dev = pm8001_dev->sas_device; in pm8001_work_fn()
1672 dev = pm8001_dev->sas_device; in pm8001_work_fn()
1677 struct pm8001_hba_info *pm8001_ha = pw->pm8001_ha; in pm8001_work_fn()
1685 ccb = &pm8001_ha->ccb_info[i]; in pm8001_work_fn()
1686 task = ccb->task; in pm8001_work_fn()
1687 ts = &task->task_status; in pm8001_work_fn()
1688 tag = ccb->ccb_tag; in pm8001_work_fn()
1696 dev = task->dev; in pm8001_work_fn()
1704 ts->resp = SAS_TASK_COMPLETE; in pm8001_work_fn()
1705 task->task_done(task); in pm8001_work_fn()
1707 /* complete the internal commands/non-sas task */ in pm8001_work_fn()
1708 pm8001_dev = ccb->device; in pm8001_work_fn()
1709 if (pm8001_dev->dcompletion) { in pm8001_work_fn()
1710 complete(pm8001_dev->dcompletion); in pm8001_work_fn()
1711 pm8001_dev->dcompletion = NULL; in pm8001_work_fn()
1713 complete(pm8001_ha->nvmd_completion); in pm8001_work_fn()
1719 pm8001_dev = &pm8001_ha->devices[i]; in pm8001_work_fn()
1720 device_id = pm8001_dev->device_id; in pm8001_work_fn()
1722 PM8001_CHIP_DISP->dereg_dev_req(pm8001_ha, device_id); in pm8001_work_fn()
1739 pw->pm8001_ha = pm8001_ha; in pm8001_handle_event()
1740 pw->data = data; in pm8001_handle_event()
1741 pw->handler = handler; in pm8001_handle_event()
1742 INIT_WORK(&pw->work, pm8001_work_fn); in pm8001_handle_event()
1743 queue_work(pm8001_wq, &pw->work); in pm8001_handle_event()
1745 ret = -ENOMEM; in pm8001_handle_event()
1774 task->task_done = pm8001_task_done; in pm8001_send_abort_all()
1780 ccb = &pm8001_ha->ccb_info[ccb_tag]; in pm8001_send_abort_all()
1781 ccb->device = pm8001_ha_dev; in pm8001_send_abort_all()
1782 ccb->ccb_tag = ccb_tag; in pm8001_send_abort_all()
1783 ccb->task = task; in pm8001_send_abort_all()
1785 circularQ = &pm8001_ha->inbnd_q_tbl[0]; in pm8001_send_abort_all()
1789 task_abort.device_id = cpu_to_le32(pm8001_ha_dev->device_id); in pm8001_send_abort_all()
1818 task->task_done = pm8001_task_done; in pm8001_send_read_log()
1838 task->dev = dev; in pm8001_send_read_log()
1839 task->dev->lldd_dev = pm8001_ha_dev; in pm8001_send_read_log()
1841 ccb = &pm8001_ha->ccb_info[ccb_tag]; in pm8001_send_read_log()
1842 ccb->device = pm8001_ha_dev; in pm8001_send_read_log()
1843 ccb->ccb_tag = ccb_tag; in pm8001_send_read_log()
1844 ccb->task = task; in pm8001_send_read_log()
1845 pm8001_ha_dev->id |= NCQ_READ_LOG_FLAG; in pm8001_send_read_log()
1846 pm8001_ha_dev->id |= NCQ_2ND_RLE_FLAG; in pm8001_send_read_log()
1849 circularQ = &pm8001_ha->inbnd_q_tbl[0]; in pm8001_send_read_log()
1860 sata_cmd.device_id = cpu_to_le32(pm8001_ha_dev->device_id); in pm8001_send_read_log()
1874 * mpi_ssp_completion- process the event that FW response to the SSP request.
1887 struct sas_task *t; in mpi_ssp_completion() local
1898 status = le32_to_cpu(psspPayload->status); in mpi_ssp_completion()
1899 tag = le32_to_cpu(psspPayload->tag); in mpi_ssp_completion()
1900 ccb = &pm8001_ha->ccb_info[tag]; in mpi_ssp_completion()
1901 if ((status == IO_ABORTED) && ccb->open_retry) { in mpi_ssp_completion()
1903 ccb->open_retry = 0; in mpi_ssp_completion()
1906 pm8001_dev = ccb->device; in mpi_ssp_completion()
1907 param = le32_to_cpu(psspPayload->param); in mpi_ssp_completion()
1909 t = ccb->task; in mpi_ssp_completion()
1913 if (unlikely(!t || !t->lldd_task || !t->dev)) in mpi_ssp_completion()
1915 ts = &t->task_status; in mpi_ssp_completion()
1920 SAS_ADDR(t->dev->sas_addr)); in mpi_ssp_completion()
1925 status, tag, t); in mpi_ssp_completion()
1932 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
1933 ts->stat = SAS_SAM_STAT_GOOD; in mpi_ssp_completion()
1935 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
1936 ts->stat = SAS_PROTO_RESPONSE; in mpi_ssp_completion()
1937 ts->residual = param; in mpi_ssp_completion()
1938 iu = &psspPayload->ssp_resp_iu; in mpi_ssp_completion()
1939 sas_ssp_task_response(pm8001_ha->dev, t, iu); in mpi_ssp_completion()
1942 atomic_dec(&pm8001_dev->running_req); in mpi_ssp_completion()
1946 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
1947 ts->stat = SAS_ABORTED_TASK; in mpi_ssp_completion()
1953 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
1954 ts->stat = SAS_DATA_UNDERRUN; in mpi_ssp_completion()
1955 ts->residual = param; in mpi_ssp_completion()
1957 atomic_dec(&pm8001_dev->running_req); in mpi_ssp_completion()
1961 ts->resp = SAS_TASK_UNDELIVERED; in mpi_ssp_completion()
1962 ts->stat = SAS_PHY_DOWN; in mpi_ssp_completion()
1966 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
1967 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
1969 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in mpi_ssp_completion()
1973 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
1974 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
1975 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in mpi_ssp_completion()
1980 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
1981 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
1982 ts->open_rej_reason = SAS_OREJ_EPROTO; in mpi_ssp_completion()
1987 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
1988 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
1989 ts->open_rej_reason = SAS_OREJ_UNKNOWN; in mpi_ssp_completion()
1993 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
1994 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
1995 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in mpi_ssp_completion()
1999 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
2000 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
2001 ts->open_rej_reason = SAS_OREJ_UNKNOWN; in mpi_ssp_completion()
2002 if (!t->uldd_task) in mpi_ssp_completion()
2010 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
2011 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
2012 ts->open_rej_reason = SAS_OREJ_BAD_DEST; in mpi_ssp_completion()
2016 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
2017 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
2018 ts->open_rej_reason = SAS_OREJ_CONN_RATE; in mpi_ssp_completion()
2023 ts->resp = SAS_TASK_UNDELIVERED; in mpi_ssp_completion()
2024 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
2025 ts->open_rej_reason = SAS_OREJ_WRONG_DEST; in mpi_ssp_completion()
2029 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
2030 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
2031 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in mpi_ssp_completion()
2035 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
2036 ts->stat = SAS_NAK_R_ERR; in mpi_ssp_completion()
2040 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
2041 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
2045 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
2046 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
2047 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in mpi_ssp_completion()
2051 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
2052 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
2056 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
2057 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
2061 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
2062 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
2063 if (!t->uldd_task) in mpi_ssp_completion()
2070 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
2071 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
2075 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
2076 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
2080 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
2081 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
2086 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
2087 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
2088 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in mpi_ssp_completion()
2093 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_completion()
2094 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_completion()
2098 psspPayload->ssp_resp_iu.status); in mpi_ssp_completion()
2099 spin_lock_irqsave(&t->task_state_lock, flags); in mpi_ssp_completion()
2100 t->task_state_flags &= ~SAS_TASK_STATE_PENDING; in mpi_ssp_completion()
2101 t->task_state_flags &= ~SAS_TASK_AT_INITIATOR; in mpi_ssp_completion()
2102 t->task_state_flags |= SAS_TASK_STATE_DONE; in mpi_ssp_completion()
2103 if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) { in mpi_ssp_completion()
2104 spin_unlock_irqrestore(&t->task_state_lock, flags); in mpi_ssp_completion()
2106 t, status, ts->resp, ts->stat); in mpi_ssp_completion()
2107 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); in mpi_ssp_completion()
2109 spin_unlock_irqrestore(&t->task_state_lock, flags); in mpi_ssp_completion()
2110 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); in mpi_ssp_completion()
2112 t->task_done(t); in mpi_ssp_completion()
2119 struct sas_task *t; in mpi_ssp_event() local
2126 u32 event = le32_to_cpu(psspPayload->event); in mpi_ssp_event()
2127 u32 tag = le32_to_cpu(psspPayload->tag); in mpi_ssp_event()
2128 u32 port_id = le32_to_cpu(psspPayload->port_id); in mpi_ssp_event()
2129 u32 dev_id = le32_to_cpu(psspPayload->device_id); in mpi_ssp_event()
2131 ccb = &pm8001_ha->ccb_info[tag]; in mpi_ssp_event()
2132 t = ccb->task; in mpi_ssp_event()
2133 pm8001_dev = ccb->device; in mpi_ssp_event()
2136 if (unlikely(!t || !t->lldd_task || !t->dev)) in mpi_ssp_event()
2138 ts = &t->task_status; in mpi_ssp_event()
2144 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_event()
2145 ts->stat = SAS_DATA_OVERRUN; in mpi_ssp_event()
2146 ts->residual = 0; in mpi_ssp_event()
2148 atomic_dec(&pm8001_dev->running_req); in mpi_ssp_event()
2152 pm8001_handle_event(pm8001_ha, t, IO_XFER_ERROR_BREAK); in mpi_ssp_event()
2156 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_event()
2157 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_event()
2158 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in mpi_ssp_event()
2162 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_event()
2163 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_event()
2164 ts->open_rej_reason = SAS_OREJ_EPROTO; in mpi_ssp_event()
2169 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_event()
2170 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_event()
2171 ts->open_rej_reason = SAS_OREJ_UNKNOWN; in mpi_ssp_event()
2175 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_event()
2176 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_event()
2177 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in mpi_ssp_event()
2181 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_event()
2182 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_event()
2183 ts->open_rej_reason = SAS_OREJ_UNKNOWN; in mpi_ssp_event()
2184 if (!t->uldd_task) in mpi_ssp_event()
2192 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_event()
2193 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_event()
2194 ts->open_rej_reason = SAS_OREJ_BAD_DEST; in mpi_ssp_event()
2198 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_event()
2199 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_event()
2200 ts->open_rej_reason = SAS_OREJ_CONN_RATE; in mpi_ssp_event()
2205 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_event()
2206 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_event()
2207 ts->open_rej_reason = SAS_OREJ_WRONG_DEST; in mpi_ssp_event()
2211 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_event()
2212 ts->stat = SAS_OPEN_REJECT; in mpi_ssp_event()
2213 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in mpi_ssp_event()
2217 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_event()
2218 ts->stat = SAS_NAK_R_ERR; in mpi_ssp_event()
2222 pm8001_handle_event(pm8001_ha, t, IO_XFER_OPEN_RETRY_TIMEOUT); in mpi_ssp_event()
2226 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_event()
2227 ts->stat = SAS_DATA_OVERRUN; in mpi_ssp_event()
2231 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_event()
2232 ts->stat = SAS_DATA_OVERRUN; in mpi_ssp_event()
2237 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_event()
2238 ts->stat = SAS_DATA_OVERRUN; in mpi_ssp_event()
2243 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_event()
2244 ts->stat = SAS_DATA_OVERRUN; in mpi_ssp_event()
2248 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_event()
2249 ts->stat = SAS_DATA_OVERRUN; in mpi_ssp_event()
2254 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_event()
2255 ts->stat = SAS_DATA_OVERRUN; in mpi_ssp_event()
2263 ts->resp = SAS_TASK_COMPLETE; in mpi_ssp_event()
2264 ts->stat = SAS_DATA_OVERRUN; in mpi_ssp_event()
2267 spin_lock_irqsave(&t->task_state_lock, flags); in mpi_ssp_event()
2268 t->task_state_flags &= ~SAS_TASK_STATE_PENDING; in mpi_ssp_event()
2269 t->task_state_flags &= ~SAS_TASK_AT_INITIATOR; in mpi_ssp_event()
2270 t->task_state_flags |= SAS_TASK_STATE_DONE; in mpi_ssp_event()
2271 if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) { in mpi_ssp_event()
2272 spin_unlock_irqrestore(&t->task_state_lock, flags); in mpi_ssp_event()
2274 t, event, ts->resp, ts->stat); in mpi_ssp_event()
2275 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); in mpi_ssp_event()
2277 spin_unlock_irqrestore(&t->task_state_lock, flags); in mpi_ssp_event()
2278 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); in mpi_ssp_event()
2280 t->task_done(t); in mpi_ssp_event()
2288 struct sas_task *t; in mpi_sata_completion() local
2306 status = le32_to_cpu(psataPayload->status); in mpi_sata_completion()
2307 tag = le32_to_cpu(psataPayload->tag); in mpi_sata_completion()
2313 ccb = &pm8001_ha->ccb_info[tag]; in mpi_sata_completion()
2314 param = le32_to_cpu(psataPayload->param); in mpi_sata_completion()
2316 t = ccb->task; in mpi_sata_completion()
2317 pm8001_dev = ccb->device; in mpi_sata_completion()
2323 if (t) { in mpi_sata_completion()
2324 if (t->dev && (t->dev->lldd_dev)) in mpi_sata_completion()
2325 pm8001_dev = t->dev->lldd_dev; in mpi_sata_completion()
2331 if ((pm8001_dev && !(pm8001_dev->id & NCQ_READ_LOG_FLAG)) in mpi_sata_completion()
2332 && unlikely(!t || !t->lldd_task || !t->dev)) { in mpi_sata_completion()
2337 ts = &t->task_status; in mpi_sata_completion()
2346 status, tag, t); in mpi_sata_completion()
2351 if (!((t->dev->parent) && in mpi_sata_completion()
2352 (dev_is_expander(t->dev->parent->dev_type)))) { in mpi_sata_completion()
2354 sata_addr_low[i] = pm8001_ha->sas_addr[j]; in mpi_sata_completion()
2356 sata_addr_hi[i] = pm8001_ha->sas_addr[j]; in mpi_sata_completion()
2376 pm8001_dev->attached_phy + in mpi_sata_completion()
2385 SAS_ADDR(t->dev->sas_addr)); in mpi_sata_completion()
2392 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2393 ts->stat = SAS_SAM_STAT_GOOD; in mpi_sata_completion()
2396 (pm8001_dev->id & NCQ_READ_LOG_FLAG)) { in mpi_sata_completion()
2398 pm8001_dev->id |= NCQ_ABORT_ALL_FLAG; in mpi_sata_completion()
2400 pm8001_dev->id = pm8001_dev->id & 0x7FFFFFFF; in mpi_sata_completion()
2404 sas_free_task(t); in mpi_sata_completion()
2409 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2410 ts->stat = SAS_PROTO_RESPONSE; in mpi_sata_completion()
2411 ts->residual = param; in mpi_sata_completion()
2415 sata_resp = &psataPayload->sata_resp[0]; in mpi_sata_completion()
2416 resp = (struct ata_task_resp *)ts->buf; in mpi_sata_completion()
2417 if (t->ata_task.dma_xfer == 0 && in mpi_sata_completion()
2418 t->data_dir == DMA_FROM_DEVICE) { in mpi_sata_completion()
2422 } else if (t->ata_task.use_ncq) { in mpi_sata_completion()
2432 resp->frame_len = len; in mpi_sata_completion()
2433 memcpy(&resp->ending_fis[0], sata_resp, len); in mpi_sata_completion()
2434 ts->buf_valid_size = sizeof(*resp); in mpi_sata_completion()
2440 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2444 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2445 ts->stat = SAS_ABORTED_TASK; in mpi_sata_completion()
2447 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2453 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2454 ts->stat = SAS_DATA_UNDERRUN; in mpi_sata_completion()
2455 ts->residual = param; in mpi_sata_completion()
2457 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2461 ts->resp = SAS_TASK_UNDELIVERED; in mpi_sata_completion()
2462 ts->stat = SAS_PHY_DOWN; in mpi_sata_completion()
2464 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2468 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2469 ts->stat = SAS_INTERRUPTED; in mpi_sata_completion()
2471 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2475 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2476 ts->stat = SAS_OPEN_REJECT; in mpi_sata_completion()
2477 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in mpi_sata_completion()
2479 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2483 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2484 ts->stat = SAS_OPEN_REJECT; in mpi_sata_completion()
2485 ts->open_rej_reason = SAS_OREJ_EPROTO; in mpi_sata_completion()
2487 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2492 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2493 ts->stat = SAS_OPEN_REJECT; in mpi_sata_completion()
2494 ts->open_rej_reason = SAS_OREJ_UNKNOWN; in mpi_sata_completion()
2496 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2500 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2501 ts->stat = SAS_OPEN_REJECT; in mpi_sata_completion()
2502 ts->open_rej_reason = SAS_OREJ_RSVD_CONT0; in mpi_sata_completion()
2504 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2508 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2509 ts->stat = SAS_DEV_NO_RESPONSE; in mpi_sata_completion()
2510 if (!t->uldd_task) { in mpi_sata_completion()
2514 ts->resp = SAS_TASK_UNDELIVERED; in mpi_sata_completion()
2515 ts->stat = SAS_QUEUE_FULL; in mpi_sata_completion()
2516 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag); in mpi_sata_completion()
2523 ts->resp = SAS_TASK_UNDELIVERED; in mpi_sata_completion()
2524 ts->stat = SAS_OPEN_REJECT; in mpi_sata_completion()
2525 ts->open_rej_reason = SAS_OREJ_BAD_DEST; in mpi_sata_completion()
2526 if (!t->uldd_task) { in mpi_sata_completion()
2530 ts->resp = SAS_TASK_UNDELIVERED; in mpi_sata_completion()
2531 ts->stat = SAS_QUEUE_FULL; in mpi_sata_completion()
2532 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag); in mpi_sata_completion()
2538 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2539 ts->stat = SAS_OPEN_REJECT; in mpi_sata_completion()
2540 ts->open_rej_reason = SAS_OREJ_CONN_RATE; in mpi_sata_completion()
2542 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2546 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2547 ts->stat = SAS_DEV_NO_RESPONSE; in mpi_sata_completion()
2548 if (!t->uldd_task) { in mpi_sata_completion()
2552 ts->resp = SAS_TASK_UNDELIVERED; in mpi_sata_completion()
2553 ts->stat = SAS_QUEUE_FULL; in mpi_sata_completion()
2554 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag); in mpi_sata_completion()
2561 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2562 ts->stat = SAS_OPEN_REJECT; in mpi_sata_completion()
2563 ts->open_rej_reason = SAS_OREJ_WRONG_DEST; in mpi_sata_completion()
2565 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2569 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2570 ts->stat = SAS_NAK_R_ERR; in mpi_sata_completion()
2572 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2576 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2577 ts->stat = SAS_NAK_R_ERR; in mpi_sata_completion()
2579 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2583 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2584 ts->stat = SAS_ABORTED_TASK; in mpi_sata_completion()
2586 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2590 ts->resp = SAS_TASK_UNDELIVERED; in mpi_sata_completion()
2591 ts->stat = SAS_DEV_NO_RESPONSE; in mpi_sata_completion()
2593 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2597 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2598 ts->stat = SAS_DATA_UNDERRUN; in mpi_sata_completion()
2600 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2604 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2605 ts->stat = SAS_OPEN_TO; in mpi_sata_completion()
2607 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2611 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2612 ts->stat = SAS_DEV_NO_RESPONSE; in mpi_sata_completion()
2614 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2618 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2619 ts->stat = SAS_DEV_NO_RESPONSE; in mpi_sata_completion()
2620 if (!t->uldd_task) { in mpi_sata_completion()
2623 ts->resp = SAS_TASK_UNDELIVERED; in mpi_sata_completion()
2624 ts->stat = SAS_QUEUE_FULL; in mpi_sata_completion()
2625 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag); in mpi_sata_completion()
2631 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2632 ts->stat = SAS_DEV_NO_RESPONSE; in mpi_sata_completion()
2634 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2638 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2639 ts->stat = SAS_DEV_NO_RESPONSE; in mpi_sata_completion()
2640 if (!t->uldd_task) { in mpi_sata_completion()
2643 ts->resp = SAS_TASK_UNDELIVERED; in mpi_sata_completion()
2644 ts->stat = SAS_QUEUE_FULL; in mpi_sata_completion()
2645 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag); in mpi_sata_completion()
2652 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2653 ts->stat = SAS_OPEN_REJECT; in mpi_sata_completion()
2654 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in mpi_sata_completion()
2656 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2661 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_completion()
2662 ts->stat = SAS_DEV_NO_RESPONSE; in mpi_sata_completion()
2664 atomic_dec(&pm8001_dev->running_req); in mpi_sata_completion()
2667 spin_lock_irqsave(&t->task_state_lock, flags); in mpi_sata_completion()
2668 t->task_state_flags &= ~SAS_TASK_STATE_PENDING; in mpi_sata_completion()
2669 t->task_state_flags &= ~SAS_TASK_AT_INITIATOR; in mpi_sata_completion()
2670 t->task_state_flags |= SAS_TASK_STATE_DONE; in mpi_sata_completion()
2671 if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) { in mpi_sata_completion()
2672 spin_unlock_irqrestore(&t->task_state_lock, flags); in mpi_sata_completion()
2675 t, status, ts->resp, ts->stat); in mpi_sata_completion()
2676 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); in mpi_sata_completion()
2678 spin_unlock_irqrestore(&t->task_state_lock, flags); in mpi_sata_completion()
2679 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag); in mpi_sata_completion()
2686 struct sas_task *t; in mpi_sata_event() local
2692 u32 event = le32_to_cpu(psataPayload->event); in mpi_sata_event()
2693 u32 tag = le32_to_cpu(psataPayload->tag); in mpi_sata_event()
2694 u32 port_id = le32_to_cpu(psataPayload->port_id); in mpi_sata_event()
2695 u32 dev_id = le32_to_cpu(psataPayload->device_id); in mpi_sata_event()
2698 ccb = &pm8001_ha->ccb_info[tag]; in mpi_sata_event()
2701 t = ccb->task; in mpi_sata_event()
2702 pm8001_dev = ccb->device; in mpi_sata_event()
2719 ccb = &pm8001_ha->ccb_info[tag]; in mpi_sata_event()
2720 t = ccb->task; in mpi_sata_event()
2721 pm8001_dev = ccb->device; in mpi_sata_event()
2724 if (unlikely(!t || !t->lldd_task || !t->dev)) in mpi_sata_event()
2726 ts = &t->task_status; in mpi_sata_event()
2733 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2734 ts->stat = SAS_DATA_OVERRUN; in mpi_sata_event()
2735 ts->residual = 0; in mpi_sata_event()
2737 atomic_dec(&pm8001_dev->running_req); in mpi_sata_event()
2741 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2742 ts->stat = SAS_INTERRUPTED; in mpi_sata_event()
2746 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2747 ts->stat = SAS_OPEN_REJECT; in mpi_sata_event()
2748 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in mpi_sata_event()
2752 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2753 ts->stat = SAS_OPEN_REJECT; in mpi_sata_event()
2754 ts->open_rej_reason = SAS_OREJ_EPROTO; in mpi_sata_event()
2759 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2760 ts->stat = SAS_OPEN_REJECT; in mpi_sata_event()
2761 ts->open_rej_reason = SAS_OREJ_UNKNOWN; in mpi_sata_event()
2765 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2766 ts->stat = SAS_OPEN_REJECT; in mpi_sata_event()
2767 ts->open_rej_reason = SAS_OREJ_RSVD_CONT0; in mpi_sata_event()
2771 ts->resp = SAS_TASK_UNDELIVERED; in mpi_sata_event()
2772 ts->stat = SAS_DEV_NO_RESPONSE; in mpi_sata_event()
2773 if (!t->uldd_task) { in mpi_sata_event()
2777 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2778 ts->stat = SAS_QUEUE_FULL; in mpi_sata_event()
2779 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag); in mpi_sata_event()
2786 ts->resp = SAS_TASK_UNDELIVERED; in mpi_sata_event()
2787 ts->stat = SAS_OPEN_REJECT; in mpi_sata_event()
2788 ts->open_rej_reason = SAS_OREJ_BAD_DEST; in mpi_sata_event()
2792 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2793 ts->stat = SAS_OPEN_REJECT; in mpi_sata_event()
2794 ts->open_rej_reason = SAS_OREJ_CONN_RATE; in mpi_sata_event()
2799 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2800 ts->stat = SAS_OPEN_REJECT; in mpi_sata_event()
2801 ts->open_rej_reason = SAS_OREJ_WRONG_DEST; in mpi_sata_event()
2805 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2806 ts->stat = SAS_NAK_R_ERR; in mpi_sata_event()
2810 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2811 ts->stat = SAS_NAK_R_ERR; in mpi_sata_event()
2815 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2816 ts->stat = SAS_DATA_UNDERRUN; in mpi_sata_event()
2820 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2821 ts->stat = SAS_OPEN_TO; in mpi_sata_event()
2825 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2826 ts->stat = SAS_OPEN_TO; in mpi_sata_event()
2830 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2831 ts->stat = SAS_OPEN_TO; in mpi_sata_event()
2836 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2837 ts->stat = SAS_OPEN_TO; in mpi_sata_event()
2841 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2842 ts->stat = SAS_OPEN_TO; in mpi_sata_event()
2847 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2848 ts->stat = SAS_OPEN_TO; in mpi_sata_event()
2855 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2856 ts->stat = SAS_OPEN_TO; in mpi_sata_event()
2861 ts->resp = SAS_TASK_COMPLETE; in mpi_sata_event()
2862 ts->stat = SAS_OPEN_TO; in mpi_sata_event()
2865 spin_lock_irqsave(&t->task_state_lock, flags); in mpi_sata_event()
2866 t->task_state_flags &= ~SAS_TASK_STATE_PENDING; in mpi_sata_event()
2867 t->task_state_flags &= ~SAS_TASK_AT_INITIATOR; in mpi_sata_event()
2868 t->task_state_flags |= SAS_TASK_STATE_DONE; in mpi_sata_event()
2869 if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) { in mpi_sata_event()
2870 spin_unlock_irqrestore(&t->task_state_lock, flags); in mpi_sata_event()
2873 t, event, ts->resp, ts->stat); in mpi_sata_event()
2874 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); in mpi_sata_event()
2876 spin_unlock_irqrestore(&t->task_state_lock, flags); in mpi_sata_event()
2877 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag); in mpi_sata_event()
2885 struct sas_task *t; in mpi_smp_completion() local
2895 status = le32_to_cpu(psmpPayload->status); in mpi_smp_completion()
2896 tag = le32_to_cpu(psmpPayload->tag); in mpi_smp_completion()
2898 ccb = &pm8001_ha->ccb_info[tag]; in mpi_smp_completion()
2899 t = ccb->task; in mpi_smp_completion()
2900 ts = &t->task_status; in mpi_smp_completion()
2901 pm8001_dev = ccb->device; in mpi_smp_completion()
2906 status, tag, t); in mpi_smp_completion()
2908 if (unlikely(!t || !t->lldd_task || !t->dev)) in mpi_smp_completion()
2914 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
2915 ts->stat = SAS_SAM_STAT_GOOD; in mpi_smp_completion()
2917 atomic_dec(&pm8001_dev->running_req); in mpi_smp_completion()
2921 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
2922 ts->stat = SAS_ABORTED_TASK; in mpi_smp_completion()
2924 atomic_dec(&pm8001_dev->running_req); in mpi_smp_completion()
2928 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
2929 ts->stat = SAS_DATA_OVERRUN; in mpi_smp_completion()
2930 ts->residual = 0; in mpi_smp_completion()
2932 atomic_dec(&pm8001_dev->running_req); in mpi_smp_completion()
2936 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
2937 ts->stat = SAS_PHY_DOWN; in mpi_smp_completion()
2941 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
2942 ts->stat = SAS_SAM_STAT_BUSY; in mpi_smp_completion()
2946 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
2947 ts->stat = SAS_SAM_STAT_BUSY; in mpi_smp_completion()
2951 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
2952 ts->stat = SAS_SAM_STAT_BUSY; in mpi_smp_completion()
2957 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
2958 ts->stat = SAS_OPEN_REJECT; in mpi_smp_completion()
2959 ts->open_rej_reason = SAS_OREJ_UNKNOWN; in mpi_smp_completion()
2964 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
2965 ts->stat = SAS_OPEN_REJECT; in mpi_smp_completion()
2966 ts->open_rej_reason = SAS_OREJ_UNKNOWN; in mpi_smp_completion()
2970 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
2971 ts->stat = SAS_OPEN_REJECT; in mpi_smp_completion()
2972 ts->open_rej_reason = SAS_OREJ_RSVD_CONT0; in mpi_smp_completion()
2976 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
2977 ts->stat = SAS_OPEN_REJECT; in mpi_smp_completion()
2978 ts->open_rej_reason = SAS_OREJ_UNKNOWN; in mpi_smp_completion()
2986 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
2987 ts->stat = SAS_OPEN_REJECT; in mpi_smp_completion()
2988 ts->open_rej_reason = SAS_OREJ_BAD_DEST; in mpi_smp_completion()
2992 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
2993 ts->stat = SAS_OPEN_REJECT; in mpi_smp_completion()
2994 ts->open_rej_reason = SAS_OREJ_CONN_RATE; in mpi_smp_completion()
2999 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
3000 ts->stat = SAS_OPEN_REJECT; in mpi_smp_completion()
3001 ts->open_rej_reason = SAS_OREJ_WRONG_DEST; in mpi_smp_completion()
3005 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
3006 ts->stat = SAS_DEV_NO_RESPONSE; in mpi_smp_completion()
3010 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
3011 ts->stat = SAS_OPEN_REJECT; in mpi_smp_completion()
3012 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in mpi_smp_completion()
3016 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
3017 ts->stat = SAS_QUEUE_FULL; in mpi_smp_completion()
3021 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
3022 ts->stat = SAS_OPEN_REJECT; in mpi_smp_completion()
3023 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in mpi_smp_completion()
3027 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
3028 ts->stat = SAS_DEV_NO_RESPONSE; in mpi_smp_completion()
3032 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
3033 ts->stat = SAS_OPEN_REJECT; in mpi_smp_completion()
3034 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in mpi_smp_completion()
3039 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
3040 ts->stat = SAS_OPEN_REJECT; in mpi_smp_completion()
3041 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in mpi_smp_completion()
3045 ts->resp = SAS_TASK_COMPLETE; in mpi_smp_completion()
3046 ts->stat = SAS_DEV_NO_RESPONSE; in mpi_smp_completion()
3050 spin_lock_irqsave(&t->task_state_lock, flags); in mpi_smp_completion()
3051 t->task_state_flags &= ~SAS_TASK_STATE_PENDING; in mpi_smp_completion()
3052 t->task_state_flags &= ~SAS_TASK_AT_INITIATOR; in mpi_smp_completion()
3053 t->task_state_flags |= SAS_TASK_STATE_DONE; in mpi_smp_completion()
3054 if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) { in mpi_smp_completion()
3055 spin_unlock_irqrestore(&t->task_state_lock, flags); in mpi_smp_completion()
3057 t, status, ts->resp, ts->stat); in mpi_smp_completion()
3058 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); in mpi_smp_completion()
3060 spin_unlock_irqrestore(&t->task_state_lock, flags); in mpi_smp_completion()
3061 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); in mpi_smp_completion()
3063 t->task_done(t); in mpi_smp_completion()
3072 u32 tag = le32_to_cpu(pPayload->tag); in pm8001_mpi_set_dev_state_resp()
3073 struct pm8001_ccb_info *ccb = &pm8001_ha->ccb_info[tag]; in pm8001_mpi_set_dev_state_resp()
3074 struct pm8001_device *pm8001_dev = ccb->device; in pm8001_mpi_set_dev_state_resp()
3075 u32 status = le32_to_cpu(pPayload->status); in pm8001_mpi_set_dev_state_resp()
3076 u32 device_id = le32_to_cpu(pPayload->device_id); in pm8001_mpi_set_dev_state_resp()
3077 u8 pds = le32_to_cpu(pPayload->pds_nds) & PDS_BITS; in pm8001_mpi_set_dev_state_resp()
3078 u8 nds = le32_to_cpu(pPayload->pds_nds) & NDS_BITS; in pm8001_mpi_set_dev_state_resp()
3081 complete(pm8001_dev->setds_completion); in pm8001_mpi_set_dev_state_resp()
3082 ccb->task = NULL; in pm8001_mpi_set_dev_state_resp()
3083 ccb->ccb_tag = 0xFFFFFFFF; in pm8001_mpi_set_dev_state_resp()
3091 u32 tag = le32_to_cpu(pPayload->tag); in pm8001_mpi_set_nvmd_resp()
3092 struct pm8001_ccb_info *ccb = &pm8001_ha->ccb_info[tag]; in pm8001_mpi_set_nvmd_resp()
3093 u32 dlen_status = le32_to_cpu(pPayload->dlen_status); in pm8001_mpi_set_nvmd_resp()
3094 complete(pm8001_ha->nvmd_completion); in pm8001_mpi_set_nvmd_resp()
3100 ccb->task = NULL; in pm8001_mpi_set_nvmd_resp()
3101 ccb->ccb_tag = 0xFFFFFFFF; in pm8001_mpi_set_nvmd_resp()
3111 u32 tag = le32_to_cpu(pPayload->tag); in pm8001_mpi_get_nvmd_resp()
3112 struct pm8001_ccb_info *ccb = &pm8001_ha->ccb_info[tag]; in pm8001_mpi_get_nvmd_resp()
3113 u32 dlen_status = le32_to_cpu(pPayload->dlen_status); in pm8001_mpi_get_nvmd_resp()
3115 le32_to_cpu(pPayload->ir_tda_bn_dps_das_nvm); in pm8001_mpi_get_nvmd_resp()
3116 void *virt_addr = pm8001_ha->memoryMap.region[NVMD].virt_ptr; in pm8001_mpi_get_nvmd_resp()
3117 fw_control_context = ccb->fw_control_context; in pm8001_mpi_get_nvmd_resp()
3123 complete(pm8001_ha->nvmd_completion); in pm8001_mpi_get_nvmd_resp()
3127 ccb->task = NULL; in pm8001_mpi_get_nvmd_resp()
3128 ccb->ccb_tag = 0xFFFFFFFF; in pm8001_mpi_get_nvmd_resp()
3133 /* indirect mode - IR bit set */ in pm8001_mpi_get_nvmd_resp()
3137 memcpy(pm8001_ha->sas_addr, in pm8001_mpi_get_nvmd_resp()
3163 memcpy(fw_control_context->usrAddr, in pm8001_mpi_get_nvmd_resp()
3164 pm8001_ha->memoryMap.region[NVMD].virt_ptr, in pm8001_mpi_get_nvmd_resp()
3165 fw_control_context->len); in pm8001_mpi_get_nvmd_resp()
3166 kfree(ccb->fw_control_context); in pm8001_mpi_get_nvmd_resp()
3169 * fw_control_context->usrAddr in pm8001_mpi_get_nvmd_resp()
3171 complete(pm8001_ha->nvmd_completion); in pm8001_mpi_get_nvmd_resp()
3173 ccb->task = NULL; in pm8001_mpi_get_nvmd_resp()
3174 ccb->ccb_tag = 0xFFFFFFFF; in pm8001_mpi_get_nvmd_resp()
3183 u32 status = le32_to_cpu(pPayload->status); in pm8001_mpi_local_phy_ctl()
3184 u32 phy_id = le32_to_cpu(pPayload->phyop_phyid) & ID_BITS; in pm8001_mpi_local_phy_ctl()
3185 u32 phy_op = le32_to_cpu(pPayload->phyop_phyid) & OP_BITS; in pm8001_mpi_local_phy_ctl()
3186 tag = le32_to_cpu(pPayload->tag); in pm8001_mpi_local_phy_ctl()
3189 "%x phy execute %x phy op failed!\n", in pm8001_mpi_local_phy_ctl()
3193 "%x phy execute %x phy op success!\n", in pm8001_mpi_local_phy_ctl()
3195 pm8001_ha->phy[phy_id].reset_success = true; in pm8001_mpi_local_phy_ctl()
3197 if (pm8001_ha->phy[phy_id].enable_completion) { in pm8001_mpi_local_phy_ctl()
3198 complete(pm8001_ha->phy[phy_id].enable_completion); in pm8001_mpi_local_phy_ctl()
3199 pm8001_ha->phy[phy_id].enable_completion = NULL; in pm8001_mpi_local_phy_ctl()
3206 * pm8001_bytes_dmaed - one of the interface function communication with libsas
3208 * @i: which phy that received the event.
3218 struct pm8001_phy *phy = &pm8001_ha->phy[i]; in pm8001_bytes_dmaed() local
3219 struct asd_sas_phy *sas_phy = &phy->sas_phy; in pm8001_bytes_dmaed()
3220 if (!phy->phy_attached) in pm8001_bytes_dmaed()
3223 if (sas_phy->phy) { in pm8001_bytes_dmaed()
3224 struct sas_phy *sphy = sas_phy->phy; in pm8001_bytes_dmaed()
3225 sphy->negotiated_linkrate = sas_phy->linkrate; in pm8001_bytes_dmaed()
3226 sphy->minimum_linkrate = phy->minimum_linkrate; in pm8001_bytes_dmaed()
3227 sphy->minimum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS; in pm8001_bytes_dmaed()
3228 sphy->maximum_linkrate = phy->maximum_linkrate; in pm8001_bytes_dmaed()
3229 sphy->maximum_linkrate_hw = phy->maximum_linkrate; in pm8001_bytes_dmaed()
3232 if (phy->phy_type & PORT_TYPE_SAS) { in pm8001_bytes_dmaed()
3234 id = (struct sas_identify_frame *)phy->frame_rcvd; in pm8001_bytes_dmaed()
3235 id->dev_type = phy->identify.device_type; in pm8001_bytes_dmaed()
3236 id->initiator_bits = SAS_PROTOCOL_ALL; in pm8001_bytes_dmaed()
3237 id->target_bits = phy->identify.target_port_protocols; in pm8001_bytes_dmaed()
3238 } else if (phy->phy_type & PORT_TYPE_SATA) { in pm8001_bytes_dmaed()
3241 pm8001_dbg(pm8001_ha, MSG, "phy %d byte dmaded.\n", i); in pm8001_bytes_dmaed()
3243 sas_phy->frame_rcvd_size = phy->frame_rcvd_size; in pm8001_bytes_dmaed()
3248 void pm8001_get_lrate_mode(struct pm8001_phy *phy, u8 link_rate) in pm8001_get_lrate_mode() argument
3250 struct sas_phy *sas_phy = phy->sas_phy.phy; in pm8001_get_lrate_mode()
3254 phy->sas_phy.linkrate = SAS_LINK_RATE_12_0_GBPS; in pm8001_get_lrate_mode()
3255 phy->sas_phy.phy->negotiated_linkrate = SAS_LINK_RATE_12_0_GBPS; in pm8001_get_lrate_mode()
3258 phy->sas_phy.linkrate = SAS_LINK_RATE_6_0_GBPS; in pm8001_get_lrate_mode()
3259 phy->sas_phy.phy->negotiated_linkrate = SAS_LINK_RATE_6_0_GBPS; in pm8001_get_lrate_mode()
3262 phy->sas_phy.linkrate = SAS_LINK_RATE_3_0_GBPS; in pm8001_get_lrate_mode()
3263 phy->sas_phy.phy->negotiated_linkrate = SAS_LINK_RATE_3_0_GBPS; in pm8001_get_lrate_mode()
3266 phy->sas_phy.linkrate = SAS_LINK_RATE_1_5_GBPS; in pm8001_get_lrate_mode()
3267 phy->sas_phy.phy->negotiated_linkrate = SAS_LINK_RATE_1_5_GBPS; in pm8001_get_lrate_mode()
3270 sas_phy->negotiated_linkrate = phy->sas_phy.linkrate; in pm8001_get_lrate_mode()
3271 sas_phy->maximum_linkrate_hw = SAS_LINK_RATE_6_0_GBPS; in pm8001_get_lrate_mode()
3272 sas_phy->minimum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS; in pm8001_get_lrate_mode()
3273 sas_phy->maximum_linkrate = SAS_LINK_RATE_6_0_GBPS; in pm8001_get_lrate_mode()
3274 sas_phy->minimum_linkrate = SAS_LINK_RATE_1_5_GBPS; in pm8001_get_lrate_mode()
3278 * pm8001_get_attached_sas_addr - extract/generate attached SAS address
3279 * @phy: pointer to asd_phy
3289 void pm8001_get_attached_sas_addr(struct pm8001_phy *phy, in pm8001_get_attached_sas_addr() argument
3292 if (phy->sas_phy.frame_rcvd[0] == 0x34 in pm8001_get_attached_sas_addr()
3293 && phy->sas_phy.oob_mode == SATA_OOB_MODE) { in pm8001_get_attached_sas_addr()
3294 struct pm8001_hba_info *pm8001_ha = phy->sas_phy.ha->lldd_ha; in pm8001_get_attached_sas_addr()
3295 /* FIS device-to-host */ in pm8001_get_attached_sas_addr()
3296 u64 addr = be64_to_cpu(*(__be64 *)pm8001_ha->sas_addr); in pm8001_get_attached_sas_addr()
3297 addr += phy->sas_phy.id; in pm8001_get_attached_sas_addr()
3301 (void *) phy->sas_phy.frame_rcvd; in pm8001_get_attached_sas_addr()
3302 memcpy(sas_addr, idframe->sas_addr, SAS_ADDR_SIZE); in pm8001_get_attached_sas_addr()
3307 * pm8001_hw_event_ack_req- For PM8001,some events need to acknowage to FW.
3312 * @phyId: phy id.
3325 circularQ = &pm8001_ha->inbnd_q_tbl[Qnum]; in pm8001_hw_event_ack_req()
3339 * hw_event_sas_phy_up -FW tells me a SAS phy up event.
3349 le32_to_cpu(pPayload->lr_evt_status_phyid_portid); in hw_event_sas_phy_up()
3355 u32 npip_portstate = le32_to_cpu(pPayload->npip_portstate); in hw_event_sas_phy_up()
3357 struct pm8001_port *port = &pm8001_ha->port[port_id]; in hw_event_sas_phy_up()
3358 struct pm8001_phy *phy = &pm8001_ha->phy[phy_id]; in hw_event_sas_phy_up() local
3360 u8 deviceType = pPayload->sas_identify.dev_type; in hw_event_sas_phy_up()
3361 port->port_state = portstate; in hw_event_sas_phy_up()
3362 phy->phy_state = PHY_STATE_LINK_UP_SPC; in hw_event_sas_phy_up()
3364 "HW_EVENT_SAS_PHY_UP port id = %d, phy id = %d\n", in hw_event_sas_phy_up()
3375 port->port_attached = 1; in hw_event_sas_phy_up()
3376 pm8001_get_lrate_mode(phy, link_rate); in hw_event_sas_phy_up()
3380 port->port_attached = 1; in hw_event_sas_phy_up()
3381 pm8001_get_lrate_mode(phy, link_rate); in hw_event_sas_phy_up()
3385 port->port_attached = 1; in hw_event_sas_phy_up()
3386 pm8001_get_lrate_mode(phy, link_rate); in hw_event_sas_phy_up()
3393 phy->phy_type |= PORT_TYPE_SAS; in hw_event_sas_phy_up()
3394 phy->identify.device_type = deviceType; in hw_event_sas_phy_up()
3395 phy->phy_attached = 1; in hw_event_sas_phy_up()
3396 if (phy->identify.device_type == SAS_END_DEVICE) in hw_event_sas_phy_up()
3397 phy->identify.target_port_protocols = SAS_PROTOCOL_SSP; in hw_event_sas_phy_up()
3398 else if (phy->identify.device_type != SAS_PHY_UNUSED) in hw_event_sas_phy_up()
3399 phy->identify.target_port_protocols = SAS_PROTOCOL_SMP; in hw_event_sas_phy_up()
3400 phy->sas_phy.oob_mode = SAS_OOB_MODE; in hw_event_sas_phy_up()
3401 sas_notify_phy_event(&phy->sas_phy, PHYE_OOB_DONE, GFP_ATOMIC); in hw_event_sas_phy_up()
3402 spin_lock_irqsave(&phy->sas_phy.frame_rcvd_lock, flags); in hw_event_sas_phy_up()
3403 memcpy(phy->frame_rcvd, &pPayload->sas_identify, in hw_event_sas_phy_up()
3404 sizeof(struct sas_identify_frame)-4); in hw_event_sas_phy_up()
3405 phy->frame_rcvd_size = sizeof(struct sas_identify_frame) - 4; in hw_event_sas_phy_up()
3406 pm8001_get_attached_sas_addr(phy, phy->sas_phy.attached_sas_addr); in hw_event_sas_phy_up()
3407 spin_unlock_irqrestore(&phy->sas_phy.frame_rcvd_lock, flags); in hw_event_sas_phy_up()
3408 if (pm8001_ha->flags == PM8001F_RUN_TIME) in hw_event_sas_phy_up()
3414 * hw_event_sata_phy_up -FW tells me a SATA phy up event.
3424 le32_to_cpu(pPayload->lr_evt_status_phyid_portid); in hw_event_sata_phy_up()
3430 u32 npip_portstate = le32_to_cpu(pPayload->npip_portstate); in hw_event_sata_phy_up()
3432 struct pm8001_port *port = &pm8001_ha->port[port_id]; in hw_event_sata_phy_up()
3433 struct pm8001_phy *phy = &pm8001_ha->phy[phy_id]; in hw_event_sata_phy_up() local
3435 pm8001_dbg(pm8001_ha, DEVIO, "HW_EVENT_SATA_PHY_UP port id = %d, phy id = %d\n", in hw_event_sata_phy_up()
3437 port->port_state = portstate; in hw_event_sata_phy_up()
3438 phy->phy_state = PHY_STATE_LINK_UP_SPC; in hw_event_sata_phy_up()
3439 port->port_attached = 1; in hw_event_sata_phy_up()
3440 pm8001_get_lrate_mode(phy, link_rate); in hw_event_sata_phy_up()
3441 phy->phy_type |= PORT_TYPE_SATA; in hw_event_sata_phy_up()
3442 phy->phy_attached = 1; in hw_event_sata_phy_up()
3443 phy->sas_phy.oob_mode = SATA_OOB_MODE; in hw_event_sata_phy_up()
3444 sas_notify_phy_event(&phy->sas_phy, PHYE_OOB_DONE, GFP_ATOMIC); in hw_event_sata_phy_up()
3445 spin_lock_irqsave(&phy->sas_phy.frame_rcvd_lock, flags); in hw_event_sata_phy_up()
3446 memcpy(phy->frame_rcvd, ((u8 *)&pPayload->sata_fis - 4), in hw_event_sata_phy_up()
3448 phy->frame_rcvd_size = sizeof(struct dev_to_host_fis); in hw_event_sata_phy_up()
3449 phy->identify.target_port_protocols = SAS_PROTOCOL_SATA; in hw_event_sata_phy_up()
3450 phy->identify.device_type = SAS_SATA_DEV; in hw_event_sata_phy_up()
3451 pm8001_get_attached_sas_addr(phy, phy->sas_phy.attached_sas_addr); in hw_event_sata_phy_up()
3452 spin_unlock_irqrestore(&phy->sas_phy.frame_rcvd_lock, flags); in hw_event_sata_phy_up()
3457 * hw_event_phy_down -we should notify the libsas the phy is down.
3467 le32_to_cpu(pPayload->lr_evt_status_phyid_portid); in hw_event_phy_down()
3471 u32 npip_portstate = le32_to_cpu(pPayload->npip_portstate); in hw_event_phy_down()
3473 struct pm8001_port *port = &pm8001_ha->port[port_id]; in hw_event_phy_down()
3474 struct pm8001_phy *phy = &pm8001_ha->phy[phy_id]; in hw_event_phy_down() local
3475 port->port_state = portstate; in hw_event_phy_down()
3476 phy->phy_type = 0; in hw_event_phy_down()
3477 phy->identify.device_type = 0; in hw_event_phy_down()
3478 phy->phy_attached = 0; in hw_event_phy_down()
3479 memset(&phy->dev_sas_addr, 0, SAS_ADDR_SIZE); in hw_event_phy_down()
3487 " Last phy Down and port invalid\n"); in hw_event_phy_down()
3488 port->port_attached = 0; in hw_event_phy_down()
3498 " phy Down and PORT_NOT_ESTABLISHED\n"); in hw_event_phy_down()
3499 port->port_attached = 0; in hw_event_phy_down()
3502 pm8001_dbg(pm8001_ha, MSG, " phy Down and PORT_LOSTCOMM\n"); in hw_event_phy_down()
3504 " Last phy Down and port invalid\n"); in hw_event_phy_down()
3505 port->port_attached = 0; in hw_event_phy_down()
3510 port->port_attached = 0; in hw_event_phy_down()
3511 pm8001_dbg(pm8001_ha, DEVIO, " phy Down and(default) = %x\n", in hw_event_phy_down()
3519 * pm8001_mpi_reg_resp -process register device ID response.
3525 * has assigned, from now, inter-communication with FW is no longer using the
3538 htag = le32_to_cpu(registerRespPayload->tag); in pm8001_mpi_reg_resp()
3539 ccb = &pm8001_ha->ccb_info[htag]; in pm8001_mpi_reg_resp()
3540 pm8001_dev = ccb->device; in pm8001_mpi_reg_resp()
3541 status = le32_to_cpu(registerRespPayload->status); in pm8001_mpi_reg_resp()
3542 device_id = le32_to_cpu(registerRespPayload->device_id); in pm8001_mpi_reg_resp()
3548 pm8001_dev->device_id = device_id; in pm8001_mpi_reg_resp()
3581 complete(pm8001_dev->dcompletion); in pm8001_mpi_reg_resp()
3582 ccb->task = NULL; in pm8001_mpi_reg_resp()
3583 ccb->ccb_tag = 0xFFFFFFFF; in pm8001_mpi_reg_resp()
3595 status = le32_to_cpu(registerRespPayload->status); in pm8001_mpi_dereg_resp()
3596 device_id = le32_to_cpu(registerRespPayload->device_id); in pm8001_mpi_dereg_resp()
3605 * pm8001_mpi_fw_flash_update_resp - Response from FW for flash update command.
3615 u32 tag = le32_to_cpu(ppayload->tag); in pm8001_mpi_fw_flash_update_resp()
3616 struct pm8001_ccb_info *ccb = &pm8001_ha->ccb_info[tag]; in pm8001_mpi_fw_flash_update_resp()
3617 status = le32_to_cpu(ppayload->status); in pm8001_mpi_fw_flash_update_resp()
3653 kfree(ccb->fw_control_context); in pm8001_mpi_fw_flash_update_resp()
3654 ccb->task = NULL; in pm8001_mpi_fw_flash_update_resp()
3655 ccb->ccb_tag = 0xFFFFFFFF; in pm8001_mpi_fw_flash_update_resp()
3657 complete(pm8001_ha->nvmd_completion); in pm8001_mpi_fw_flash_update_resp()
3667 status = le32_to_cpu(pPayload->status); in pm8001_mpi_general_event()
3672 pPayload->inb_IOMB_payload[i]); in pm8001_mpi_general_event()
3678 struct sas_task *t; in pm8001_mpi_task_abort_resp() local
3689 status = le32_to_cpu(pPayload->status); in pm8001_mpi_task_abort_resp()
3690 tag = le32_to_cpu(pPayload->tag); in pm8001_mpi_task_abort_resp()
3693 return -1; in pm8001_mpi_task_abort_resp()
3696 scp = le32_to_cpu(pPayload->scp); in pm8001_mpi_task_abort_resp()
3697 ccb = &pm8001_ha->ccb_info[tag]; in pm8001_mpi_task_abort_resp()
3698 t = ccb->task; in pm8001_mpi_task_abort_resp()
3699 pm8001_dev = ccb->device; /* retrieve device */ in pm8001_mpi_task_abort_resp()
3701 if (!t) { in pm8001_mpi_task_abort_resp()
3703 return -1; in pm8001_mpi_task_abort_resp()
3705 ts = &t->task_status; in pm8001_mpi_task_abort_resp()
3712 ts->resp = SAS_TASK_COMPLETE; in pm8001_mpi_task_abort_resp()
3713 ts->stat = SAS_SAM_STAT_GOOD; in pm8001_mpi_task_abort_resp()
3717 ts->resp = TMF_RESP_FUNC_FAILED; in pm8001_mpi_task_abort_resp()
3720 spin_lock_irqsave(&t->task_state_lock, flags); in pm8001_mpi_task_abort_resp()
3721 t->task_state_flags &= ~SAS_TASK_STATE_PENDING; in pm8001_mpi_task_abort_resp()
3722 t->task_state_flags &= ~SAS_TASK_AT_INITIATOR; in pm8001_mpi_task_abort_resp()
3723 t->task_state_flags |= SAS_TASK_STATE_DONE; in pm8001_mpi_task_abort_resp()
3724 spin_unlock_irqrestore(&t->task_state_lock, flags); in pm8001_mpi_task_abort_resp()
3725 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); in pm8001_mpi_task_abort_resp()
3728 if (pm8001_dev->id & NCQ_ABORT_ALL_FLAG) { in pm8001_mpi_task_abort_resp()
3730 sas_free_task(t); in pm8001_mpi_task_abort_resp()
3732 pm8001_dev->id &= 0xBFFFFFFF; in pm8001_mpi_task_abort_resp()
3734 t->task_done(t); in pm8001_mpi_task_abort_resp()
3740 * mpi_hw_event -The hw event has come.
3750 le32_to_cpu(pPayload->lr_evt_status_phyid_portid); in mpi_hw_event()
3758 struct sas_ha_struct *sas_ha = pm8001_ha->sas; in mpi_hw_event()
3759 struct pm8001_phy *phy = &pm8001_ha->phy[phy_id]; in mpi_hw_event() local
3760 struct asd_sas_phy *sas_phy = sas_ha->sas_phy[phy_id]; in mpi_hw_event()
3769 phy->phy_state = 1; in mpi_hw_event()
3771 if (pm8001_ha->flags == PM8001F_RUN_TIME && in mpi_hw_event()
3772 phy->enable_completion != NULL) { in mpi_hw_event()
3773 complete(phy->enable_completion); in mpi_hw_event()
3774 phy->enable_completion = NULL; in mpi_hw_event()
3789 phy->phy_state = 0; in mpi_hw_event()
3793 sas_notify_phy_event(&phy->sas_phy, PHYE_SPINUP_HOLD, in mpi_hw_event()
3798 sas_notify_phy_event(&phy->sas_phy, PHYE_LOSS_OF_SIGNAL, in mpi_hw_event()
3800 phy->phy_attached = 0; in mpi_hw_event()
3801 phy->phy_state = 0; in mpi_hw_event()
3807 phy->phy_attached = 0; in mpi_hw_event()
3817 spin_lock_irqsave(&sas_phy->sas_prim_lock, flags); in mpi_hw_event()
3818 sas_phy->sas_prim = HW_EVENT_BROADCAST_CHANGE; in mpi_hw_event()
3819 spin_unlock_irqrestore(&sas_phy->sas_prim_lock, flags); in mpi_hw_event()
3825 sas_phy_disconnected(&phy->sas_phy); in mpi_hw_event()
3826 phy->phy_attached = 0; in mpi_hw_event()
3827 sas_notify_phy_event(&phy->sas_phy, PHYE_OOB_ERROR, GFP_ATOMIC); in mpi_hw_event()
3831 spin_lock_irqsave(&sas_phy->sas_prim_lock, flags); in mpi_hw_event()
3832 sas_phy->sas_prim = HW_EVENT_BROADCAST_EXP; in mpi_hw_event()
3833 spin_unlock_irqrestore(&sas_phy->sas_prim_lock, flags); in mpi_hw_event()
3843 phy->phy_attached = 0; in mpi_hw_event()
3854 phy->phy_attached = 0; in mpi_hw_event()
3865 phy->phy_attached = 0; in mpi_hw_event()
3876 phy->phy_attached = 0; in mpi_hw_event()
3885 spin_lock_irqsave(&sas_phy->sas_prim_lock, flags); in mpi_hw_event()
3886 sas_phy->sas_prim = HW_EVENT_BROADCAST_SES; in mpi_hw_event()
3887 spin_unlock_irqrestore(&sas_phy->sas_prim_lock, flags); in mpi_hw_event()
3904 phy->phy_attached = 0; in mpi_hw_event()
3915 phy->phy_attached = 0; in mpi_hw_event()
3922 phy->phy_attached = 0; in mpi_hw_event()
3930 phy->phy_attached = 0; in mpi_hw_event()
3952 * process_one_iomb - process one outbound Queue memory block
4099 spin_lock_irqsave(&pm8001_ha->lock, flags); in process_oq()
4100 circularQ = &pm8001_ha->outbnd_q_tbl[vec]; in process_oq()
4105 process_one_iomb(pm8001_ha, (void *)(pMsg1 - 4)); in process_oq()
4112 circularQ->producer_index = in process_oq()
4113 cpu_to_le32(pm8001_read_32(circularQ->pi_virt)); in process_oq()
4114 if (le32_to_cpu(circularQ->producer_index) == in process_oq()
4115 circularQ->consumer_idx) in process_oq()
4120 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in process_oq()
4139 buf_prd->addr = cpu_to_le64(sg_dma_address(sg)); in pm8001_chip_make_sg()
4140 buf_prd->im_len.len = cpu_to_le32(sg_dma_len(sg)); in pm8001_chip_make_sg()
4141 buf_prd->im_len.e = 0; in pm8001_chip_make_sg()
4148 psmp_cmd->tag = hTag; in build_smp_cmd()
4149 psmp_cmd->device_id = cpu_to_le32(deviceID); in build_smp_cmd()
4150 psmp_cmd->len_ip_ir = cpu_to_le32(1|(1 << 1)); in build_smp_cmd()
4154 * pm8001_chip_smp_req - send a SMP task to FW
4162 struct sas_task *task = ccb->task; in pm8001_chip_smp_req()
4163 struct domain_device *dev = task->dev; in pm8001_chip_smp_req()
4164 struct pm8001_device *pm8001_dev = dev->lldd_dev; in pm8001_chip_smp_req()
4173 * DMA-map SMP request, response buffers in pm8001_chip_smp_req()
4175 sg_req = &task->smp_task.smp_req; in pm8001_chip_smp_req()
4176 elem = dma_map_sg(pm8001_ha->dev, sg_req, 1, DMA_TO_DEVICE); in pm8001_chip_smp_req()
4178 return -ENOMEM; in pm8001_chip_smp_req()
4181 sg_resp = &task->smp_task.smp_resp; in pm8001_chip_smp_req()
4182 elem = dma_map_sg(pm8001_ha->dev, sg_resp, 1, DMA_FROM_DEVICE); in pm8001_chip_smp_req()
4184 rc = -ENOMEM; in pm8001_chip_smp_req()
4190 rc = -EINVAL; in pm8001_chip_smp_req()
4195 circularQ = &pm8001_ha->inbnd_q_tbl[0]; in pm8001_chip_smp_req()
4196 smp_cmd.tag = cpu_to_le32(ccb->ccb_tag); in pm8001_chip_smp_req()
4198 cpu_to_le64((u64)sg_dma_address(&task->smp_task.smp_req)); in pm8001_chip_smp_req()
4200 cpu_to_le32((u32)sg_dma_len(&task->smp_task.smp_req)-4); in pm8001_chip_smp_req()
4202 cpu_to_le64((u64)sg_dma_address(&task->smp_task.smp_resp)); in pm8001_chip_smp_req()
4204 cpu_to_le32((u32)sg_dma_len(&task->smp_task.smp_resp)-4); in pm8001_chip_smp_req()
4205 build_smp_cmd(pm8001_dev->device_id, smp_cmd.tag, &smp_cmd); in pm8001_chip_smp_req()
4214 dma_unmap_sg(pm8001_ha->dev, &ccb->task->smp_task.smp_resp, 1, in pm8001_chip_smp_req()
4217 dma_unmap_sg(pm8001_ha->dev, &ccb->task->smp_task.smp_req, 1, in pm8001_chip_smp_req()
4223 * pm8001_chip_ssp_io_req - send a SSP task to FW
4230 struct sas_task *task = ccb->task; in pm8001_chip_ssp_io_req()
4231 struct domain_device *dev = task->dev; in pm8001_chip_ssp_io_req()
4232 struct pm8001_device *pm8001_dev = dev->lldd_dev; in pm8001_chip_ssp_io_req()
4234 u32 tag = ccb->ccb_tag; in pm8001_chip_ssp_io_req()
4240 memcpy(ssp_cmd.ssp_iu.lun, task->ssp_task.LUN, 8); in pm8001_chip_ssp_io_req()
4242 cpu_to_le32(data_dir_flags[task->data_dir] << 8 | 0x0);/*0 for in pm8001_chip_ssp_io_req()
4244 ssp_cmd.data_len = cpu_to_le32(task->total_xfer_len); in pm8001_chip_ssp_io_req()
4245 ssp_cmd.device_id = cpu_to_le32(pm8001_dev->device_id); in pm8001_chip_ssp_io_req()
4247 if (task->ssp_task.enable_first_burst) in pm8001_chip_ssp_io_req()
4249 ssp_cmd.ssp_iu.efb_prio_attr |= (task->ssp_task.task_prio << 3); in pm8001_chip_ssp_io_req()
4250 ssp_cmd.ssp_iu.efb_prio_attr |= (task->ssp_task.task_attr & 7); in pm8001_chip_ssp_io_req()
4251 memcpy(ssp_cmd.ssp_iu.cdb, task->ssp_task.cmd->cmnd, in pm8001_chip_ssp_io_req()
4252 task->ssp_task.cmd->cmd_len); in pm8001_chip_ssp_io_req()
4253 circularQ = &pm8001_ha->inbnd_q_tbl[0]; in pm8001_chip_ssp_io_req()
4256 if (task->num_scatter > 1) { in pm8001_chip_ssp_io_req()
4257 pm8001_chip_make_sg(task->scatter, ccb->n_elem, ccb->buf_prd); in pm8001_chip_ssp_io_req()
4258 phys_addr = ccb->ccb_dma_handle; in pm8001_chip_ssp_io_req()
4262 } else if (task->num_scatter == 1) { in pm8001_chip_ssp_io_req()
4263 u64 dma_addr = sg_dma_address(task->scatter); in pm8001_chip_ssp_io_req()
4266 ssp_cmd.len = cpu_to_le32(task->total_xfer_len); in pm8001_chip_ssp_io_req()
4268 } else if (task->num_scatter == 0) { in pm8001_chip_ssp_io_req()
4271 ssp_cmd.len = cpu_to_le32(task->total_xfer_len); in pm8001_chip_ssp_io_req()
4282 struct sas_task *task = ccb->task; in pm8001_chip_sata_req()
4283 struct domain_device *dev = task->dev; in pm8001_chip_sata_req()
4284 struct pm8001_device *pm8001_ha_dev = dev->lldd_dev; in pm8001_chip_sata_req()
4285 u32 tag = ccb->ccb_tag; in pm8001_chip_sata_req()
4296 circularQ = &pm8001_ha->inbnd_q_tbl[0]; in pm8001_chip_sata_req()
4297 if (task->data_dir == DMA_NONE) { in pm8001_chip_sata_req()
4300 } else if (likely(!task->ata_task.device_control_reg_update)) { in pm8001_chip_sata_req()
4301 if (task->ata_task.dma_xfer) { in pm8001_chip_sata_req()
4308 if (task->ata_task.use_ncq && in pm8001_chip_sata_req()
4309 dev->sata_dev.class != ATA_DEV_ATAPI) { in pm8001_chip_sata_req()
4314 if (task->ata_task.use_ncq && pm8001_get_ncq_tag(task, &hdr_tag)) { in pm8001_chip_sata_req()
4315 task->ata_task.fis.sector_count |= (u8) (hdr_tag << 3); in pm8001_chip_sata_req()
4318 dir = data_dir_flags[task->data_dir] << 8; in pm8001_chip_sata_req()
4320 sata_cmd.device_id = cpu_to_le32(pm8001_ha_dev->device_id); in pm8001_chip_sata_req()
4321 sata_cmd.data_len = cpu_to_le32(task->total_xfer_len); in pm8001_chip_sata_req()
4324 sata_cmd.sata_fis = task->ata_task.fis; in pm8001_chip_sata_req()
4325 if (likely(!task->ata_task.device_control_reg_update)) in pm8001_chip_sata_req()
4329 if (task->num_scatter > 1) { in pm8001_chip_sata_req()
4330 pm8001_chip_make_sg(task->scatter, ccb->n_elem, ccb->buf_prd); in pm8001_chip_sata_req()
4331 phys_addr = ccb->ccb_dma_handle; in pm8001_chip_sata_req()
4335 } else if (task->num_scatter == 1) { in pm8001_chip_sata_req()
4336 u64 dma_addr = sg_dma_address(task->scatter); in pm8001_chip_sata_req()
4339 sata_cmd.len = cpu_to_le32(task->total_xfer_len); in pm8001_chip_sata_req()
4341 } else if (task->num_scatter == 0) { in pm8001_chip_sata_req()
4344 sata_cmd.len = cpu_to_le32(task->total_xfer_len); in pm8001_chip_sata_req()
4350 if (((pm8001_ha_dev->id & NCQ_READ_LOG_FLAG) || in pm8001_chip_sata_req()
4351 (pm8001_ha_dev->id & NCQ_ABORT_ALL_FLAG) || in pm8001_chip_sata_req()
4352 (pm8001_ha_dev->id & NCQ_2ND_RLE_FLAG))) { in pm8001_chip_sata_req()
4355 pm8001_ha_dev->id &= 0xDFFFFFFF; in pm8001_chip_sata_req()
4356 ts = &task->task_status; in pm8001_chip_sata_req()
4358 spin_lock_irqsave(&task->task_state_lock, flags); in pm8001_chip_sata_req()
4359 ts->resp = SAS_TASK_COMPLETE; in pm8001_chip_sata_req()
4360 ts->stat = SAS_SAM_STAT_GOOD; in pm8001_chip_sata_req()
4361 task->task_state_flags &= ~SAS_TASK_STATE_PENDING; in pm8001_chip_sata_req()
4362 task->task_state_flags &= ~SAS_TASK_AT_INITIATOR; in pm8001_chip_sata_req()
4363 task->task_state_flags |= SAS_TASK_STATE_DONE; in pm8001_chip_sata_req()
4364 if (unlikely((task->task_state_flags & in pm8001_chip_sata_req()
4366 spin_unlock_irqrestore(&task->task_state_lock, in pm8001_chip_sata_req()
4370 task, ts->resp, in pm8001_chip_sata_req()
4371 ts->stat); in pm8001_chip_sata_req()
4374 spin_unlock_irqrestore(&task->task_state_lock, in pm8001_chip_sata_req()
4389 * pm8001_chip_phy_start_req - start phy via PHY_START COMMAND
4391 * @phy_id: the phy id which we wanted to start up.
4401 circularQ = &pm8001_ha->inbnd_q_tbl[0]; in pm8001_chip_phy_start_req()
4405 ** [0:7] PHY Identifier in pm8001_chip_phy_start_req()
4416 pm8001_ha->sas_addr, SAS_ADDR_SIZE); in pm8001_chip_phy_start_req()
4424 * pm8001_chip_phy_stop_req - start phy via PHY_STOP COMMAND
4426 * @phy_id: the phy id which we wanted to start up.
4436 circularQ = &pm8001_ha->inbnd_q_tbl[0]; in pm8001_chip_phy_stop_req()
4461 struct domain_device *dev = pm8001_dev->sas_device; in pm8001_chip_reg_dev_req()
4462 struct domain_device *parent_dev = dev->parent; in pm8001_chip_reg_dev_req()
4463 circularQ = &pm8001_ha->inbnd_q_tbl[0]; in pm8001_chip_reg_dev_req()
4469 ccb = &pm8001_ha->ccb_info[tag]; in pm8001_chip_reg_dev_req()
4470 ccb->device = pm8001_dev; in pm8001_chip_reg_dev_req()
4471 ccb->ccb_tag = tag; in pm8001_chip_reg_dev_req()
4476 if (pm8001_dev->dev_type == SAS_SATA_DEV) in pm8001_chip_reg_dev_req()
4478 else if (pm8001_dev->dev_type == SAS_END_DEVICE || in pm8001_chip_reg_dev_req()
4479 pm8001_dev->dev_type == SAS_EDGE_EXPANDER_DEVICE || in pm8001_chip_reg_dev_req()
4480 pm8001_dev->dev_type == SAS_FANOUT_EXPANDER_DEVICE) in pm8001_chip_reg_dev_req()
4483 if (parent_dev && dev_is_expander(parent_dev->dev_type)) in pm8001_chip_reg_dev_req()
4484 phy_id = parent_dev->ex_dev.ex_phy->phy_id; in pm8001_chip_reg_dev_req()
4486 phy_id = pm8001_dev->attached_phy; in pm8001_chip_reg_dev_req()
4488 linkrate = (pm8001_dev->sas_device->linkrate < dev->port->linkrate) ? in pm8001_chip_reg_dev_req()
4489 pm8001_dev->sas_device->linkrate : dev->port->linkrate; in pm8001_chip_reg_dev_req()
4491 cpu_to_le32(((pm8001_dev->sas_device->port->id) & 0x0F) | in pm8001_chip_reg_dev_req()
4498 memcpy(payload.sas_addr, pm8001_dev->sas_device->sas_addr, in pm8001_chip_reg_dev_req()
4516 circularQ = &pm8001_ha->inbnd_q_tbl[0]; in pm8001_chip_dereg_dev_req()
4528 * pm8001_chip_phy_ctl_req - support the local phy operation
4530 * @phyId: the phy id which we wanted to operate
4531 * @phy_op: the phy operation to request
4541 circularQ = &pm8001_ha->inbnd_q_tbl[0]; in pm8001_chip_phy_ctl_req()
4565 * pm8001_chip_isr - PM8001 isr handler.
4587 circularQ = &pm8001_ha->inbnd_q_tbl[0]; in send_task_abort()
4605 * pm8001_chip_abort_task - SAS abort task when error or exception happened.
4614 if (pm8001_dev->dev_type == SAS_END_DEVICE) in pm8001_chip_abort_task()
4616 else if (pm8001_dev->dev_type == SAS_SATA_DEV) in pm8001_chip_abort_task()
4620 device_id = pm8001_dev->device_id; in pm8001_chip_abort_task()
4629 * pm8001_chip_ssp_tm_req - built the task management command.
4637 struct sas_task *task = ccb->task; in pm8001_chip_ssp_tm_req()
4638 struct domain_device *dev = task->dev; in pm8001_chip_ssp_tm_req()
4639 struct pm8001_device *pm8001_dev = dev->lldd_dev; in pm8001_chip_ssp_tm_req()
4646 sspTMCmd.device_id = cpu_to_le32(pm8001_dev->device_id); in pm8001_chip_ssp_tm_req()
4647 sspTMCmd.relate_tag = cpu_to_le32(tmf->tag_of_task_to_be_managed); in pm8001_chip_ssp_tm_req()
4648 sspTMCmd.tmf = cpu_to_le32(tmf->tmf); in pm8001_chip_ssp_tm_req()
4649 memcpy(sspTMCmd.lun, task->ssp_task.LUN, 8); in pm8001_chip_ssp_tm_req()
4650 sspTMCmd.tag = cpu_to_le32(ccb->ccb_tag); in pm8001_chip_ssp_tm_req()
4651 if (pm8001_ha->chip_id != chip_8001) in pm8001_chip_ssp_tm_req()
4653 circularQ = &pm8001_ha->inbnd_q_tbl[0]; in pm8001_chip_ssp_tm_req()
4672 nvmd_type = ioctl_payload->minor_function; in pm8001_chip_get_nvmd_req()
4675 return -ENOMEM; in pm8001_chip_get_nvmd_req()
4676 fw_control_context->usrAddr = (u8 *)ioctl_payload->func_specific; in pm8001_chip_get_nvmd_req()
4677 fw_control_context->len = ioctl_payload->rd_length; in pm8001_chip_get_nvmd_req()
4678 circularQ = &pm8001_ha->inbnd_q_tbl[0]; in pm8001_chip_get_nvmd_req()
4685 ccb = &pm8001_ha->ccb_info[tag]; in pm8001_chip_get_nvmd_req()
4686 ccb->ccb_tag = tag; in pm8001_chip_get_nvmd_req()
4687 ccb->fw_control_context = fw_control_context; in pm8001_chip_get_nvmd_req()
4698 nvmd_req.resp_len = cpu_to_le32(ioctl_payload->rd_length); in pm8001_chip_get_nvmd_req()
4700 cpu_to_le32(pm8001_ha->memoryMap.region[NVMD].phys_addr_hi); in pm8001_chip_get_nvmd_req()
4702 cpu_to_le32(pm8001_ha->memoryMap.region[NVMD].phys_addr_lo); in pm8001_chip_get_nvmd_req()
4707 nvmd_req.resp_len = cpu_to_le32(ioctl_payload->rd_length); in pm8001_chip_get_nvmd_req()
4709 cpu_to_le32(pm8001_ha->memoryMap.region[NVMD].phys_addr_hi); in pm8001_chip_get_nvmd_req()
4711 cpu_to_le32(pm8001_ha->memoryMap.region[NVMD].phys_addr_lo); in pm8001_chip_get_nvmd_req()
4716 nvmd_req.resp_len = cpu_to_le32(ioctl_payload->rd_length); in pm8001_chip_get_nvmd_req()
4718 cpu_to_le32(pm8001_ha->memoryMap.region[NVMD].phys_addr_hi); in pm8001_chip_get_nvmd_req()
4720 cpu_to_le32(pm8001_ha->memoryMap.region[NVMD].phys_addr_lo); in pm8001_chip_get_nvmd_req()
4725 nvmd_req.resp_len = cpu_to_le32(ioctl_payload->rd_length); in pm8001_chip_get_nvmd_req()
4727 cpu_to_le32(pm8001_ha->memoryMap.region[NVMD].phys_addr_hi); in pm8001_chip_get_nvmd_req()
4729 cpu_to_le32(pm8001_ha->memoryMap.region[NVMD].phys_addr_lo); in pm8001_chip_get_nvmd_req()
4734 nvmd_req.resp_len = cpu_to_le32(ioctl_payload->rd_length); in pm8001_chip_get_nvmd_req()
4735 nvmd_req.vpd_offset = cpu_to_le32(ioctl_payload->offset); in pm8001_chip_get_nvmd_req()
4737 cpu_to_le32(pm8001_ha->memoryMap.region[NVMD].phys_addr_hi); in pm8001_chip_get_nvmd_req()
4739 cpu_to_le32(pm8001_ha->memoryMap.region[NVMD].phys_addr_lo); in pm8001_chip_get_nvmd_req()
4767 nvmd_type = ioctl_payload->minor_function; in pm8001_chip_set_nvmd_req()
4770 return -ENOMEM; in pm8001_chip_set_nvmd_req()
4771 circularQ = &pm8001_ha->inbnd_q_tbl[0]; in pm8001_chip_set_nvmd_req()
4772 memcpy(pm8001_ha->memoryMap.region[NVMD].virt_ptr, in pm8001_chip_set_nvmd_req()
4773 &ioctl_payload->func_specific, in pm8001_chip_set_nvmd_req()
4774 ioctl_payload->wr_length); in pm8001_chip_set_nvmd_req()
4779 return -EBUSY; in pm8001_chip_set_nvmd_req()
4781 ccb = &pm8001_ha->ccb_info[tag]; in pm8001_chip_set_nvmd_req()
4782 ccb->fw_control_context = fw_control_context; in pm8001_chip_set_nvmd_req()
4783 ccb->ccb_tag = tag; in pm8001_chip_set_nvmd_req()
4793 nvmd_req.resp_len = cpu_to_le32(ioctl_payload->wr_length); in pm8001_chip_set_nvmd_req()
4795 cpu_to_le32(pm8001_ha->memoryMap.region[NVMD].phys_addr_hi); in pm8001_chip_set_nvmd_req()
4797 cpu_to_le32(pm8001_ha->memoryMap.region[NVMD].phys_addr_lo); in pm8001_chip_set_nvmd_req()
4802 nvmd_req.resp_len = cpu_to_le32(ioctl_payload->wr_length); in pm8001_chip_set_nvmd_req()
4805 cpu_to_le32(pm8001_ha->memoryMap.region[NVMD].phys_addr_hi); in pm8001_chip_set_nvmd_req()
4807 cpu_to_le32(pm8001_ha->memoryMap.region[NVMD].phys_addr_lo); in pm8001_chip_set_nvmd_req()
4811 nvmd_req.resp_len = cpu_to_le32(ioctl_payload->wr_length); in pm8001_chip_set_nvmd_req()
4814 cpu_to_le32(pm8001_ha->memoryMap.region[NVMD].phys_addr_hi); in pm8001_chip_set_nvmd_req()
4816 cpu_to_le32(pm8001_ha->memoryMap.region[NVMD].phys_addr_lo); in pm8001_chip_set_nvmd_req()
4820 nvmd_req.resp_len = cpu_to_le32(ioctl_payload->wr_length); in pm8001_chip_set_nvmd_req()
4823 cpu_to_le32(pm8001_ha->memoryMap.region[NVMD].phys_addr_hi); in pm8001_chip_set_nvmd_req()
4825 cpu_to_le32(pm8001_ha->memoryMap.region[NVMD].phys_addr_lo); in pm8001_chip_set_nvmd_req()
4840 * pm8001_chip_fw_flash_update_build - support the firmware update operation
4856 circularQ = &pm8001_ha->inbnd_q_tbl[0]; in pm8001_chip_fw_flash_update_build()
4859 payload.cur_image_len = cpu_to_le32(info->cur_image_len); in pm8001_chip_fw_flash_update_build()
4860 payload.cur_image_offset = cpu_to_le32(info->cur_image_offset); in pm8001_chip_fw_flash_update_build()
4861 payload.total_image_len = cpu_to_le32(info->total_image_len); in pm8001_chip_fw_flash_update_build()
4862 payload.len = info->sgl.im_len.len ; in pm8001_chip_fw_flash_update_build()
4864 cpu_to_le32(lower_32_bits(le64_to_cpu(info->sgl.addr))); in pm8001_chip_fw_flash_update_build()
4866 cpu_to_le32(upper_32_bits(le64_to_cpu(info->sgl.addr))); in pm8001_chip_fw_flash_update_build()
4882 void *buffer = pm8001_ha->memoryMap.region[FW_FLASH].virt_ptr; in pm8001_chip_fw_flash_update_req()
4883 dma_addr_t phys_addr = pm8001_ha->memoryMap.region[FW_FLASH].phys_addr; in pm8001_chip_fw_flash_update_req()
4888 return -ENOMEM; in pm8001_chip_fw_flash_update_req()
4889 fw_control = (struct fw_control_info *)&ioctl_payload->func_specific; in pm8001_chip_fw_flash_update_req()
4892 fw_control->len); in pm8001_chip_fw_flash_update_req()
4893 memcpy(buffer, fw_control->buffer, fw_control->len); in pm8001_chip_fw_flash_update_req()
4895 flash_update_info.sgl.im_len.len = cpu_to_le32(fw_control->len); in pm8001_chip_fw_flash_update_req()
4897 flash_update_info.cur_image_offset = fw_control->offset; in pm8001_chip_fw_flash_update_req()
4898 flash_update_info.cur_image_len = fw_control->len; in pm8001_chip_fw_flash_update_req()
4899 flash_update_info.total_image_len = fw_control->size; in pm8001_chip_fw_flash_update_req()
4900 fw_control_context->fw_control = fw_control; in pm8001_chip_fw_flash_update_req()
4901 fw_control_context->virtAddr = buffer; in pm8001_chip_fw_flash_update_req()
4902 fw_control_context->phys_addr = phys_addr; in pm8001_chip_fw_flash_update_req()
4903 fw_control_context->len = fw_control->len; in pm8001_chip_fw_flash_update_req()
4907 return -EBUSY; in pm8001_chip_fw_flash_update_req()
4909 ccb = &pm8001_ha->ccb_info[tag]; in pm8001_chip_fw_flash_update_req()
4910 ccb->fw_control_context = fw_control_context; in pm8001_chip_fw_flash_update_req()
4911 ccb->ccb_tag = tag; in pm8001_chip_fw_flash_update_req()
4926 struct pm8001_hba_info *pm8001_ha = sha->lldd_ha; in pm8001_get_gsm_dump()
4929 gsm_dump_offset = pm8001_ha->fatal_forensic_shift_offset; in pm8001_get_gsm_dump()
4934 return -EINVAL; in pm8001_get_gsm_dump()
4936 if (pm8001_ha->chip_id == chip_8001) in pm8001_get_gsm_dump()
4950 if (pm8001_ha->chip_id == chip_8001) in pm8001_get_gsm_dump()
4958 if (pm8001_ha->chip_id == chip_8001) { in pm8001_get_gsm_dump()
4960 if (-1 == pm8001_bar4_shift(pm8001_ha, in pm8001_get_gsm_dump()
4962 return -EIO; in pm8001_get_gsm_dump()
4965 if (-1 == pm80xx_bar4_shift(pm8001_ha, in pm8001_get_gsm_dump()
4967 return -EIO; in pm8001_get_gsm_dump()
4986 if (-1 == pm8001_bar4_shift(pm8001_ha, 0)) in pm8001_get_gsm_dump()
4987 return -EIO; in pm8001_get_gsm_dump()
4988 pm8001_ha->fatal_forensic_shift_offset += 1024; in pm8001_get_gsm_dump()
4990 if (pm8001_ha->fatal_forensic_shift_offset >= 0x100000) in pm8001_get_gsm_dump()
4991 pm8001_ha->fatal_forensic_shift_offset = 0; in pm8001_get_gsm_dump()
4992 return direct_data - buf; in pm8001_get_gsm_dump()
5008 return -1; in pm8001_chip_set_dev_state_req()
5009 ccb = &pm8001_ha->ccb_info[tag]; in pm8001_chip_set_dev_state_req()
5010 ccb->ccb_tag = tag; in pm8001_chip_set_dev_state_req()
5011 ccb->device = pm8001_dev; in pm8001_chip_set_dev_state_req()
5012 circularQ = &pm8001_ha->inbnd_q_tbl[0]; in pm8001_chip_set_dev_state_req()
5014 payload.device_id = cpu_to_le32(pm8001_dev->device_id); in pm8001_chip_set_dev_state_req()
5034 return -ENOMEM; in pm8001_chip_sas_re_initialization()
5035 ccb = &pm8001_ha->ccb_info[tag]; in pm8001_chip_sas_re_initialization()
5036 ccb->ccb_tag = tag; in pm8001_chip_sas_re_initialization()
5037 circularQ = &pm8001_ha->inbnd_q_tbl[0]; in pm8001_chip_sas_re_initialization()