Lines Matching refs:tw_dev
96 static int twl_reset_device_extension(TW_Device_Extension *tw_dev, int ioctl_reset);
107 TW_Device_Extension *tw_dev = (TW_Device_Extension *)shost->hostdata; in twl_sysfs_aen_read() local
114 spin_lock_irqsave(tw_dev->host->host_lock, flags); in twl_sysfs_aen_read()
115 …ret = memory_read_from_buffer(outbuf, count, &offset, tw_dev->event_queue[0], sizeof(TW_Event) * T… in twl_sysfs_aen_read()
116 spin_unlock_irqrestore(tw_dev->host->host_lock, flags); in twl_sysfs_aen_read()
138 TW_Device_Extension *tw_dev = (TW_Device_Extension *)shost->hostdata; in twl_sysfs_compat_info() local
145 spin_lock_irqsave(tw_dev->host->host_lock, flags); in twl_sysfs_compat_info()
146 …ret = memory_read_from_buffer(outbuf, count, &offset, &tw_dev->tw_compat_info, sizeof(TW_Compatibi… in twl_sysfs_compat_info()
147 spin_unlock_irqrestore(tw_dev->host->host_lock, flags); in twl_sysfs_compat_info()
167 TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata; in twl_show_stats() local
171 spin_lock_irqsave(tw_dev->host->host_lock, flags); in twl_show_stats()
182 tw_dev->posted_request_count, in twl_show_stats()
183 tw_dev->max_posted_request_count, in twl_show_stats()
184 tw_dev->sgl_entries, in twl_show_stats()
185 tw_dev->max_sgl_entries, in twl_show_stats()
186 tw_dev->sector_count, in twl_show_stats()
187 tw_dev->max_sector_count, in twl_show_stats()
188 tw_dev->num_resets, in twl_show_stats()
189 tw_dev->aen_count); in twl_show_stats()
190 spin_unlock_irqrestore(tw_dev->host->host_lock, flags); in twl_show_stats()
224 static void twl_aen_queue_event(TW_Device_Extension *tw_dev, TW_Command_Apache_Header *header) in twl_aen_queue_event() argument
233 tw_dev->aen_count++; in twl_aen_queue_event()
236 event = tw_dev->event_queue[tw_dev->error_index]; in twl_aen_queue_event()
239 if (tw_dev->host) in twl_aen_queue_event()
240 sprintf(host, " scsi%d:", tw_dev->host->host_no); in twl_aen_queue_event()
251 event->sequence_id = tw_dev->error_sequence_id; in twl_aen_queue_event()
252 tw_dev->error_sequence_id++; in twl_aen_queue_event()
267 tw_dev->aen_count--; in twl_aen_queue_event()
269 tw_dev->error_index = (tw_dev->error_index + 1 ) % TW_Q_LENGTH; in twl_aen_queue_event()
273 static int twl_post_command_packet(TW_Device_Extension *tw_dev, int request_id) in twl_post_command_packet() argument
277 command_que_value = tw_dev->command_packet_phys[request_id]; in twl_post_command_packet()
281 writel((u32)((u64)command_que_value >> 32), TWL_HIBQPH_REG_ADDR(tw_dev)); in twl_post_command_packet()
283 writel((u32)(command_que_value | TWL_PULL_MODE), TWL_HIBQPL_REG_ADDR(tw_dev)); in twl_post_command_packet()
285 tw_dev->state[request_id] = TW_S_POSTED; in twl_post_command_packet()
286 tw_dev->posted_request_count++; in twl_post_command_packet()
287 if (tw_dev->posted_request_count > tw_dev->max_posted_request_count) in twl_post_command_packet()
288 tw_dev->max_posted_request_count = tw_dev->posted_request_count; in twl_post_command_packet()
294 static int twl_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, char *cdb, int use_… in twl_scsiop_execute_scsi() argument
303 if (tw_dev->srb[request_id]) { in twl_scsiop_execute_scsi()
304 srb = tw_dev->srb[request_id]; in twl_scsiop_execute_scsi()
310 full_command_packet = tw_dev->command_packet_virt[request_id]; in twl_scsiop_execute_scsi()
348 …_lunh = cpu_to_le16(TW_REQ_LUN_IN((srb->device->lun >> 4), scsi_sg_count(tw_dev->srb[request_id]))… in twl_scsiop_execute_scsi()
361 tw_dev->sector_count = scsi_bufflen(srb) / 512; in twl_scsiop_execute_scsi()
362 if (tw_dev->sector_count > tw_dev->max_sector_count) in twl_scsiop_execute_scsi()
363 tw_dev->max_sector_count = tw_dev->sector_count; in twl_scsiop_execute_scsi()
364 tw_dev->sgl_entries = scsi_sg_count(srb); in twl_scsiop_execute_scsi()
365 if (tw_dev->sgl_entries > tw_dev->max_sgl_entries) in twl_scsiop_execute_scsi()
366 tw_dev->max_sgl_entries = tw_dev->sgl_entries; in twl_scsiop_execute_scsi()
370 retval = twl_post_command_packet(tw_dev, request_id); in twl_scsiop_execute_scsi()
377 static int twl_aen_read_queue(TW_Device_Extension *tw_dev, int request_id) in twl_aen_read_queue() argument
384 full_command_packet = tw_dev->command_packet_virt[request_id]; in twl_aen_read_queue()
395 sglist[0].address = tw_dev->generic_buffer_phys[request_id]; in twl_aen_read_queue()
398 tw_dev->srb[request_id] = NULL; in twl_aen_read_queue()
401 if (twl_scsiop_execute_scsi(tw_dev, request_id, cdb, 1, sglist)) { in twl_aen_read_queue()
402 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2, "Post failed while reading AEN queue"); in twl_aen_read_queue()
411 static void twl_aen_sync_time(TW_Device_Extension *tw_dev, int request_id) in twl_aen_sync_time() argument
421 full_command_packet = tw_dev->command_packet_virt[request_id]; in twl_aen_sync_time()
426 …command_packet->byte8_offset.param.sgl[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[requ… in twl_aen_sync_time()
432 param = (TW_Param_Apache *)tw_dev->generic_buffer_virt[request_id]; in twl_aen_sync_time()
448 tw_dev->srb[request_id] = NULL; in twl_aen_sync_time()
451 twl_post_command_packet(tw_dev, request_id); in twl_aen_sync_time()
455 static void twl_get_request_id(TW_Device_Extension *tw_dev, int *request_id) in twl_get_request_id() argument
457 *request_id = tw_dev->free_queue[tw_dev->free_head]; in twl_get_request_id()
458 tw_dev->free_head = (tw_dev->free_head + 1) % TW_Q_LENGTH; in twl_get_request_id()
459 tw_dev->state[*request_id] = TW_S_STARTED; in twl_get_request_id()
463 static void twl_free_request_id(TW_Device_Extension *tw_dev, int request_id) in twl_free_request_id() argument
465 tw_dev->free_queue[tw_dev->free_tail] = request_id; in twl_free_request_id()
466 tw_dev->state[request_id] = TW_S_FINISHED; in twl_free_request_id()
467 tw_dev->free_tail = (tw_dev->free_tail + 1) % TW_Q_LENGTH; in twl_free_request_id()
471 static int twl_aen_complete(TW_Device_Extension *tw_dev, int request_id) in twl_aen_complete() argument
479 header = (TW_Command_Apache_Header *)tw_dev->generic_buffer_virt[request_id]; in twl_aen_complete()
480 tw_dev->posted_request_count--; in twl_aen_complete()
482 full_command_packet = tw_dev->command_packet_virt[request_id]; in twl_aen_complete()
488 if (twl_aen_read_queue(tw_dev, request_id)) in twl_aen_complete()
501 twl_aen_sync_time(tw_dev, request_id); in twl_aen_complete()
505 twl_aen_queue_event(tw_dev, header); in twl_aen_complete()
508 if (twl_aen_read_queue(tw_dev, request_id)) in twl_aen_complete()
517 tw_dev->state[request_id] = TW_S_COMPLETED; in twl_aen_complete()
518 twl_free_request_id(tw_dev, request_id); in twl_aen_complete()
519 clear_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags); in twl_aen_complete()
525 static int twl_poll_response(TW_Device_Extension *tw_dev, int request_id, int seconds) in twl_poll_response() argument
538 regh = readl(TWL_HOBQPH_REG_ADDR(tw_dev)); in twl_poll_response()
539 regl = readl(TWL_HOBQPL_REG_ADDR(tw_dev)); in twl_poll_response()
542 mfa = readl(TWL_HOBQPL_REG_ADDR(tw_dev)); in twl_poll_response()
560 static int twl_aen_drain_queue(TW_Device_Extension *tw_dev, int no_check_reset) in twl_aen_drain_queue() argument
576 full_command_packet = tw_dev->command_packet_virt[request_id]; in twl_aen_drain_queue()
587 sglist[0].address = tw_dev->generic_buffer_phys[request_id]; in twl_aen_drain_queue()
590 tw_dev->srb[request_id] = NULL; in twl_aen_drain_queue()
594 if (twl_scsiop_execute_scsi(tw_dev, request_id, cdb, 1, sglist)) { in twl_aen_drain_queue()
595 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x3, "Error posting request sense"); in twl_aen_drain_queue()
600 if (twl_poll_response(tw_dev, request_id, 30)) { in twl_aen_drain_queue()
601 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x4, "No valid response while draining AEN queue"); in twl_aen_drain_queue()
602 tw_dev->posted_request_count--; in twl_aen_drain_queue()
606 tw_dev->posted_request_count--; in twl_aen_drain_queue()
607 header = (TW_Command_Apache_Header *)tw_dev->generic_buffer_virt[request_id]; in twl_aen_drain_queue()
633 twl_aen_queue_event(tw_dev, header); in twl_aen_drain_queue()
641 tw_dev->state[request_id] = TW_S_INITIAL; in twl_aen_drain_queue()
646 static int twl_allocate_memory(TW_Device_Extension *tw_dev, int size, int which) in twl_allocate_memory() argument
653 cpu_addr = pci_zalloc_consistent(tw_dev->tw_pci_dev, size * TW_Q_LENGTH, in twl_allocate_memory()
656 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x5, "Memory allocation failed"); in twl_allocate_memory()
663 tw_dev->command_packet_phys[i] = dma_handle+(i*size); in twl_allocate_memory()
664 tw_dev->command_packet_virt[i] = (TW_Command_Full *)((unsigned char *)cpu_addr + (i*size)); in twl_allocate_memory()
667 tw_dev->generic_buffer_phys[i] = dma_handle+(i*size); in twl_allocate_memory()
668 tw_dev->generic_buffer_virt[i] = (unsigned long *)((unsigned char *)cpu_addr + (i*size)); in twl_allocate_memory()
671 tw_dev->sense_buffer_phys[i] = dma_handle+(i*size); in twl_allocate_memory()
672 … tw_dev->sense_buffer_virt[i] = (TW_Command_Apache_Header *)((unsigned char *)cpu_addr + (i*size)); in twl_allocate_memory()
682 static void twl_load_sgl(TW_Device_Extension *tw_dev, TW_Command_Full *full_command_packet, int req… in twl_load_sgl() argument
729 TW_Device_Extension *tw_dev = twl_device_extension_list[iminor(inode)]; in twl_chrdev_ioctl() local
736 if (mutex_lock_interruptible(&tw_dev->ioctl_lock)) { in twl_chrdev_ioctl()
755 …cpu_addr = dma_alloc_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_Ioct… in twl_chrdev_ioctl()
770 spin_lock_irqsave(tw_dev->host->host_lock, flags); in twl_chrdev_ioctl()
771 twl_get_request_id(tw_dev, &request_id); in twl_chrdev_ioctl()
774 tw_dev->srb[request_id] = NULL; in twl_chrdev_ioctl()
777 tw_dev->chrdev_request_id = request_id; in twl_chrdev_ioctl()
782 twl_load_sgl(tw_dev, full_command_packet, request_id, dma_handle, data_buffer_length_adjusted); in twl_chrdev_ioctl()
784 …memcpy(tw_dev->command_packet_virt[request_id], &(tw_ioctl->firmware_command), sizeof(TW_Command_F… in twl_chrdev_ioctl()
787 twl_post_command_packet(tw_dev, request_id); in twl_chrdev_ioctl()
788 spin_unlock_irqrestore(tw_dev->host->host_lock, flags); in twl_chrdev_ioctl()
793 …timeout = wait_event_timeout(tw_dev->ioctl_wqueue, tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FR… in twl_chrdev_ioctl()
796 if (tw_dev->chrdev_request_id != TW_IOCTL_CHRDEV_FREE) { in twl_chrdev_ioctl()
799 tw_dev->host->host_no, TW_DRIVER, 0x6, in twl_chrdev_ioctl()
802 twl_reset_device_extension(tw_dev, 1); in twl_chrdev_ioctl()
807 …memcpy(&(tw_ioctl->firmware_command), tw_dev->command_packet_virt[request_id], sizeof(TW_Command_F… in twl_chrdev_ioctl()
810 spin_lock_irqsave(tw_dev->host->host_lock, flags); in twl_chrdev_ioctl()
811 tw_dev->posted_request_count--; in twl_chrdev_ioctl()
812 tw_dev->state[request_id] = TW_S_COMPLETED; in twl_chrdev_ioctl()
813 twl_free_request_id(tw_dev, request_id); in twl_chrdev_ioctl()
814 spin_unlock_irqrestore(tw_dev->host->host_lock, flags); in twl_chrdev_ioctl()
826 …dma_free_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_Ioctl_Buf_Apache… in twl_chrdev_ioctl()
828 mutex_unlock(&tw_dev->ioctl_lock); in twl_chrdev_ioctl()
863 static int twl_fill_sense(TW_Device_Extension *tw_dev, int i, int request_id, int copy_sense, int p… in twl_fill_sense() argument
871 header = tw_dev->sense_buffer_virt[i]; in twl_fill_sense()
872 full_command_packet = tw_dev->command_packet_virt[request_id]; in twl_fill_sense()
882 tw_dev->host->host_no, in twl_fill_sense()
896 memcpy(tw_dev->srb[request_id]->sense_buffer, header->sense_data, TW_SENSE_DATA_LENGTH); in twl_fill_sense()
897 tw_dev->srb[request_id]->result = (full_command_packet->command.newcommand.status << 1); in twl_fill_sense()
905 static void twl_free_device_extension(TW_Device_Extension *tw_dev) in twl_free_device_extension() argument
907 if (tw_dev->command_packet_virt[0]) in twl_free_device_extension()
908 pci_free_consistent(tw_dev->tw_pci_dev, in twl_free_device_extension()
910 tw_dev->command_packet_virt[0], in twl_free_device_extension()
911 tw_dev->command_packet_phys[0]); in twl_free_device_extension()
913 if (tw_dev->generic_buffer_virt[0]) in twl_free_device_extension()
914 pci_free_consistent(tw_dev->tw_pci_dev, in twl_free_device_extension()
916 tw_dev->generic_buffer_virt[0], in twl_free_device_extension()
917 tw_dev->generic_buffer_phys[0]); in twl_free_device_extension()
919 if (tw_dev->sense_buffer_virt[0]) in twl_free_device_extension()
920 pci_free_consistent(tw_dev->tw_pci_dev, in twl_free_device_extension()
923 tw_dev->sense_buffer_virt[0], in twl_free_device_extension()
924 tw_dev->sense_buffer_phys[0]); in twl_free_device_extension()
926 kfree(tw_dev->event_queue[0]); in twl_free_device_extension()
930 static void *twl_get_param(TW_Device_Extension *tw_dev, int request_id, int table_id, int parameter… in twl_get_param() argument
938 full_command_packet = tw_dev->command_packet_virt[request_id]; in twl_get_param()
948 param = (TW_Param_Apache *)tw_dev->generic_buffer_virt[request_id]; in twl_get_param()
954 …command_packet->byte8_offset.param.sgl[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[requ… in twl_get_param()
958 twl_post_command_packet(tw_dev, request_id); in twl_get_param()
961 if (twl_poll_response(tw_dev, request_id, 30)) in twl_get_param()
962 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x7, "No valid response during get param") in twl_get_param()
966 tw_dev->posted_request_count--; in twl_get_param()
967 tw_dev->state[request_id] = TW_S_INITIAL; in twl_get_param()
973 static int twl_initconnection(TW_Device_Extension *tw_dev, int message_credits, in twl_initconnection() argument
989 full_command_packet = tw_dev->command_packet_virt[request_id]; in twl_initconnection()
1014 twl_post_command_packet(tw_dev, request_id); in twl_initconnection()
1017 if (twl_poll_response(tw_dev, request_id, 30)) { in twl_initconnection()
1018 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x8, "No valid response during init connection"); in twl_initconnection()
1030 tw_dev->posted_request_count--; in twl_initconnection()
1031 tw_dev->state[request_id] = TW_S_INITIAL; in twl_initconnection()
1037 static int twl_initialize_device_extension(TW_Device_Extension *tw_dev) in twl_initialize_device_extension() argument
1042 if (twl_allocate_memory(tw_dev, sizeof(TW_Command_Full), 0)) { in twl_initialize_device_extension()
1043 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x9, "Command packet memory allocation failed"); in twl_initialize_device_extension()
1048 if (twl_allocate_memory(tw_dev, TW_SECTOR_SIZE, 1)) { in twl_initialize_device_extension()
1049 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xa, "Generic memory allocation failed"); in twl_initialize_device_extension()
1054 if (twl_allocate_memory(tw_dev, sizeof(TW_Command_Apache_Header), 2)) { in twl_initialize_device_extension()
1055 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xb, "Sense buffer allocation failed"); in twl_initialize_device_extension()
1060 tw_dev->event_queue[0] = kcalloc(TW_Q_LENGTH, sizeof(TW_Event), GFP_KERNEL); in twl_initialize_device_extension()
1061 if (!tw_dev->event_queue[0]) { in twl_initialize_device_extension()
1062 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xc, "Event info memory allocation failed"); in twl_initialize_device_extension()
1067 …tw_dev->event_queue[i] = (TW_Event *)((unsigned char *)tw_dev->event_queue[0] + (i * sizeof(TW_Eve… in twl_initialize_device_extension()
1068 tw_dev->free_queue[i] = i; in twl_initialize_device_extension()
1069 tw_dev->state[i] = TW_S_INITIAL; in twl_initialize_device_extension()
1072 tw_dev->free_head = TW_Q_START; in twl_initialize_device_extension()
1073 tw_dev->free_tail = TW_Q_START; in twl_initialize_device_extension()
1074 tw_dev->error_sequence_id = 1; in twl_initialize_device_extension()
1075 tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE; in twl_initialize_device_extension()
1077 mutex_init(&tw_dev->ioctl_lock); in twl_initialize_device_extension()
1078 init_waitqueue_head(&tw_dev->ioctl_wqueue); in twl_initialize_device_extension()
1086 static int twl_handle_attention_interrupt(TW_Device_Extension *tw_dev) in twl_handle_attention_interrupt() argument
1092 doorbell = readl(TWL_HOBDB_REG_ADDR(tw_dev)); in twl_handle_attention_interrupt()
1096 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xd, "Microcontroller Error: clearing"); in twl_handle_attention_interrupt()
1102 if (!(test_and_set_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags))) { in twl_handle_attention_interrupt()
1103 twl_get_request_id(tw_dev, &request_id); in twl_handle_attention_interrupt()
1104 if (twl_aen_read_queue(tw_dev, request_id)) { in twl_handle_attention_interrupt()
1105 tw_dev->state[request_id] = TW_S_COMPLETED; in twl_handle_attention_interrupt()
1106 twl_free_request_id(tw_dev, request_id); in twl_handle_attention_interrupt()
1107 clear_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags); in twl_handle_attention_interrupt()
1115 TWL_CLEAR_DB_INTERRUPT(tw_dev); in twl_handle_attention_interrupt()
1118 readl(TWL_HOBDBC_REG_ADDR(tw_dev)); in twl_handle_attention_interrupt()
1126 TW_Device_Extension *tw_dev = (TW_Device_Extension *)dev_instance; in twl_interrupt() local
1133 spin_lock(tw_dev->host->host_lock); in twl_interrupt()
1136 reg = readl(TWL_HISTAT_REG_ADDR(tw_dev)); in twl_interrupt()
1145 if (test_bit(TW_IN_RESET, &tw_dev->flags)) in twl_interrupt()
1150 if (twl_handle_attention_interrupt(tw_dev)) { in twl_interrupt()
1151 TWL_MASK_INTERRUPTS(tw_dev); in twl_interrupt()
1159 regh = readl(TWL_HOBQPH_REG_ADDR(tw_dev)); in twl_interrupt()
1160 regl = readl(TWL_HOBQPL_REG_ADDR(tw_dev)); in twl_interrupt()
1163 mfa = readl(TWL_HOBQPL_REG_ADDR(tw_dev)); in twl_interrupt()
1171 if (tw_dev->sense_buffer_phys[i] == mfa) { in twl_interrupt()
1172 request_id = le16_to_cpu(tw_dev->sense_buffer_virt[i]->header_desc.request_id); in twl_interrupt()
1173 if (tw_dev->srb[request_id] != NULL) in twl_interrupt()
1174 error = twl_fill_sense(tw_dev, i, request_id, 1, 1); in twl_interrupt()
1177 if (request_id != tw_dev->chrdev_request_id) in twl_interrupt()
1178 error = twl_fill_sense(tw_dev, i, request_id, 0, 1); in twl_interrupt()
1180 …memcpy(tw_dev->command_packet_virt[request_id], tw_dev->sense_buffer_virt[i], sizeof(TW_Command_Ap… in twl_interrupt()
1184 writel((u32)((u64)tw_dev->sense_buffer_phys[i] >> 32), TWL_HOBQPH_REG_ADDR(tw_dev)); in twl_interrupt()
1185 writel((u32)tw_dev->sense_buffer_phys[i], TWL_HOBQPL_REG_ADDR(tw_dev)); in twl_interrupt()
1192 full_command_packet = tw_dev->command_packet_virt[request_id]; in twl_interrupt()
1195 if (tw_dev->state[request_id] != TW_S_POSTED) { in twl_interrupt()
1196 if (tw_dev->srb[request_id] != NULL) { in twl_interrupt()
1197 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xe, "Received a request id that wasn't posted"); in twl_interrupt()
1198 TWL_MASK_INTERRUPTS(tw_dev); in twl_interrupt()
1204 if (tw_dev->srb[request_id] == NULL) { in twl_interrupt()
1205 if (request_id != tw_dev->chrdev_request_id) { in twl_interrupt()
1206 if (twl_aen_complete(tw_dev, request_id)) in twl_interrupt()
1207 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xf, "Error completing AEN during attention interrupt"); in twl_interrupt()
1209 tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE; in twl_interrupt()
1210 wake_up(&tw_dev->ioctl_wqueue); in twl_interrupt()
1213 cmd = tw_dev->srb[request_id]; in twl_interrupt()
1220 …if (full_command_packet->command.newcommand.sg_list[0].length < scsi_bufflen(tw_dev->srb[request_i… in twl_interrupt()
1227 tw_dev->state[request_id] = TW_S_COMPLETED; in twl_interrupt()
1228 twl_free_request_id(tw_dev, request_id); in twl_interrupt()
1229 tw_dev->posted_request_count--; in twl_interrupt()
1233 reg = readl(TWL_HISTAT_REG_ADDR(tw_dev)); in twl_interrupt()
1237 spin_unlock(tw_dev->host->host_lock); in twl_interrupt()
1242 static int twl_poll_register(TW_Device_Extension *tw_dev, void *reg, u32 value, u32 result, int sec… in twl_poll_register() argument
1263 static int twl_reset_sequence(TW_Device_Extension *tw_dev, int soft_reset) in twl_reset_sequence() argument
1277 TWL_SOFT_RESET(tw_dev); in twl_reset_sequence()
1280 if (twl_poll_register(tw_dev, TWL_SCRPD3_REG_ADDR(tw_dev), TWL_CONTROLLER_READY, 0x0, 30)) { in twl_reset_sequence()
1281 … TW_PRINTK(tw_dev->host, TW_DRIVER, 0x10, "Controller never went non-ready during reset sequence"); in twl_reset_sequence()
1285 …if (twl_poll_register(tw_dev, TWL_SCRPD3_REG_ADDR(tw_dev), TWL_CONTROLLER_READY, TWL_CONTROLLER_RE… in twl_reset_sequence()
1286 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x11, "Controller not ready during reset sequence"); in twl_reset_sequence()
1293 if (twl_initconnection(tw_dev, TW_INIT_MESSAGE_CREDITS, in twl_reset_sequence()
1299 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x12, "Initconnection failed while checking SRL"); in twl_reset_sequence()
1307 writel((u32)((u64)tw_dev->sense_buffer_phys[i] >> 32), TWL_HOBQPH_REG_ADDR(tw_dev)); in twl_reset_sequence()
1308 writel((u32)tw_dev->sense_buffer_phys[i], TWL_HOBQPL_REG_ADDR(tw_dev)); in twl_reset_sequence()
1311 status = readl(TWL_STATUS_REG_ADDR(tw_dev)); in twl_reset_sequence()
1317 status = readl(TWL_STATUS_REG_ADDR(tw_dev)); in twl_reset_sequence()
1319 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x13, "Bad controller status after loading sense buffers"); in twl_reset_sequence()
1326 if (twl_aen_drain_queue(tw_dev, soft_reset)) { in twl_reset_sequence()
1327 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x14, "AEN drain failed during reset sequence"); in twl_reset_sequence()
1334 strncpy(tw_dev->tw_compat_info.driver_version, TW_DRIVER_VERSION, strlen(TW_DRIVER_VERSION)); in twl_reset_sequence()
1335 tw_dev->tw_compat_info.driver_srl_high = TW_CURRENT_DRIVER_SRL; in twl_reset_sequence()
1336 tw_dev->tw_compat_info.driver_branch_high = TW_CURRENT_DRIVER_BRANCH; in twl_reset_sequence()
1337 tw_dev->tw_compat_info.driver_build_high = TW_CURRENT_DRIVER_BUILD; in twl_reset_sequence()
1338 tw_dev->tw_compat_info.driver_srl_low = TW_BASE_FW_SRL; in twl_reset_sequence()
1339 tw_dev->tw_compat_info.driver_branch_low = TW_BASE_FW_BRANCH; in twl_reset_sequence()
1340 tw_dev->tw_compat_info.driver_build_low = TW_BASE_FW_BUILD; in twl_reset_sequence()
1341 tw_dev->tw_compat_info.fw_on_ctlr_srl = fw_on_ctlr_srl; in twl_reset_sequence()
1342 tw_dev->tw_compat_info.fw_on_ctlr_branch = fw_on_ctlr_branch; in twl_reset_sequence()
1343 tw_dev->tw_compat_info.fw_on_ctlr_build = fw_on_ctlr_build; in twl_reset_sequence()
1354 static int twl_reset_device_extension(TW_Device_Extension *tw_dev, int ioctl_reset) in twl_reset_device_extension() argument
1361 scsi_block_requests(tw_dev->host); in twl_reset_device_extension()
1363 set_bit(TW_IN_RESET, &tw_dev->flags); in twl_reset_device_extension()
1364 TWL_MASK_INTERRUPTS(tw_dev); in twl_reset_device_extension()
1365 TWL_CLEAR_DB_INTERRUPT(tw_dev); in twl_reset_device_extension()
1367 spin_lock_irqsave(tw_dev->host->host_lock, flags); in twl_reset_device_extension()
1371 if ((tw_dev->state[i] != TW_S_FINISHED) && in twl_reset_device_extension()
1372 (tw_dev->state[i] != TW_S_INITIAL) && in twl_reset_device_extension()
1373 (tw_dev->state[i] != TW_S_COMPLETED)) { in twl_reset_device_extension()
1374 struct scsi_cmnd *cmd = tw_dev->srb[i]; in twl_reset_device_extension()
1386 tw_dev->free_queue[i] = i; in twl_reset_device_extension()
1387 tw_dev->state[i] = TW_S_INITIAL; in twl_reset_device_extension()
1389 tw_dev->free_head = TW_Q_START; in twl_reset_device_extension()
1390 tw_dev->free_tail = TW_Q_START; in twl_reset_device_extension()
1391 tw_dev->posted_request_count = 0; in twl_reset_device_extension()
1393 spin_unlock_irqrestore(tw_dev->host->host_lock, flags); in twl_reset_device_extension()
1395 if (twl_reset_sequence(tw_dev, 1)) in twl_reset_device_extension()
1398 TWL_UNMASK_INTERRUPTS(tw_dev); in twl_reset_device_extension()
1400 clear_bit(TW_IN_RESET, &tw_dev->flags); in twl_reset_device_extension()
1401 tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE; in twl_reset_device_extension()
1406 scsi_unblock_requests(tw_dev->host); in twl_reset_device_extension()
1414 TW_Device_Extension *tw_dev; in twl_scsi_biosparam() local
1416 tw_dev = (TW_Device_Extension *)sdev->host->hostdata; in twl_scsi_biosparam()
1436 TW_Device_Extension *tw_dev = NULL; in twl_scsi_eh_reset() local
1439 tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata; in twl_scsi_eh_reset()
1441 tw_dev->num_resets++; in twl_scsi_eh_reset()
1448 mutex_lock(&tw_dev->ioctl_lock); in twl_scsi_eh_reset()
1451 if (twl_reset_device_extension(tw_dev, 0)) { in twl_scsi_eh_reset()
1452 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x15, "Controller reset failed during scsi host reset"); in twl_scsi_eh_reset()
1458 mutex_unlock(&tw_dev->ioctl_lock); in twl_scsi_eh_reset()
1466 TW_Device_Extension *tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata; in twl_scsi_queue_lck() local
1469 if (test_bit(TW_IN_RESET, &tw_dev->flags)) { in twl_scsi_queue_lck()
1478 twl_get_request_id(tw_dev, &request_id); in twl_scsi_queue_lck()
1481 tw_dev->srb[request_id] = SCpnt; in twl_scsi_queue_lck()
1483 retval = twl_scsiop_execute_scsi(tw_dev, request_id, NULL, 0, NULL); in twl_scsi_queue_lck()
1485 tw_dev->state[request_id] = TW_S_COMPLETED; in twl_scsi_queue_lck()
1486 twl_free_request_id(tw_dev, request_id); in twl_scsi_queue_lck()
1498 static void __twl_shutdown(TW_Device_Extension *tw_dev) in DEF_SCSI_QCMD()
1501 TWL_MASK_INTERRUPTS(tw_dev); in DEF_SCSI_QCMD()
1504 free_irq(tw_dev->tw_pci_dev->irq, tw_dev); in DEF_SCSI_QCMD()
1506 printk(KERN_WARNING "3w-sas: Shutting down host %d.\n", tw_dev->host->host_no); in DEF_SCSI_QCMD()
1509 if (twl_initconnection(tw_dev, 1, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL)) { in DEF_SCSI_QCMD()
1510 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x16, "Connection shutdown failed"); in DEF_SCSI_QCMD()
1516 TWL_CLEAR_DB_INTERRUPT(tw_dev); in DEF_SCSI_QCMD()
1523 TW_Device_Extension *tw_dev; in twl_shutdown() local
1528 tw_dev = (TW_Device_Extension *)host->hostdata; in twl_shutdown()
1530 if (tw_dev->online) in twl_shutdown()
1531 __twl_shutdown(tw_dev); in twl_shutdown()
1567 TW_Device_Extension *tw_dev; in twl_probe() local
1595 tw_dev = shost_priv(host); in twl_probe()
1598 tw_dev->host = host; in twl_probe()
1599 tw_dev->tw_pci_dev = pdev; in twl_probe()
1601 if (twl_initialize_device_extension(tw_dev)) { in twl_probe()
1602 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1a, "Failed to initialize device extension"); in twl_probe()
1609 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1b, "Failed to get mem region"); in twl_probe()
1614 tw_dev->base_addr = pci_iomap(pdev, 1, 0); in twl_probe()
1615 if (!tw_dev->base_addr) { in twl_probe()
1616 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1c, "Failed to ioremap"); in twl_probe()
1621 TWL_MASK_INTERRUPTS(tw_dev); in twl_probe()
1624 if (twl_reset_sequence(tw_dev, 0)) { in twl_probe()
1625 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1d, "Controller reset failed during probe"); in twl_probe()
1638 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1e, "scsi add host failed"); in twl_probe()
1646 (char *)twl_get_param(tw_dev, 1, TW_VERSION_TABLE, in twl_probe()
1650 ptr_phycount = twl_get_param(tw_dev, 2, TW_PARAM_PHY_SUMMARY_TABLE, in twl_probe()
1657 (char *)twl_get_param(tw_dev, 1, TW_VERSION_TABLE, in twl_probe()
1659 (char *)twl_get_param(tw_dev, 2, TW_VERSION_TABLE, in twl_probe()
1665 set_bit(TW_USING_MSI, &tw_dev->flags); in twl_probe()
1668 retval = request_irq(pdev->irq, twl_interrupt, IRQF_SHARED, "3w-sas", tw_dev); in twl_probe()
1670 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1f, "Error requesting IRQ"); in twl_probe()
1674 twl_device_extension_list[twl_device_extension_count] = tw_dev; in twl_probe()
1678 TWL_UNMASK_INTERRUPTS(tw_dev); in twl_probe()
1685 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x20, "Failed to create sysfs binary file: 3ware_aen_read"); in twl_probe()
1687 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x21, "Failed to create sysfs binary file: 3ware_compat_info"); in twl_probe()
1693 tw_dev->online = 1; in twl_probe()
1697 if (test_bit(TW_USING_MSI, &tw_dev->flags)) in twl_probe()
1701 iounmap(tw_dev->base_addr); in twl_probe()
1705 twl_free_device_extension(tw_dev); in twl_probe()
1717 TW_Device_Extension *tw_dev; in twl_remove() local
1722 tw_dev = (TW_Device_Extension *)host->hostdata; in twl_remove()
1724 if (!tw_dev->online) in twl_remove()
1731 scsi_remove_host(tw_dev->host); in twl_remove()
1740 __twl_shutdown(tw_dev); in twl_remove()
1743 if (test_bit(TW_USING_MSI, &tw_dev->flags)) in twl_remove()
1747 iounmap(tw_dev->base_addr); in twl_remove()
1753 twl_free_device_extension(tw_dev); in twl_remove()
1755 scsi_host_put(tw_dev->host); in twl_remove()
1765 TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata; in twl_suspend() local
1767 printk(KERN_WARNING "3w-sas: Suspending host %d.\n", tw_dev->host->host_no); in twl_suspend()
1769 TWL_MASK_INTERRUPTS(tw_dev); in twl_suspend()
1771 free_irq(tw_dev->tw_pci_dev->irq, tw_dev); in twl_suspend()
1774 if (twl_initconnection(tw_dev, 1, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL)) { in twl_suspend()
1775 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x23, "Connection shutdown failed during suspend"); in twl_suspend()
1781 TWL_CLEAR_DB_INTERRUPT(tw_dev); in twl_suspend()
1795 TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata; in twl_resume() local
1797 printk(KERN_WARNING "3w-sas: Resuming host %d.\n", tw_dev->host->host_no); in twl_resume()
1804 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x24, "Enable device failed during resume"); in twl_resume()
1821 if (twl_reset_sequence(tw_dev, 0)) { in twl_resume()
1827 retval = request_irq(pdev->irq, twl_interrupt, IRQF_SHARED, "3w-sas", tw_dev); in twl_resume()
1829 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x26, "Error requesting IRQ during resume"); in twl_resume()
1835 if (test_bit(TW_USING_MSI, &tw_dev->flags)) in twl_resume()
1839 TWL_UNMASK_INTERRUPTS(tw_dev); in twl_resume()