Lines Matching refs:skdev

360 static inline u32 skd_reg_read32(struct skd_device *skdev, u32 offset)  in skd_reg_read32()  argument
364 if (likely(skdev->dbg_level < 2)) in skd_reg_read32()
365 return readl(skdev->mem_map[1] + offset); in skd_reg_read32()
368 val = readl(skdev->mem_map[1] + offset); in skd_reg_read32()
371 skdev->name, __func__, __LINE__, offset, val); in skd_reg_read32()
377 static inline void skd_reg_write32(struct skd_device *skdev, u32 val, in skd_reg_write32() argument
380 if (likely(skdev->dbg_level < 2)) { in skd_reg_write32()
381 writel(val, skdev->mem_map[1] + offset); in skd_reg_write32()
385 writel(val, skdev->mem_map[1] + offset); in skd_reg_write32()
388 skdev->name, __func__, __LINE__, offset, val); in skd_reg_write32()
392 static inline void skd_reg_write64(struct skd_device *skdev, u64 val, in skd_reg_write64() argument
395 if (likely(skdev->dbg_level < 2)) { in skd_reg_write64()
396 writeq(val, skdev->mem_map[1] + offset); in skd_reg_write64()
400 writeq(val, skdev->mem_map[1] + offset); in skd_reg_write64()
403 skdev->name, __func__, __LINE__, offset, val); in skd_reg_write64()
452 static void skd_destruct(struct skd_device *skdev);
454 static void skd_send_fitmsg(struct skd_device *skdev,
456 static void skd_send_special_fitmsg(struct skd_device *skdev,
459 static void skd_end_request(struct skd_device *skdev,
461 static int skd_preop_sg_list(struct skd_device *skdev,
463 static void skd_postop_sg_list(struct skd_device *skdev,
466 static void skd_restart_device(struct skd_device *skdev);
467 static int skd_quiesce_dev(struct skd_device *skdev);
468 static int skd_unquiesce_dev(struct skd_device *skdev);
469 static void skd_release_special(struct skd_device *skdev,
471 static void skd_disable_interrupts(struct skd_device *skdev);
472 static void skd_isr_fwstate(struct skd_device *skdev);
473 static void skd_recover_requests(struct skd_device *skdev, int requeue);
474 static void skd_soft_reset(struct skd_device *skdev);
476 static const char *skd_name(struct skd_device *skdev);
479 static void skd_log_skdev(struct skd_device *skdev, const char *event);
480 static void skd_log_skmsg(struct skd_device *skdev,
482 static void skd_log_skreq(struct skd_device *skdev,
490 static void skd_fail_all_pending(struct skd_device *skdev) in skd_fail_all_pending() argument
492 struct request_queue *q = skdev->queue; in skd_fail_all_pending()
572 struct skd_device *skdev = q->queuedata; in skd_request_fn() local
592 if (skdev->state != SKD_DRVR_STATE_ONLINE) { in skd_request_fn()
597 if (blk_queue_stopped(skdev->queue)) { in skd_request_fn()
598 if (skdev->skmsg_free_list == NULL || in skd_request_fn()
599 skdev->skreq_free_list == NULL || in skd_request_fn()
600 skdev->in_flight >= skdev->queue_low_water_mark) in skd_request_fn()
604 queue_flag_clear(QUEUE_FLAG_STOPPED, skdev->queue); in skd_request_fn()
637 skdev->name, __func__, __LINE__, in skd_request_fn()
643 if (skdev->in_flight >= skdev->cur_max_queue_depth) { in skd_request_fn()
645 skdev->name, __func__, __LINE__, in skd_request_fn()
646 skdev->in_flight, skdev->cur_max_queue_depth); in skd_request_fn()
651 skreq = skdev->skreq_free_list; in skd_request_fn()
654 skdev->name, __func__, __LINE__, q); in skd_request_fn()
662 if (skdev->skmsg_free_list == NULL) { in skd_request_fn()
664 skdev->name, __func__, __LINE__); in skd_request_fn()
688 skmsg = skdev->skmsg_free_list; in skd_request_fn()
691 skdev->name, __func__, __LINE__, in skd_request_fn()
692 skdev); in skd_request_fn()
698 skdev->skmsg_free_list = skmsg->next; in skd_request_fn()
742 skd_end_request(skdev, skreq, -ENOMEM); in skd_request_fn()
763 error = skd_preop_sg_list(skdev, skreq); in skd_request_fn()
776 skdev->name, __func__, __LINE__); in skd_request_fn()
777 skd_end_request(skdev, skreq, error); in skd_request_fn()
786 skdev->skreq_free_list = skreq->next; in skd_request_fn()
797 skreq->timeout_stamp = skdev->timeout_stamp; in skd_request_fn()
799 skdev->timeout_slot[timo_slot]++; in skd_request_fn()
800 skdev->in_flight++; in skd_request_fn()
802 skdev->name, __func__, __LINE__, in skd_request_fn()
803 skreq->id, skdev->in_flight); in skd_request_fn()
810 skd_send_fitmsg(skdev, skmsg); in skd_request_fn()
826 skdev->name, __func__, __LINE__, in skd_request_fn()
828 skd_send_fitmsg(skdev, skmsg); in skd_request_fn()
836 skmsg->next = skdev->skmsg_free_list; in skd_request_fn()
837 skdev->skmsg_free_list = skmsg; in skd_request_fn()
848 blk_stop_queue(skdev->queue); in skd_request_fn()
851 static void skd_end_request(struct skd_device *skdev, in skd_end_request() argument
860 skdev->name, __func__, __LINE__); in skd_end_request()
871 skd_name(skdev), cmd, lba, count, skreq->id); in skd_end_request()
874 skdev->name, __func__, __LINE__, skreq->id, error); in skd_end_request()
879 static int skd_preop_sg_list(struct skd_device *skdev, in skd_preop_sg_list() argument
894 n_sg = blk_rq_map_sg(skdev->queue, req, sg); in skd_preop_sg_list()
902 n_sg = pci_map_sg(skdev->pdev, sg, n_sg, pci_dir); in skd_preop_sg_list()
906 SKD_ASSERT(n_sg <= skdev->sgs_per_request); in skd_preop_sg_list()
925 if (unlikely(skdev->dbg_level > 1)) { in skd_preop_sg_list()
927 skdev->name, __func__, __LINE__, in skd_preop_sg_list()
933 skdev->name, __func__, __LINE__, in skd_preop_sg_list()
942 static void skd_postop_sg_list(struct skd_device *skdev, in skd_postop_sg_list() argument
955 pci_unmap_sg(skdev->pdev, &skreq->sg[0], skreq->n_sg, pci_dir); in skd_postop_sg_list()
960 struct skd_device *skdev = q->queuedata; in skd_request_fn_not_online() local
963 SKD_ASSERT(skdev->state != SKD_DRVR_STATE_ONLINE); in skd_request_fn_not_online()
965 skd_log_skdev(skdev, "req_not_online"); in skd_request_fn_not_online()
966 switch (skdev->state) { in skd_request_fn_not_online()
999 skd_fail_all_pending(skdev); in skd_request_fn_not_online()
1008 static void skd_timer_tick_not_online(struct skd_device *skdev);
1012 struct skd_device *skdev = (struct skd_device *)arg; in skd_timer_tick() local
1019 if (skdev->state == SKD_DRVR_STATE_FAULT) in skd_timer_tick()
1025 spin_lock_irqsave(&skdev->lock, reqflags); in skd_timer_tick()
1027 state = SKD_READL(skdev, FIT_STATUS); in skd_timer_tick()
1029 if (state != skdev->drive_state) in skd_timer_tick()
1030 skd_isr_fwstate(skdev); in skd_timer_tick()
1032 if (skdev->state != SKD_DRVR_STATE_ONLINE) { in skd_timer_tick()
1033 skd_timer_tick_not_online(skdev); in skd_timer_tick()
1036 skdev->timeout_stamp++; in skd_timer_tick()
1037 timo_slot = skdev->timeout_stamp & SKD_TIMEOUT_SLOT_MASK; in skd_timer_tick()
1044 if (skdev->timeout_slot[timo_slot] == 0) in skd_timer_tick()
1048 overdue_timestamp = skdev->timeout_stamp - SKD_N_TIMEOUT_SLOT; in skd_timer_tick()
1051 skdev->name, __func__, __LINE__, in skd_timer_tick()
1052 skdev->timeout_slot[timo_slot], skdev->in_flight); in skd_timer_tick()
1054 skd_name(skdev), skdev->timeout_slot[timo_slot], in skd_timer_tick()
1055 skdev->in_flight); in skd_timer_tick()
1057 skdev->timer_countdown = SKD_DRAINING_TIMO; in skd_timer_tick()
1058 skdev->state = SKD_DRVR_STATE_DRAINING_TIMEOUT; in skd_timer_tick()
1059 skdev->timo_slot = timo_slot; in skd_timer_tick()
1060 blk_stop_queue(skdev->queue); in skd_timer_tick()
1063 mod_timer(&skdev->timer, (jiffies + HZ)); in skd_timer_tick()
1065 spin_unlock_irqrestore(&skdev->lock, reqflags); in skd_timer_tick()
1068 static void skd_timer_tick_not_online(struct skd_device *skdev) in skd_timer_tick_not_online() argument
1070 switch (skdev->state) { in skd_timer_tick_not_online()
1076 skdev->name, __func__, __LINE__, in skd_timer_tick_not_online()
1077 skdev->drive_state, skdev->state); in skd_timer_tick_not_online()
1081 if (skdev->timer_countdown > 0) { in skd_timer_tick_not_online()
1082 skdev->timer_countdown--; in skd_timer_tick_not_online()
1085 skd_recover_requests(skdev, 0); in skd_timer_tick_not_online()
1092 skdev->name, __func__, __LINE__, in skd_timer_tick_not_online()
1093 skdev->state, skdev->timer_countdown); in skd_timer_tick_not_online()
1094 if (skdev->timer_countdown > 0) { in skd_timer_tick_not_online()
1095 skdev->timer_countdown--; in skd_timer_tick_not_online()
1099 skdev->name, __func__, __LINE__, in skd_timer_tick_not_online()
1100 skdev->state, skdev->timer_countdown); in skd_timer_tick_not_online()
1101 skd_restart_device(skdev); in skd_timer_tick_not_online()
1106 if (skdev->timer_countdown > 0) { in skd_timer_tick_not_online()
1107 skdev->timer_countdown--; in skd_timer_tick_not_online()
1112 skdev->state = SKD_DRVR_STATE_FAULT; in skd_timer_tick_not_online()
1115 skd_name(skdev), skdev->drive_state); in skd_timer_tick_not_online()
1119 blk_start_queue(skdev->queue); in skd_timer_tick_not_online()
1120 skdev->gendisk_on = -1; in skd_timer_tick_not_online()
1121 wake_up_interruptible(&skdev->waitq); in skd_timer_tick_not_online()
1135 skdev->name, __func__, __LINE__, in skd_timer_tick_not_online()
1136 skdev->timo_slot, in skd_timer_tick_not_online()
1137 skdev->timer_countdown, in skd_timer_tick_not_online()
1138 skdev->in_flight, in skd_timer_tick_not_online()
1139 skdev->timeout_slot[skdev->timo_slot]); in skd_timer_tick_not_online()
1141 if (skdev->timeout_slot[skdev->timo_slot] == 0) { in skd_timer_tick_not_online()
1143 skdev->name, __func__, __LINE__); in skd_timer_tick_not_online()
1144 skdev->state = SKD_DRVR_STATE_ONLINE; in skd_timer_tick_not_online()
1145 blk_start_queue(skdev->queue); in skd_timer_tick_not_online()
1148 if (skdev->timer_countdown > 0) { in skd_timer_tick_not_online()
1149 skdev->timer_countdown--; in skd_timer_tick_not_online()
1152 skd_restart_device(skdev); in skd_timer_tick_not_online()
1156 if (skdev->timer_countdown > 0) { in skd_timer_tick_not_online()
1157 skdev->timer_countdown--; in skd_timer_tick_not_online()
1162 skdev->state = SKD_DRVR_STATE_FAULT; in skd_timer_tick_not_online()
1164 skd_name(skdev), skdev->drive_state); in skd_timer_tick_not_online()
1178 if ((skdev->drive_state == FIT_SR_DRIVE_SOFT_RESET) || in skd_timer_tick_not_online()
1179 (skdev->drive_state == FIT_SR_DRIVE_FAULT) || in skd_timer_tick_not_online()
1180 (skdev->drive_state == FIT_SR_DRIVE_STATE_MASK)) in skd_timer_tick_not_online()
1184 skd_recover_requests(skdev, 0); in skd_timer_tick_not_online()
1187 skd_name(skdev), skdev->drive_state); in skd_timer_tick_not_online()
1188 pci_disable_device(skdev->pdev); in skd_timer_tick_not_online()
1189 skd_disable_interrupts(skdev); in skd_timer_tick_not_online()
1190 skd_recover_requests(skdev, 0); in skd_timer_tick_not_online()
1195 blk_start_queue(skdev->queue); in skd_timer_tick_not_online()
1196 skdev->gendisk_on = -1; in skd_timer_tick_not_online()
1197 wake_up_interruptible(&skdev->waitq); in skd_timer_tick_not_online()
1210 static int skd_start_timer(struct skd_device *skdev) in skd_start_timer() argument
1214 init_timer(&skdev->timer); in skd_start_timer()
1215 setup_timer(&skdev->timer, skd_timer_tick, (ulong)skdev); in skd_start_timer()
1217 rc = mod_timer(&skdev->timer, (jiffies + HZ)); in skd_start_timer()
1224 static void skd_kill_timer(struct skd_device *skdev) in skd_kill_timer() argument
1226 del_timer_sync(&skdev->timer); in skd_kill_timer()
1234 static int skd_ioctl_sg_io(struct skd_device *skdev,
1236 static int skd_sg_io_get_and_check_args(struct skd_device *skdev,
1238 static int skd_sg_io_obtain_skspcl(struct skd_device *skdev,
1240 static int skd_sg_io_prep_buffering(struct skd_device *skdev,
1242 static int skd_sg_io_copy_buffer(struct skd_device *skdev,
1244 static int skd_sg_io_send_fitmsg(struct skd_device *skdev,
1246 static int skd_sg_io_await(struct skd_device *skdev, struct skd_sg_io *sksgio);
1247 static int skd_sg_io_release_skspcl(struct skd_device *skdev,
1249 static int skd_sg_io_put_status(struct skd_device *skdev,
1252 static void skd_complete_special(struct skd_device *skdev,
1263 struct skd_device *skdev = disk->private_data; in skd_bdev_ioctl() local
1267 skdev->name, __func__, __LINE__, in skd_bdev_ioctl()
1280 rc = skd_ioctl_sg_io(skdev, mode, p); in skd_bdev_ioctl()
1289 skdev->name, __func__, __LINE__, disk->disk_name, rc); in skd_bdev_ioctl()
1293 static int skd_ioctl_sg_io(struct skd_device *skdev, fmode_t mode, in skd_ioctl_sg_io() argument
1304 switch (skdev->state) { in skd_ioctl_sg_io()
1311 skdev->name, __func__, __LINE__); in skd_ioctl_sg_io()
1316 rc = skd_sg_io_get_and_check_args(skdev, &sksgio); in skd_ioctl_sg_io()
1320 rc = skd_sg_io_obtain_skspcl(skdev, &sksgio); in skd_ioctl_sg_io()
1324 rc = skd_sg_io_prep_buffering(skdev, &sksgio); in skd_ioctl_sg_io()
1328 rc = skd_sg_io_copy_buffer(skdev, &sksgio, SG_DXFER_TO_DEV); in skd_ioctl_sg_io()
1332 rc = skd_sg_io_send_fitmsg(skdev, &sksgio); in skd_ioctl_sg_io()
1336 rc = skd_sg_io_await(skdev, &sksgio); in skd_ioctl_sg_io()
1340 rc = skd_sg_io_copy_buffer(skdev, &sksgio, SG_DXFER_FROM_DEV); in skd_ioctl_sg_io()
1344 rc = skd_sg_io_put_status(skdev, &sksgio); in skd_ioctl_sg_io()
1351 skd_sg_io_release_skspcl(skdev, &sksgio); in skd_ioctl_sg_io()
1358 static int skd_sg_io_get_and_check_args(struct skd_device *skdev, in skd_sg_io_get_and_check_args() argument
1366 skdev->name, __func__, __LINE__, sksgio->argp); in skd_sg_io_get_and_check_args()
1372 skdev->name, __func__, __LINE__, sksgio->argp); in skd_sg_io_get_and_check_args()
1378 skdev->name, __func__, __LINE__, sgp->interface_id); in skd_sg_io_get_and_check_args()
1384 skdev->name, __func__, __LINE__, sgp->cmd_len); in skd_sg_io_get_and_check_args()
1390 skdev->name, __func__, __LINE__, sgp->iovec_count); in skd_sg_io_get_and_check_args()
1396 skdev->name, __func__, __LINE__, sgp->dxfer_len); in skd_sg_io_get_and_check_args()
1416 skdev->name, __func__, __LINE__, sgp->dxfer_direction); in skd_sg_io_get_and_check_args()
1422 skdev->name, __func__, __LINE__, sgp->cmdp); in skd_sg_io_get_and_check_args()
1429 skdev->name, __func__, __LINE__, sgp->sbp); in skd_sg_io_get_and_check_args()
1447 skdev->name, __func__, __LINE__, in skd_sg_io_get_and_check_args()
1456 skdev->name, __func__, __LINE__, sgp->dxferp); in skd_sg_io_get_and_check_args()
1485 skdev->name, __func__, __LINE__, in skd_sg_io_get_and_check_args()
1495 static int skd_sg_io_obtain_skspcl(struct skd_device *skdev, in skd_sg_io_obtain_skspcl() argument
1504 spin_lock_irqsave(&skdev->lock, flags); in skd_sg_io_obtain_skspcl()
1505 skspcl = skdev->skspcl_free_list; in skd_sg_io_obtain_skspcl()
1507 skdev->skspcl_free_list = in skd_sg_io_obtain_skspcl()
1514 spin_unlock_irqrestore(&skdev->lock, flags); in skd_sg_io_obtain_skspcl()
1522 skdev->name, __func__, __LINE__); in skd_sg_io_obtain_skspcl()
1525 skdev->waitq, in skd_sg_io_obtain_skspcl()
1526 (skdev->skspcl_free_list != NULL), in skd_sg_io_obtain_skspcl()
1530 skdev->name, __func__, __LINE__, rc); in skd_sg_io_obtain_skspcl()
1551 static int skd_skreq_prep_buffering(struct skd_device *skdev, in skd_skreq_prep_buffering() argument
1604 if (unlikely(skdev->dbg_level > 1)) { in skd_skreq_prep_buffering()
1608 skdev->name, __func__, __LINE__, in skd_skreq_prep_buffering()
1615 skdev->name, __func__, __LINE__, in skd_skreq_prep_buffering()
1624 static int skd_sg_io_prep_buffering(struct skd_device *skdev, in skd_sg_io_prep_buffering() argument
1632 rc = skd_skreq_prep_buffering(skdev, skreq, dxfer_len); in skd_sg_io_prep_buffering()
1640 static int skd_sg_io_copy_buffer(struct skd_device *skdev, in skd_sg_io_copy_buffer() argument
1697 static int skd_sg_io_send_fitmsg(struct skd_device *skdev, in skd_sg_io_send_fitmsg() argument
1720 skd_send_special_fitmsg(skdev, skspcl); in skd_sg_io_send_fitmsg()
1725 static int skd_sg_io_await(struct skd_device *skdev, struct skd_sg_io *sksgio) in skd_sg_io_await() argument
1730 rc = wait_event_interruptible_timeout(skdev->waitq, in skd_sg_io_await()
1736 spin_lock_irqsave(&skdev->lock, flags); in skd_sg_io_await()
1740 skdev->name, __func__, __LINE__, sksgio->skspcl); in skd_sg_io_await()
1766 skdev->name, __func__, __LINE__, in skd_sg_io_await()
1771 skdev->name, __func__, __LINE__, sksgio); in skd_sg_io_await()
1776 spin_unlock_irqrestore(&skdev->lock, flags); in skd_sg_io_await()
1781 static int skd_sg_io_put_status(struct skd_device *skdev, in skd_sg_io_put_status() argument
1802 skdev->name, __func__, __LINE__, in skd_sg_io_put_status()
1816 skdev->name, __func__, __LINE__, in skd_sg_io_put_status()
1825 skdev->name, __func__, __LINE__, sksgio->argp); in skd_sg_io_put_status()
1832 static int skd_sg_io_release_skspcl(struct skd_device *skdev, in skd_sg_io_release_skspcl() argument
1842 spin_lock_irqsave(&skdev->lock, flags); in skd_sg_io_release_skspcl()
1843 skd_release_special(skdev, skspcl); in skd_sg_io_release_skspcl()
1844 spin_unlock_irqrestore(&skdev->lock, flags); in skd_sg_io_release_skspcl()
1856 static int skd_format_internal_skspcl(struct skd_device *skdev) in skd_format_internal_skspcl() argument
1858 struct skd_special_context *skspcl = &skdev->internal_skspcl; in skd_format_internal_skspcl()
1883 static void skd_send_internal_skspcl(struct skd_device *skdev, in skd_send_internal_skspcl() argument
1963 skd_send_special_fitmsg(skdev, skspcl); in skd_send_internal_skspcl()
1966 static void skd_refresh_device_data(struct skd_device *skdev) in skd_refresh_device_data() argument
1968 struct skd_special_context *skspcl = &skdev->internal_skspcl; in skd_refresh_device_data()
1970 skd_send_internal_skspcl(skdev, skspcl, TEST_UNIT_READY); in skd_refresh_device_data()
1973 static int skd_chk_read_buf(struct skd_device *skdev, in skd_chk_read_buf() argument
1987 static void skd_log_check_status(struct skd_device *skdev, u8 status, u8 key, in skd_log_check_status() argument
1995 skd_name(skdev), key, code, qual, fruc); in skd_log_check_status()
1999 static void skd_complete_internal(struct skd_device *skdev, in skd_complete_internal() argument
2011 SKD_ASSERT(skspcl == &skdev->internal_skspcl); in skd_complete_internal()
2014 skdev->name, __func__, __LINE__, scsi->cdb[0]); in skd_complete_internal()
2022 skd_log_check_status(skdev, status, skerr->key, skerr->code, in skd_complete_internal()
2028 skd_send_internal_skspcl(skdev, skspcl, WRITE_BUFFER); in skd_complete_internal()
2031 skd_send_internal_skspcl(skdev, skspcl, WRITE_BUFFER); in skd_complete_internal()
2033 if (skdev->state == SKD_DRVR_STATE_STOPPING) { in skd_complete_internal()
2035 skdev->name, __func__, __LINE__, in skd_complete_internal()
2036 skdev->state); in skd_complete_internal()
2040 skdev->name, __func__, __LINE__); in skd_complete_internal()
2041 skd_send_internal_skspcl(skdev, skspcl, 0x00); in skd_complete_internal()
2047 skd_send_internal_skspcl(skdev, skspcl, READ_BUFFER); in skd_complete_internal()
2049 if (skdev->state == SKD_DRVR_STATE_STOPPING) { in skd_complete_internal()
2051 skdev->name, __func__, __LINE__, in skd_complete_internal()
2052 skdev->state); in skd_complete_internal()
2056 skdev->name, __func__, __LINE__); in skd_complete_internal()
2057 skd_send_internal_skspcl(skdev, skspcl, 0x00); in skd_complete_internal()
2063 if (skd_chk_read_buf(skdev, skspcl) == 0) in skd_complete_internal()
2064 skd_send_internal_skspcl(skdev, skspcl, in skd_complete_internal()
2069 skd_name(skdev), skdev->connect_retries); in skd_complete_internal()
2070 if (skdev->connect_retries < in skd_complete_internal()
2072 skdev->connect_retries++; in skd_complete_internal()
2073 skd_soft_reset(skdev); in skd_complete_internal()
2077 skd_name(skdev)); in skd_complete_internal()
2083 if (skdev->state == SKD_DRVR_STATE_STOPPING) { in skd_complete_internal()
2086 skdev->name, __func__, __LINE__, in skd_complete_internal()
2087 skdev->state); in skd_complete_internal()
2092 skdev->name, __func__, __LINE__); in skd_complete_internal()
2093 skd_send_internal_skspcl(skdev, skspcl, 0x00); in skd_complete_internal()
2098 skdev->read_cap_is_valid = 0; in skd_complete_internal()
2100 skdev->read_cap_last_lba = in skd_complete_internal()
2103 skdev->read_cap_blocksize = in skd_complete_internal()
2108 skdev->name, __func__, __LINE__, in skd_complete_internal()
2109 skdev->read_cap_last_lba, in skd_complete_internal()
2110 skdev->read_cap_blocksize); in skd_complete_internal()
2112 set_capacity(skdev->disk, skdev->read_cap_last_lba + 1); in skd_complete_internal()
2114 skdev->read_cap_is_valid = 1; in skd_complete_internal()
2116 skd_send_internal_skspcl(skdev, skspcl, INQUIRY); in skd_complete_internal()
2119 skdev->read_cap_last_lba = ~0; in skd_complete_internal()
2120 set_capacity(skdev->disk, skdev->read_cap_last_lba + 1); in skd_complete_internal()
2123 skdev->name, __func__, __LINE__); in skd_complete_internal()
2124 skd_send_internal_skspcl(skdev, skspcl, INQUIRY); in skd_complete_internal()
2127 skdev->name, __func__, __LINE__); in skd_complete_internal()
2128 skd_send_internal_skspcl(skdev, skspcl, in skd_complete_internal()
2134 skdev->inquiry_is_valid = 0; in skd_complete_internal()
2136 skdev->inquiry_is_valid = 1; in skd_complete_internal()
2139 skdev->inq_serial_num[i] = buf[i + 4]; in skd_complete_internal()
2140 skdev->inq_serial_num[12] = 0; in skd_complete_internal()
2143 if (skd_unquiesce_dev(skdev) < 0) in skd_complete_internal()
2145 skdev->name, __func__, __LINE__); in skd_complete_internal()
2147 skdev->connect_retries = 0; in skd_complete_internal()
2152 skdev->sync_done = 1; in skd_complete_internal()
2154 skdev->sync_done = -1; in skd_complete_internal()
2155 wake_up_interruptible(&skdev->waitq); in skd_complete_internal()
2169 static void skd_send_fitmsg(struct skd_device *skdev, in skd_send_fitmsg() argument
2176 skdev->name, __func__, __LINE__, in skd_send_fitmsg()
2177 skmsg->mb_dma_address, skdev->in_flight); in skd_send_fitmsg()
2179 skdev->name, __func__, __LINE__, in skd_send_fitmsg()
2188 if (unlikely(skdev->dbg_level > 1)) { in skd_send_fitmsg()
2194 skdev->name, __func__, __LINE__, in skd_send_fitmsg()
2217 SKD_WRITEQ(skdev, qcmd, FIT_Q_COMMAND); in skd_send_fitmsg()
2221 static void skd_send_special_fitmsg(struct skd_device *skdev, in skd_send_special_fitmsg() argument
2226 if (unlikely(skdev->dbg_level > 1)) { in skd_send_special_fitmsg()
2233 skdev->name, __func__, __LINE__, i, in skd_send_special_fitmsg()
2241 skdev->name, __func__, __LINE__, in skd_send_special_fitmsg()
2250 skdev->name, __func__, __LINE__, in skd_send_special_fitmsg()
2263 SKD_WRITEQ(skdev, qcmd, FIT_Q_COMMAND); in skd_send_special_fitmsg()
2272 static void skd_complete_other(struct skd_device *skdev,
2322 skd_check_status(struct skd_device *skdev, in skd_check_status() argument
2328 skd_name(skdev), skerr->key, skerr->code, skerr->qual, in skd_check_status()
2332 skdev->name, __func__, __LINE__, skerr->type, cmp_status, in skd_check_status()
2363 skd_name(skdev), skerr->key, in skd_check_status()
2374 skdev->name, __func__, __LINE__); in skd_check_status()
2379 skdev->name, __func__, __LINE__); in skd_check_status()
2383 static void skd_resolve_req_exception(struct skd_device *skdev, in skd_resolve_req_exception() argument
2388 switch (skd_check_status(skdev, cmp_status, &skreq->err_info)) { in skd_resolve_req_exception()
2391 skd_end_request(skdev, skreq, 0); in skd_resolve_req_exception()
2395 skd_log_skreq(skdev, skreq, "retry(busy)"); in skd_resolve_req_exception()
2396 blk_requeue_request(skdev->queue, skreq->req); in skd_resolve_req_exception()
2397 pr_info("(%s) drive BUSY imminent\n", skd_name(skdev)); in skd_resolve_req_exception()
2398 skdev->state = SKD_DRVR_STATE_BUSY_IMMINENT; in skd_resolve_req_exception()
2399 skdev->timer_countdown = SKD_TIMER_MINUTES(20); in skd_resolve_req_exception()
2400 skd_quiesce_dev(skdev); in skd_resolve_req_exception()
2405 skd_log_skreq(skdev, skreq, "retry"); in skd_resolve_req_exception()
2406 blk_requeue_request(skdev->queue, skreq->req); in skd_resolve_req_exception()
2413 skd_end_request(skdev, skreq, -EIO); in skd_resolve_req_exception()
2419 static void skd_release_skreq(struct skd_device *skdev, in skd_release_skreq() argument
2445 SKD_ASSERT(msg_slot < skdev->num_fitmsg_context); in skd_release_skreq()
2447 skmsg = &skdev->skmsg_table[msg_slot]; in skd_release_skreq()
2455 skmsg->next = skdev->skmsg_free_list; in skd_release_skreq()
2456 skdev->skmsg_free_list = skmsg; in skd_release_skreq()
2464 SKD_ASSERT(skdev->in_flight > 0); in skd_release_skreq()
2465 skdev->in_flight -= 1; in skd_release_skreq()
2468 SKD_ASSERT(skdev->timeout_slot[timo_slot] > 0); in skd_release_skreq()
2469 skdev->timeout_slot[timo_slot] -= 1; in skd_release_skreq()
2481 skreq->next = skdev->skreq_free_list; in skd_release_skreq()
2482 skdev->skreq_free_list = skreq; in skd_release_skreq()
2487 static void skd_do_inq_page_00(struct skd_device *skdev, in skd_do_inq_page_00() argument
2498 skdev->name, __func__, __LINE__); in skd_do_inq_page_00()
2586 static void skd_do_inq_page_da(struct skd_device *skdev, in skd_do_inq_page_da() argument
2591 struct pci_dev *pdev = skdev->pdev; in skd_do_inq_page_da()
2597 skdev->name, __func__, __LINE__); in skd_do_inq_page_da()
2640 static void skd_do_driver_inq(struct skd_device *skdev, in skd_do_driver_inq() argument
2653 skd_do_inq_page_00(skdev, skcomp, skerr, cdb, buf); in skd_do_driver_inq()
2656 skd_do_inq_page_da(skdev, skcomp, skerr, cdb, buf); in skd_do_driver_inq()
2668 static void skd_process_scsi_inq(struct skd_device *skdev, in skd_process_scsi_inq() argument
2678 dma_sync_sg_for_cpu(skdev->class_dev, skspcl->req.sg, skspcl->req.n_sg, in skd_process_scsi_inq()
2683 skd_do_driver_inq(skdev, skcomp, skerr, scsi_req->cdb, buf); in skd_process_scsi_inq()
2687 static int skd_isr_completion_posted(struct skd_device *skdev, in skd_isr_completion_posted() argument
2703 SKD_ASSERT(skdev->skcomp_ix < SKD_N_COMPLETION_ENTRY); in skd_isr_completion_posted()
2705 skcmp = &skdev->skcomp_table[skdev->skcomp_ix]; in skd_isr_completion_posted()
2711 skerr = &skdev->skerr_table[skdev->skcomp_ix]; in skd_isr_completion_posted()
2716 skdev->name, __func__, __LINE__, skdev->skcomp_cycle, in skd_isr_completion_posted()
2717 skdev->skcomp_ix, cmp_cycle, cmp_cntxt, cmp_status, in skd_isr_completion_posted()
2718 skdev->in_flight, cmp_bytes, skdev->proto_ver); in skd_isr_completion_posted()
2720 if (cmp_cycle != skdev->skcomp_cycle) { in skd_isr_completion_posted()
2722 skdev->name, __func__, __LINE__); in skd_isr_completion_posted()
2729 skdev->skcomp_ix++; in skd_isr_completion_posted()
2730 if (skdev->skcomp_ix >= SKD_N_COMPLETION_ENTRY) { in skd_isr_completion_posted()
2731 skdev->skcomp_ix = 0; in skd_isr_completion_posted()
2732 skdev->skcomp_cycle++; in skd_isr_completion_posted()
2744 if (req_slot >= skdev->num_req_context) { in skd_isr_completion_posted()
2748 skd_complete_other(skdev, skcmp, skerr); in skd_isr_completion_posted()
2752 skreq = &skdev->skreq_table[req_slot]; in skd_isr_completion_posted()
2759 skdev->name, __func__, __LINE__, in skd_isr_completion_posted()
2765 skd_name(skdev), req_id, in skd_isr_completion_posted()
2776 skdev->name, __func__, __LINE__, in skd_isr_completion_posted()
2780 skd_release_skreq(skdev, skreq); in skd_isr_completion_posted()
2787 skd_log_check_status(skdev, cmp_status, skerr->key, in skd_isr_completion_posted()
2793 skd_postop_sg_list(skdev, skreq); in skd_isr_completion_posted()
2798 skdev->name, __func__, __LINE__, in skd_isr_completion_posted()
2806 skd_end_request(skdev, skreq, 0); in skd_isr_completion_posted()
2808 skd_resolve_req_exception(skdev, skreq); in skd_isr_completion_posted()
2815 skd_release_skreq(skdev, skreq); in skd_isr_completion_posted()
2826 if ((skdev->state == SKD_DRVR_STATE_PAUSING) in skd_isr_completion_posted()
2827 && (skdev->in_flight) == 0) { in skd_isr_completion_posted()
2828 skdev->state = SKD_DRVR_STATE_PAUSED; in skd_isr_completion_posted()
2829 wake_up_interruptible(&skdev->waitq); in skd_isr_completion_posted()
2835 static void skd_complete_other(struct skd_device *skdev, in skd_complete_other() argument
2849 skdev->name, __func__, __LINE__, in skd_complete_other()
2871 if (req_slot < skdev->n_special) { in skd_complete_other()
2872 skspcl = &skdev->skspcl_table[req_slot]; in skd_complete_other()
2875 skd_complete_special(skdev, in skd_complete_other()
2884 skspcl = &skdev->internal_skspcl; in skd_complete_other()
2887 skd_complete_internal(skdev, in skd_complete_other()
2912 static void skd_complete_special(struct skd_device *skdev, in skd_complete_special() argument
2919 skdev->name, __func__, __LINE__, skspcl); in skd_complete_special()
2925 skdev->name, __func__, __LINE__, skspcl); in skd_complete_special()
2926 skd_release_special(skdev, skspcl); in skd_complete_special()
2930 skd_process_scsi_inq(skdev, skcomp, skerr, skspcl); in skd_complete_special()
2936 skd_log_check_status(skdev, skspcl->req.completion.status, skerr->key, in skd_complete_special()
2939 wake_up_interruptible(&skdev->waitq); in skd_complete_special()
2943 static void skd_release_special(struct skd_device *skdev, in skd_release_special() argument
2953 was_depleted = (skdev->skspcl_free_list == NULL); in skd_release_special()
2958 (struct skd_request_context *)skdev->skspcl_free_list; in skd_release_special()
2959 skdev->skspcl_free_list = (struct skd_special_context *)skspcl; in skd_release_special()
2963 skdev->name, __func__, __LINE__); in skd_release_special()
2965 wake_up_interruptible(&skdev->waitq); in skd_release_special()
2969 static void skd_reset_skcomp(struct skd_device *skdev) in skd_reset_skcomp() argument
2977 memset(skdev->skcomp_table, 0, nbytes); in skd_reset_skcomp()
2979 skdev->skcomp_ix = 0; in skd_reset_skcomp()
2980 skdev->skcomp_cycle = 1; in skd_reset_skcomp()
2990 struct skd_device *skdev = in skd_completion_worker() local
2995 spin_lock_irqsave(&skdev->lock, flags); in skd_completion_worker()
3001 skd_isr_completion_posted(skdev, 0, &flush_enqueued); in skd_completion_worker()
3002 skd_request_fn(skdev->queue); in skd_completion_worker()
3004 spin_unlock_irqrestore(&skdev->lock, flags); in skd_completion_worker()
3007 static void skd_isr_msg_from_dev(struct skd_device *skdev);
3012 struct skd_device *skdev; in skd_isr() local
3019 skdev = (struct skd_device *)ptr; in skd_isr()
3020 spin_lock(&skdev->lock); in skd_isr()
3023 intstat = SKD_READL(skdev, FIT_INT_STATUS_HOST); in skd_isr()
3029 skdev->name, __func__, __LINE__, intstat, ack); in skd_isr()
3040 if (likely (skdev->state in skd_isr()
3048 SKD_WRITEL(skdev, ack, FIT_INT_STATUS_HOST); in skd_isr()
3050 if (likely((skdev->state != SKD_DRVR_STATE_LOAD) && in skd_isr()
3051 (skdev->state != SKD_DRVR_STATE_STOPPING))) { in skd_isr()
3059 skd_isr_completion_posted(skdev, in skd_isr()
3064 skd_isr_fwstate(skdev); in skd_isr()
3065 if (skdev->state == SKD_DRVR_STATE_FAULT || in skd_isr()
3066 skdev->state == in skd_isr()
3068 spin_unlock(&skdev->lock); in skd_isr()
3074 skd_isr_msg_from_dev(skdev); in skd_isr()
3079 skd_request_fn(skdev->queue); in skd_isr()
3082 schedule_work(&skdev->completion_worker); in skd_isr()
3084 skd_request_fn(skdev->queue); in skd_isr()
3086 spin_unlock(&skdev->lock); in skd_isr()
3091 static void skd_drive_fault(struct skd_device *skdev) in skd_drive_fault() argument
3093 skdev->state = SKD_DRVR_STATE_FAULT; in skd_drive_fault()
3094 pr_err("(%s): Drive FAULT\n", skd_name(skdev)); in skd_drive_fault()
3097 static void skd_drive_disappeared(struct skd_device *skdev) in skd_drive_disappeared() argument
3099 skdev->state = SKD_DRVR_STATE_DISAPPEARED; in skd_drive_disappeared()
3100 pr_err("(%s): Drive DISAPPEARED\n", skd_name(skdev)); in skd_drive_disappeared()
3103 static void skd_isr_fwstate(struct skd_device *skdev) in skd_isr_fwstate() argument
3108 int prev_driver_state = skdev->state; in skd_isr_fwstate()
3110 sense = SKD_READL(skdev, FIT_STATUS); in skd_isr_fwstate()
3114 skd_name(skdev), in skd_isr_fwstate()
3115 skd_drive_state_to_str(skdev->drive_state), skdev->drive_state, in skd_isr_fwstate()
3118 skdev->drive_state = state; in skd_isr_fwstate()
3120 switch (skdev->drive_state) { in skd_isr_fwstate()
3122 if (skdev->state == SKD_DRVR_STATE_PROTOCOL_MISMATCH) { in skd_isr_fwstate()
3123 skd_disable_interrupts(skdev); in skd_isr_fwstate()
3126 if (skdev->state == SKD_DRVR_STATE_RESTARTING) in skd_isr_fwstate()
3127 skd_recover_requests(skdev, 0); in skd_isr_fwstate()
3128 if (skdev->state == SKD_DRVR_STATE_WAIT_BOOT) { in skd_isr_fwstate()
3129 skdev->timer_countdown = SKD_STARTING_TIMO; in skd_isr_fwstate()
3130 skdev->state = SKD_DRVR_STATE_STARTING; in skd_isr_fwstate()
3131 skd_soft_reset(skdev); in skd_isr_fwstate()
3135 SKD_WRITEL(skdev, mtd, FIT_MSG_TO_DEVICE); in skd_isr_fwstate()
3136 skdev->last_mtd = mtd; in skd_isr_fwstate()
3140 skdev->cur_max_queue_depth = skd_max_queue_depth; in skd_isr_fwstate()
3141 if (skdev->cur_max_queue_depth > skdev->dev_max_queue_depth) in skd_isr_fwstate()
3142 skdev->cur_max_queue_depth = skdev->dev_max_queue_depth; in skd_isr_fwstate()
3144 skdev->queue_low_water_mark = in skd_isr_fwstate()
3145 skdev->cur_max_queue_depth * 2 / 3 + 1; in skd_isr_fwstate()
3146 if (skdev->queue_low_water_mark < 1) in skd_isr_fwstate()
3147 skdev->queue_low_water_mark = 1; in skd_isr_fwstate()
3150 skd_name(skdev), in skd_isr_fwstate()
3151 skdev->cur_max_queue_depth, in skd_isr_fwstate()
3152 skdev->dev_max_queue_depth, skdev->queue_low_water_mark); in skd_isr_fwstate()
3154 skd_refresh_device_data(skdev); in skd_isr_fwstate()
3158 skdev->state = SKD_DRVR_STATE_BUSY; in skd_isr_fwstate()
3159 skdev->timer_countdown = SKD_BUSY_TIMO; in skd_isr_fwstate()
3160 skd_quiesce_dev(skdev); in skd_isr_fwstate()
3166 skdev->state = SKD_DRVR_STATE_BUSY_SANITIZE; in skd_isr_fwstate()
3167 skdev->timer_countdown = SKD_TIMER_SECONDS(3); in skd_isr_fwstate()
3168 blk_start_queue(skdev->queue); in skd_isr_fwstate()
3171 skdev->state = SKD_DRVR_STATE_BUSY_ERASE; in skd_isr_fwstate()
3172 skdev->timer_countdown = SKD_BUSY_TIMO; in skd_isr_fwstate()
3175 skdev->state = SKD_DRVR_STATE_IDLE; in skd_isr_fwstate()
3178 switch (skdev->state) { in skd_isr_fwstate()
3184 skdev->state = SKD_DRVR_STATE_RESTARTING; in skd_isr_fwstate()
3190 skdev->name, __func__, __LINE__, skdev->name); in skd_isr_fwstate()
3191 skdev->state = SKD_DRVR_STATE_WAIT_BOOT; in skd_isr_fwstate()
3192 skdev->timer_countdown = SKD_WAIT_BOOT_TIMO; in skd_isr_fwstate()
3201 skd_drive_fault(skdev); in skd_isr_fwstate()
3202 skd_recover_requests(skdev, 0); in skd_isr_fwstate()
3203 blk_start_queue(skdev->queue); in skd_isr_fwstate()
3209 skd_name(skdev), state, sense); in skd_isr_fwstate()
3210 skd_drive_disappeared(skdev); in skd_isr_fwstate()
3211 skd_recover_requests(skdev, 0); in skd_isr_fwstate()
3212 blk_start_queue(skdev->queue); in skd_isr_fwstate()
3221 skd_name(skdev), in skd_isr_fwstate()
3223 skd_skdev_state_to_str(skdev->state), skdev->state); in skd_isr_fwstate()
3226 static void skd_recover_requests(struct skd_device *skdev, int requeue) in skd_recover_requests() argument
3230 for (i = 0; i < skdev->num_req_context; i++) { in skd_recover_requests()
3231 struct skd_request_context *skreq = &skdev->skreq_table[i]; in skd_recover_requests()
3234 skd_log_skreq(skdev, skreq, "recover"); in skd_recover_requests()
3241 skd_postop_sg_list(skdev, skreq); in skd_recover_requests()
3246 blk_requeue_request(skdev->queue, skreq->req); in skd_recover_requests()
3248 skd_end_request(skdev, skreq, -EIO); in skd_recover_requests()
3259 skdev->skreq_free_list = skdev->skreq_table; in skd_recover_requests()
3261 for (i = 0; i < skdev->num_fitmsg_context; i++) { in skd_recover_requests()
3262 struct skd_fitmsg_context *skmsg = &skdev->skmsg_table[i]; in skd_recover_requests()
3265 skd_log_skmsg(skdev, skmsg, "salvaged"); in skd_recover_requests()
3274 skdev->skmsg_free_list = skdev->skmsg_table; in skd_recover_requests()
3276 for (i = 0; i < skdev->n_special; i++) { in skd_recover_requests()
3277 struct skd_special_context *skspcl = &skdev->skspcl_table[i]; in skd_recover_requests()
3289 skdev->name, __func__, __LINE__, in skd_recover_requests()
3291 skd_release_special(skdev, skspcl); in skd_recover_requests()
3294 skdev->name, __func__, __LINE__, in skd_recover_requests()
3300 skdev->skspcl_free_list = skdev->skspcl_table; in skd_recover_requests()
3303 skdev->timeout_slot[i] = 0; in skd_recover_requests()
3305 skdev->in_flight = 0; in skd_recover_requests()
3308 static void skd_isr_msg_from_dev(struct skd_device *skdev) in skd_isr_msg_from_dev() argument
3314 mfd = SKD_READL(skdev, FIT_MSG_FROM_DEVICE); in skd_isr_msg_from_dev()
3317 skdev->name, __func__, __LINE__, mfd, skdev->last_mtd); in skd_isr_msg_from_dev()
3320 if (FIT_MXD_TYPE(mfd) != FIT_MXD_TYPE(skdev->last_mtd)) in skd_isr_msg_from_dev()
3325 skdev->proto_ver = FIT_PROTOCOL_MAJOR_VER(mfd); in skd_isr_msg_from_dev()
3327 if (skdev->proto_ver != FIT_PROTOCOL_VERSION_1) { in skd_isr_msg_from_dev()
3329 skdev->name); in skd_isr_msg_from_dev()
3331 skdev->name, skdev->proto_ver, in skd_isr_msg_from_dev()
3334 skdev->name); in skd_isr_msg_from_dev()
3335 skdev->state = SKD_DRVR_STATE_PROTOCOL_MISMATCH; in skd_isr_msg_from_dev()
3336 skd_soft_reset(skdev); in skd_isr_msg_from_dev()
3340 SKD_WRITEL(skdev, mtd, FIT_MSG_TO_DEVICE); in skd_isr_msg_from_dev()
3341 skdev->last_mtd = mtd; in skd_isr_msg_from_dev()
3345 skdev->dev_max_queue_depth = FIT_MXD_DATA(mfd); in skd_isr_msg_from_dev()
3348 SKD_WRITEL(skdev, mtd, FIT_MSG_TO_DEVICE); in skd_isr_msg_from_dev()
3349 skdev->last_mtd = mtd; in skd_isr_msg_from_dev()
3353 SKD_WRITEQ(skdev, skdev->cq_dma_address, FIT_MSG_TO_DEVICE_ARG); in skd_isr_msg_from_dev()
3355 SKD_WRITEL(skdev, mtd, FIT_MSG_TO_DEVICE); in skd_isr_msg_from_dev()
3356 skdev->last_mtd = mtd; in skd_isr_msg_from_dev()
3360 skd_reset_skcomp(skdev); in skd_isr_msg_from_dev()
3361 mtd = FIT_MXD_CONS(FIT_MTD_CMD_LOG_HOST_ID, 0, skdev->devno); in skd_isr_msg_from_dev()
3362 SKD_WRITEL(skdev, mtd, FIT_MSG_TO_DEVICE); in skd_isr_msg_from_dev()
3363 skdev->last_mtd = mtd; in skd_isr_msg_from_dev()
3367 skdev->connect_time_stamp = get_seconds(); in skd_isr_msg_from_dev()
3368 data = skdev->connect_time_stamp & 0xFFFF; in skd_isr_msg_from_dev()
3370 SKD_WRITEL(skdev, mtd, FIT_MSG_TO_DEVICE); in skd_isr_msg_from_dev()
3371 skdev->last_mtd = mtd; in skd_isr_msg_from_dev()
3375 skdev->drive_jiffies = FIT_MXD_DATA(mfd); in skd_isr_msg_from_dev()
3376 data = (skdev->connect_time_stamp >> 16) & 0xFFFF; in skd_isr_msg_from_dev()
3378 SKD_WRITEL(skdev, mtd, FIT_MSG_TO_DEVICE); in skd_isr_msg_from_dev()
3379 skdev->last_mtd = mtd; in skd_isr_msg_from_dev()
3383 skdev->drive_jiffies |= (FIT_MXD_DATA(mfd) << 16); in skd_isr_msg_from_dev()
3385 SKD_WRITEL(skdev, mtd, FIT_MSG_TO_DEVICE); in skd_isr_msg_from_dev()
3386 skdev->last_mtd = mtd; in skd_isr_msg_from_dev()
3389 skd_name(skdev), in skd_isr_msg_from_dev()
3390 skdev->connect_time_stamp, skdev->drive_jiffies); in skd_isr_msg_from_dev()
3394 skdev->last_mtd = 0; in skd_isr_msg_from_dev()
3405 static void skd_disable_interrupts(struct skd_device *skdev) in skd_disable_interrupts() argument
3409 sense = SKD_READL(skdev, FIT_CONTROL); in skd_disable_interrupts()
3411 SKD_WRITEL(skdev, sense, FIT_CONTROL); in skd_disable_interrupts()
3413 skdev->name, __func__, __LINE__, sense); in skd_disable_interrupts()
3418 SKD_WRITEL(skdev, ~0, FIT_INT_MASK_HOST); in skd_disable_interrupts()
3421 static void skd_enable_interrupts(struct skd_device *skdev) in skd_enable_interrupts() argument
3431 SKD_WRITEL(skdev, ~val, FIT_INT_MASK_HOST); in skd_enable_interrupts()
3433 skdev->name, __func__, __LINE__, ~val); in skd_enable_interrupts()
3435 val = SKD_READL(skdev, FIT_CONTROL); in skd_enable_interrupts()
3438 skdev->name, __func__, __LINE__, val); in skd_enable_interrupts()
3439 SKD_WRITEL(skdev, val, FIT_CONTROL); in skd_enable_interrupts()
3448 static void skd_soft_reset(struct skd_device *skdev) in skd_soft_reset() argument
3452 val = SKD_READL(skdev, FIT_CONTROL); in skd_soft_reset()
3455 skdev->name, __func__, __LINE__, val); in skd_soft_reset()
3456 SKD_WRITEL(skdev, val, FIT_CONTROL); in skd_soft_reset()
3459 static void skd_start_device(struct skd_device *skdev) in skd_start_device() argument
3465 spin_lock_irqsave(&skdev->lock, flags); in skd_start_device()
3468 SKD_WRITEL(skdev, FIT_INT_DEF_MASK, FIT_INT_STATUS_HOST); in skd_start_device()
3470 sense = SKD_READL(skdev, FIT_STATUS); in skd_start_device()
3473 skdev->name, __func__, __LINE__, sense); in skd_start_device()
3476 skdev->drive_state = state; in skd_start_device()
3477 skdev->last_mtd = 0; in skd_start_device()
3479 skdev->state = SKD_DRVR_STATE_STARTING; in skd_start_device()
3480 skdev->timer_countdown = SKD_STARTING_TIMO; in skd_start_device()
3482 skd_enable_interrupts(skdev); in skd_start_device()
3484 switch (skdev->drive_state) { in skd_start_device()
3486 pr_err("(%s): Drive offline...\n", skd_name(skdev)); in skd_start_device()
3491 skdev->name, __func__, __LINE__, skdev->name); in skd_start_device()
3492 skdev->state = SKD_DRVR_STATE_WAIT_BOOT; in skd_start_device()
3493 skdev->timer_countdown = SKD_WAIT_BOOT_TIMO; in skd_start_device()
3498 skd_name(skdev)); in skd_start_device()
3499 skdev->state = SKD_DRVR_STATE_BUSY_SANITIZE; in skd_start_device()
3500 skdev->timer_countdown = SKD_STARTED_BUSY_TIMO; in skd_start_device()
3504 pr_info("(%s): Start: BUSY_ERASE\n", skd_name(skdev)); in skd_start_device()
3505 skdev->state = SKD_DRVR_STATE_BUSY_ERASE; in skd_start_device()
3506 skdev->timer_countdown = SKD_STARTED_BUSY_TIMO; in skd_start_device()
3511 skd_soft_reset(skdev); in skd_start_device()
3515 pr_err("(%s): Drive Busy...\n", skd_name(skdev)); in skd_start_device()
3516 skdev->state = SKD_DRVR_STATE_BUSY; in skd_start_device()
3517 skdev->timer_countdown = SKD_STARTED_BUSY_TIMO; in skd_start_device()
3522 skd_name(skdev)); in skd_start_device()
3530 skd_drive_fault(skdev); in skd_start_device()
3533 skdev->name, __func__, __LINE__, skdev->name); in skd_start_device()
3534 blk_start_queue(skdev->queue); in skd_start_device()
3535 skdev->gendisk_on = -1; in skd_start_device()
3536 wake_up_interruptible(&skdev->waitq); in skd_start_device()
3542 skd_drive_disappeared(skdev); in skd_start_device()
3545 skdev->name, __func__, __LINE__, skdev->name); in skd_start_device()
3546 blk_start_queue(skdev->queue); in skd_start_device()
3547 skdev->gendisk_on = -1; in skd_start_device()
3548 wake_up_interruptible(&skdev->waitq); in skd_start_device()
3553 skd_name(skdev), skdev->drive_state); in skd_start_device()
3557 state = SKD_READL(skdev, FIT_CONTROL); in skd_start_device()
3559 skdev->name, __func__, __LINE__, state); in skd_start_device()
3561 state = SKD_READL(skdev, FIT_INT_STATUS_HOST); in skd_start_device()
3563 skdev->name, __func__, __LINE__, state); in skd_start_device()
3565 state = SKD_READL(skdev, FIT_INT_MASK_HOST); in skd_start_device()
3567 skdev->name, __func__, __LINE__, state); in skd_start_device()
3569 state = SKD_READL(skdev, FIT_MSG_FROM_DEVICE); in skd_start_device()
3571 skdev->name, __func__, __LINE__, state); in skd_start_device()
3573 state = SKD_READL(skdev, FIT_HW_VERSION); in skd_start_device()
3575 skdev->name, __func__, __LINE__, state); in skd_start_device()
3577 spin_unlock_irqrestore(&skdev->lock, flags); in skd_start_device()
3580 static void skd_stop_device(struct skd_device *skdev) in skd_stop_device() argument
3583 struct skd_special_context *skspcl = &skdev->internal_skspcl; in skd_stop_device()
3587 spin_lock_irqsave(&skdev->lock, flags); in skd_stop_device()
3589 if (skdev->state != SKD_DRVR_STATE_ONLINE) { in skd_stop_device()
3591 skd_name(skdev)); in skd_stop_device()
3597 skd_name(skdev)); in skd_stop_device()
3601 skdev->state = SKD_DRVR_STATE_SYNCING; in skd_stop_device()
3602 skdev->sync_done = 0; in skd_stop_device()
3604 skd_send_internal_skspcl(skdev, skspcl, SYNCHRONIZE_CACHE); in skd_stop_device()
3606 spin_unlock_irqrestore(&skdev->lock, flags); in skd_stop_device()
3608 wait_event_interruptible_timeout(skdev->waitq, in skd_stop_device()
3609 (skdev->sync_done), (10 * HZ)); in skd_stop_device()
3611 spin_lock_irqsave(&skdev->lock, flags); in skd_stop_device()
3613 switch (skdev->sync_done) { in skd_stop_device()
3616 skd_name(skdev)); in skd_stop_device()
3620 skd_name(skdev)); in skd_stop_device()
3624 skd_name(skdev)); in skd_stop_device()
3628 skdev->state = SKD_DRVR_STATE_STOPPING; in skd_stop_device()
3629 spin_unlock_irqrestore(&skdev->lock, flags); in skd_stop_device()
3631 skd_kill_timer(skdev); in skd_stop_device()
3633 spin_lock_irqsave(&skdev->lock, flags); in skd_stop_device()
3634 skd_disable_interrupts(skdev); in skd_stop_device()
3638 SKD_WRITEL(skdev, FIT_INT_DEF_MASK, FIT_INT_STATUS_HOST); in skd_stop_device()
3639 SKD_WRITEL(skdev, FIT_CR_SOFT_RESET, FIT_CONTROL); in skd_stop_device()
3641 spin_unlock_irqrestore(&skdev->lock, flags); in skd_stop_device()
3646 SKD_READL(skdev, FIT_STATUS) & FIT_SR_DRIVE_STATE_MASK; in skd_stop_device()
3655 skd_name(skdev), dev_state); in skd_stop_device()
3659 static void skd_restart_device(struct skd_device *skdev) in skd_restart_device() argument
3664 SKD_WRITEL(skdev, FIT_INT_DEF_MASK, FIT_INT_STATUS_HOST); in skd_restart_device()
3666 state = SKD_READL(skdev, FIT_STATUS); in skd_restart_device()
3669 skdev->name, __func__, __LINE__, state); in skd_restart_device()
3672 skdev->drive_state = state; in skd_restart_device()
3673 skdev->last_mtd = 0; in skd_restart_device()
3675 skdev->state = SKD_DRVR_STATE_RESTARTING; in skd_restart_device()
3676 skdev->timer_countdown = SKD_RESTARTING_TIMO; in skd_restart_device()
3678 skd_soft_reset(skdev); in skd_restart_device()
3682 static int skd_quiesce_dev(struct skd_device *skdev) in skd_quiesce_dev() argument
3686 switch (skdev->state) { in skd_quiesce_dev()
3690 skdev->name, __func__, __LINE__, skdev->name); in skd_quiesce_dev()
3691 blk_stop_queue(skdev->queue); in skd_quiesce_dev()
3704 skdev->name, __func__, __LINE__, skdev->state); in skd_quiesce_dev()
3710 static int skd_unquiesce_dev(struct skd_device *skdev) in skd_unquiesce_dev() argument
3712 int prev_driver_state = skdev->state; in skd_unquiesce_dev()
3714 skd_log_skdev(skdev, "unquiesce"); in skd_unquiesce_dev()
3715 if (skdev->state == SKD_DRVR_STATE_ONLINE) { in skd_unquiesce_dev()
3717 skdev->name, __func__, __LINE__); in skd_unquiesce_dev()
3720 if (skdev->drive_state != FIT_SR_DRIVE_ONLINE) { in skd_unquiesce_dev()
3729 skdev->state = SKD_DRVR_STATE_BUSY; in skd_unquiesce_dev()
3731 skdev->name, __func__, __LINE__); in skd_unquiesce_dev()
3739 switch (skdev->state) { in skd_unquiesce_dev()
3749 skdev->state = SKD_DRVR_STATE_ONLINE; in skd_unquiesce_dev()
3751 skd_name(skdev), in skd_unquiesce_dev()
3753 prev_driver_state, skd_skdev_state_to_str(skdev->state), in skd_unquiesce_dev()
3754 skdev->state); in skd_unquiesce_dev()
3756 skdev->name, __func__, __LINE__); in skd_unquiesce_dev()
3758 skdev->name, __func__, __LINE__, skdev->name); in skd_unquiesce_dev()
3759 pr_info("(%s): STEC s1120 ONLINE\n", skd_name(skdev)); in skd_unquiesce_dev()
3760 blk_start_queue(skdev->queue); in skd_unquiesce_dev()
3761 skdev->gendisk_on = 1; in skd_unquiesce_dev()
3762 wake_up_interruptible(&skdev->waitq); in skd_unquiesce_dev()
3768 skdev->name, __func__, __LINE__, in skd_unquiesce_dev()
3769 skdev->state); in skd_unquiesce_dev()
3783 struct skd_device *skdev = skd_host_data; in skd_reserved_isr() local
3786 spin_lock_irqsave(&skdev->lock, flags); in skd_reserved_isr()
3788 skdev->name, __func__, __LINE__, in skd_reserved_isr()
3789 SKD_READL(skdev, FIT_INT_STATUS_HOST)); in skd_reserved_isr()
3790 pr_err("(%s): MSIX reserved irq %d = 0x%x\n", skd_name(skdev), in skd_reserved_isr()
3791 irq, SKD_READL(skdev, FIT_INT_STATUS_HOST)); in skd_reserved_isr()
3792 SKD_WRITEL(skdev, FIT_INT_RESERVED_MASK, FIT_INT_STATUS_HOST); in skd_reserved_isr()
3793 spin_unlock_irqrestore(&skdev->lock, flags); in skd_reserved_isr()
3799 struct skd_device *skdev = skd_host_data; in skd_statec_isr() local
3802 spin_lock_irqsave(&skdev->lock, flags); in skd_statec_isr()
3804 skdev->name, __func__, __LINE__, in skd_statec_isr()
3805 SKD_READL(skdev, FIT_INT_STATUS_HOST)); in skd_statec_isr()
3806 SKD_WRITEL(skdev, FIT_ISH_FW_STATE_CHANGE, FIT_INT_STATUS_HOST); in skd_statec_isr()
3807 skd_isr_fwstate(skdev); in skd_statec_isr()
3808 spin_unlock_irqrestore(&skdev->lock, flags); in skd_statec_isr()
3814 struct skd_device *skdev = skd_host_data; in skd_comp_q() local
3819 spin_lock_irqsave(&skdev->lock, flags); in skd_comp_q()
3821 skdev->name, __func__, __LINE__, in skd_comp_q()
3822 SKD_READL(skdev, FIT_INT_STATUS_HOST)); in skd_comp_q()
3823 SKD_WRITEL(skdev, FIT_ISH_COMPLETION_POSTED, FIT_INT_STATUS_HOST); in skd_comp_q()
3824 deferred = skd_isr_completion_posted(skdev, skd_isr_comp_limit, in skd_comp_q()
3827 skd_request_fn(skdev->queue); in skd_comp_q()
3830 schedule_work(&skdev->completion_worker); in skd_comp_q()
3832 skd_request_fn(skdev->queue); in skd_comp_q()
3834 spin_unlock_irqrestore(&skdev->lock, flags); in skd_comp_q()
3841 struct skd_device *skdev = skd_host_data; in skd_msg_isr() local
3844 spin_lock_irqsave(&skdev->lock, flags); in skd_msg_isr()
3846 skdev->name, __func__, __LINE__, in skd_msg_isr()
3847 SKD_READL(skdev, FIT_INT_STATUS_HOST)); in skd_msg_isr()
3848 SKD_WRITEL(skdev, FIT_ISH_MSG_FROM_DEV, FIT_INT_STATUS_HOST); in skd_msg_isr()
3849 skd_isr_msg_from_dev(skdev); in skd_msg_isr()
3850 spin_unlock_irqrestore(&skdev->lock, flags); in skd_msg_isr()
3856 struct skd_device *skdev = skd_host_data; in skd_qfull_isr() local
3859 spin_lock_irqsave(&skdev->lock, flags); in skd_qfull_isr()
3861 skdev->name, __func__, __LINE__, in skd_qfull_isr()
3862 SKD_READL(skdev, FIT_INT_STATUS_HOST)); in skd_qfull_isr()
3863 SKD_WRITEL(skdev, FIT_INT_QUEUE_FULL, FIT_INT_STATUS_HOST); in skd_qfull_isr()
3864 spin_unlock_irqrestore(&skdev->lock, flags); in skd_qfull_isr()
3907 static void skd_release_msix(struct skd_device *skdev) in skd_release_msix() argument
3912 if (skdev->msix_entries) { in skd_release_msix()
3913 for (i = 0; i < skdev->msix_count; i++) { in skd_release_msix()
3914 qentry = &skdev->msix_entries[i]; in skd_release_msix()
3915 skdev = qentry->rsp; in skd_release_msix()
3918 devm_free_irq(&skdev->pdev->dev, in skd_release_msix()
3922 kfree(skdev->msix_entries); in skd_release_msix()
3925 if (skdev->msix_count) in skd_release_msix()
3926 pci_disable_msix(skdev->pdev); in skd_release_msix()
3928 skdev->msix_count = 0; in skd_release_msix()
3929 skdev->msix_entries = NULL; in skd_release_msix()
3932 static int skd_acquire_msix(struct skd_device *skdev) in skd_acquire_msix() argument
3935 struct pci_dev *pdev = skdev->pdev; in skd_acquire_msix()
3950 skd_name(skdev), rc); in skd_acquire_msix()
3954 skdev->msix_count = SKD_MAX_MSIX_COUNT; in skd_acquire_msix()
3955 skdev->msix_entries = kzalloc(sizeof(struct skd_msix_entry) * in skd_acquire_msix()
3956 skdev->msix_count, GFP_KERNEL); in skd_acquire_msix()
3957 if (!skdev->msix_entries) { in skd_acquire_msix()
3960 skd_name(skdev)); in skd_acquire_msix()
3964 for (i = 0; i < skdev->msix_count; i++) { in skd_acquire_msix()
3965 qentry = &skdev->msix_entries[i]; in skd_acquire_msix()
3971 skdev->name, __func__, __LINE__, in skd_acquire_msix()
3972 pci_name(pdev), skdev->name, in skd_acquire_msix()
3977 for (i = 0; i < skdev->msix_count; i++) { in skd_acquire_msix()
3978 qentry = &skdev->msix_entries[i]; in skd_acquire_msix()
3980 "%s%d-msix %s", DRV_NAME, skdev->devno, in skd_acquire_msix()
3982 rc = devm_request_irq(&skdev->pdev->dev, qentry->vector, in skd_acquire_msix()
3984 qentry->isr_name, skdev); in skd_acquire_msix()
3988 skd_name(skdev), rc, i, qentry->isr_name); in skd_acquire_msix()
3992 qentry->rsp = skdev; in skd_acquire_msix()
3996 skdev->name, __func__, __LINE__, in skd_acquire_msix()
3997 pci_name(pdev), skdev->name, skdev->msix_count); in skd_acquire_msix()
4003 skd_release_msix(skdev); in skd_acquire_msix()
4007 static int skd_acquire_irq(struct skd_device *skdev) in skd_acquire_irq() argument
4012 pdev = skdev->pdev; in skd_acquire_irq()
4013 skdev->msix_count = 0; in skd_acquire_irq()
4016 switch (skdev->irq_type) { in skd_acquire_irq()
4018 rc = skd_acquire_msix(skdev); in skd_acquire_irq()
4021 skd_name(skdev), skdev->msix_count); in skd_acquire_irq()
4025 skd_name(skdev), rc); in skd_acquire_irq()
4026 skdev->irq_type = SKD_IRQ_MSI; in skd_acquire_irq()
4031 snprintf(skdev->isr_name, sizeof(skdev->isr_name), "%s%d-msi", in skd_acquire_irq()
4032 DRV_NAME, skdev->devno); in skd_acquire_irq()
4036 skdev->isr_name, skdev); in skd_acquire_irq()
4041 skd_name(skdev), rc); in skd_acquire_irq()
4045 skd_name(skdev), pdev->irq); in skd_acquire_irq()
4050 skd_name(skdev), rc); in skd_acquire_irq()
4051 skdev->irq_type = SKD_IRQ_LEGACY; in skd_acquire_irq()
4056 snprintf(skdev->isr_name, sizeof(skdev->isr_name), in skd_acquire_irq()
4057 "%s%d-legacy", DRV_NAME, skdev->devno); in skd_acquire_irq()
4059 IRQF_SHARED, skdev->isr_name, skdev); in skd_acquire_irq()
4062 skd_name(skdev), pdev->irq); in skd_acquire_irq()
4065 skd_name(skdev), rc); in skd_acquire_irq()
4069 skd_name(skdev), skdev->irq_type, SKD_IRQ_DEFAULT); in skd_acquire_irq()
4070 skdev->irq_type = SKD_IRQ_LEGACY; in skd_acquire_irq()
4076 static void skd_release_irq(struct skd_device *skdev) in skd_release_irq() argument
4078 switch (skdev->irq_type) { in skd_release_irq()
4080 skd_release_msix(skdev); in skd_release_irq()
4083 devm_free_irq(&skdev->pdev->dev, skdev->pdev->irq, skdev); in skd_release_irq()
4084 pci_disable_msi(skdev->pdev); in skd_release_irq()
4087 devm_free_irq(&skdev->pdev->dev, skdev->pdev->irq, skdev); in skd_release_irq()
4091 skd_name(skdev), skdev->irq_type); in skd_release_irq()
4102 static int skd_cons_skcomp(struct skd_device *skdev) in skd_cons_skcomp() argument
4112 skdev->name, __func__, __LINE__, in skd_cons_skcomp()
4115 skcomp = pci_zalloc_consistent(skdev->pdev, nbytes, in skd_cons_skcomp()
4116 &skdev->cq_dma_address); in skd_cons_skcomp()
4123 skdev->skcomp_table = skcomp; in skd_cons_skcomp()
4124 skdev->skerr_table = (struct fit_comp_error_info *)((char *)skcomp + in skd_cons_skcomp()
4132 static int skd_cons_skmsg(struct skd_device *skdev) in skd_cons_skmsg() argument
4138 skdev->name, __func__, __LINE__, in skd_cons_skmsg()
4140 skdev->num_fitmsg_context, in skd_cons_skmsg()
4141 sizeof(struct skd_fitmsg_context) * skdev->num_fitmsg_context); in skd_cons_skmsg()
4143 skdev->skmsg_table = kzalloc(sizeof(struct skd_fitmsg_context) in skd_cons_skmsg()
4144 *skdev->num_fitmsg_context, GFP_KERNEL); in skd_cons_skmsg()
4145 if (skdev->skmsg_table == NULL) { in skd_cons_skmsg()
4150 for (i = 0; i < skdev->num_fitmsg_context; i++) { in skd_cons_skmsg()
4153 skmsg = &skdev->skmsg_table[i]; in skd_cons_skmsg()
4158 skmsg->msg_buf = pci_alloc_consistent(skdev->pdev, in skd_cons_skmsg()
4180 skdev->skmsg_table[i - 1].next = NULL; in skd_cons_skmsg()
4181 skdev->skmsg_free_list = skdev->skmsg_table; in skd_cons_skmsg()
4187 static struct fit_sg_descriptor *skd_cons_sg_list(struct skd_device *skdev, in skd_cons_sg_list() argument
4196 sg_list = pci_alloc_consistent(skdev->pdev, nbytes, ret_dma_addr); in skd_cons_sg_list()
4216 static int skd_cons_skreq(struct skd_device *skdev) in skd_cons_skreq() argument
4222 skdev->name, __func__, __LINE__, in skd_cons_skreq()
4224 skdev->num_req_context, in skd_cons_skreq()
4225 sizeof(struct skd_request_context) * skdev->num_req_context); in skd_cons_skreq()
4227 skdev->skreq_table = kzalloc(sizeof(struct skd_request_context) in skd_cons_skreq()
4228 * skdev->num_req_context, GFP_KERNEL); in skd_cons_skreq()
4229 if (skdev->skreq_table == NULL) { in skd_cons_skreq()
4235 skdev->name, __func__, __LINE__, in skd_cons_skreq()
4236 skdev->sgs_per_request, sizeof(struct scatterlist), in skd_cons_skreq()
4237 skdev->sgs_per_request * sizeof(struct scatterlist)); in skd_cons_skreq()
4239 for (i = 0; i < skdev->num_req_context; i++) { in skd_cons_skreq()
4242 skreq = &skdev->skreq_table[i]; in skd_cons_skreq()
4248 skdev->sgs_per_request, GFP_KERNEL); in skd_cons_skreq()
4253 sg_init_table(skreq->sg, skdev->sgs_per_request); in skd_cons_skreq()
4255 skreq->sksg_list = skd_cons_sg_list(skdev, in skd_cons_skreq()
4256 skdev->sgs_per_request, in skd_cons_skreq()
4268 skdev->skreq_table[i - 1].next = NULL; in skd_cons_skreq()
4269 skdev->skreq_free_list = skdev->skreq_table; in skd_cons_skreq()
4275 static int skd_cons_skspcl(struct skd_device *skdev) in skd_cons_skspcl() argument
4281 skdev->name, __func__, __LINE__, in skd_cons_skspcl()
4283 skdev->n_special, in skd_cons_skspcl()
4284 sizeof(struct skd_special_context) * skdev->n_special); in skd_cons_skspcl()
4286 skdev->skspcl_table = kzalloc(sizeof(struct skd_special_context) in skd_cons_skspcl()
4287 * skdev->n_special, GFP_KERNEL); in skd_cons_skspcl()
4288 if (skdev->skspcl_table == NULL) { in skd_cons_skspcl()
4293 for (i = 0; i < skdev->n_special; i++) { in skd_cons_skspcl()
4296 skspcl = &skdev->skspcl_table[i]; in skd_cons_skspcl()
4306 pci_zalloc_consistent(skdev->pdev, nbytes, in skd_cons_skspcl()
4320 skspcl->req.sksg_list = skd_cons_sg_list(skdev, in skd_cons_skspcl()
4331 skdev->skspcl_table[i - 1].req.next = NULL; in skd_cons_skspcl()
4332 skdev->skspcl_free_list = skdev->skspcl_table; in skd_cons_skspcl()
4340 static int skd_cons_sksb(struct skd_device *skdev) in skd_cons_sksb() argument
4346 skspcl = &skdev->internal_skspcl; in skd_cons_sksb()
4353 skspcl->data_buf = pci_zalloc_consistent(skdev->pdev, nbytes, in skd_cons_sksb()
4361 skspcl->msg_buf = pci_zalloc_consistent(skdev->pdev, nbytes, in skd_cons_sksb()
4368 skspcl->req.sksg_list = skd_cons_sg_list(skdev, 1, in skd_cons_sksb()
4375 if (!skd_format_internal_skspcl(skdev)) { in skd_cons_sksb()
4384 static int skd_cons_disk(struct skd_device *skdev) in skd_cons_disk() argument
4397 skdev->disk = disk; in skd_cons_disk()
4398 sprintf(disk->disk_name, DRV_NAME "%u", skdev->devno); in skd_cons_disk()
4400 disk->major = skdev->major; in skd_cons_disk()
4401 disk->first_minor = skdev->devno * SKD_MINORS_PER_DEVICE; in skd_cons_disk()
4403 disk->private_data = skdev; in skd_cons_disk()
4405 q = blk_init_queue(skd_request_fn, &skdev->lock); in skd_cons_disk()
4411 skdev->queue = q; in skd_cons_disk()
4413 q->queuedata = skdev; in skd_cons_disk()
4416 blk_queue_max_segments(q, skdev->sgs_per_request); in skd_cons_disk()
4431 spin_lock_irqsave(&skdev->lock, flags); in skd_cons_disk()
4433 skdev->name, __func__, __LINE__, skdev->name); in skd_cons_disk()
4434 blk_stop_queue(skdev->queue); in skd_cons_disk()
4435 spin_unlock_irqrestore(&skdev->lock, flags); in skd_cons_disk()
4446 struct skd_device *skdev; in skd_construct() local
4450 skdev = kzalloc(sizeof(*skdev), GFP_KERNEL); in skd_construct()
4452 if (!skdev) { in skd_construct()
4458 skdev->state = SKD_DRVR_STATE_LOAD; in skd_construct()
4459 skdev->pdev = pdev; in skd_construct()
4460 skdev->devno = skd_next_devno++; in skd_construct()
4461 skdev->major = blk_major; in skd_construct()
4462 skdev->irq_type = skd_isr_type; in skd_construct()
4463 sprintf(skdev->name, DRV_NAME "%d", skdev->devno); in skd_construct()
4464 skdev->dev_max_queue_depth = 0; in skd_construct()
4466 skdev->num_req_context = skd_max_queue_depth; in skd_construct()
4467 skdev->num_fitmsg_context = skd_max_queue_depth; in skd_construct()
4468 skdev->n_special = skd_max_pass_thru; in skd_construct()
4469 skdev->cur_max_queue_depth = 1; in skd_construct()
4470 skdev->queue_low_water_mark = 1; in skd_construct()
4471 skdev->proto_ver = 99; in skd_construct()
4472 skdev->sgs_per_request = skd_sgs_per_request; in skd_construct()
4473 skdev->dbg_level = skd_dbg_level; in skd_construct()
4475 atomic_set(&skdev->device_count, 0); in skd_construct()
4477 spin_lock_init(&skdev->lock); in skd_construct()
4479 INIT_WORK(&skdev->completion_worker, skd_completion_worker); in skd_construct()
4481 pr_debug("%s:%s:%d skcomp\n", skdev->name, __func__, __LINE__); in skd_construct()
4482 rc = skd_cons_skcomp(skdev); in skd_construct()
4486 pr_debug("%s:%s:%d skmsg\n", skdev->name, __func__, __LINE__); in skd_construct()
4487 rc = skd_cons_skmsg(skdev); in skd_construct()
4491 pr_debug("%s:%s:%d skreq\n", skdev->name, __func__, __LINE__); in skd_construct()
4492 rc = skd_cons_skreq(skdev); in skd_construct()
4496 pr_debug("%s:%s:%d skspcl\n", skdev->name, __func__, __LINE__); in skd_construct()
4497 rc = skd_cons_skspcl(skdev); in skd_construct()
4501 pr_debug("%s:%s:%d sksb\n", skdev->name, __func__, __LINE__); in skd_construct()
4502 rc = skd_cons_sksb(skdev); in skd_construct()
4506 pr_debug("%s:%s:%d disk\n", skdev->name, __func__, __LINE__); in skd_construct()
4507 rc = skd_cons_disk(skdev); in skd_construct()
4511 pr_debug("%s:%s:%d VICTORY\n", skdev->name, __func__, __LINE__); in skd_construct()
4512 return skdev; in skd_construct()
4516 skdev->name, __func__, __LINE__); in skd_construct()
4517 skd_destruct(skdev); in skd_construct()
4527 static void skd_free_skcomp(struct skd_device *skdev) in skd_free_skcomp() argument
4529 if (skdev->skcomp_table != NULL) { in skd_free_skcomp()
4532 nbytes = sizeof(skdev->skcomp_table[0]) * in skd_free_skcomp()
4534 pci_free_consistent(skdev->pdev, nbytes, in skd_free_skcomp()
4535 skdev->skcomp_table, skdev->cq_dma_address); in skd_free_skcomp()
4538 skdev->skcomp_table = NULL; in skd_free_skcomp()
4539 skdev->cq_dma_address = 0; in skd_free_skcomp()
4542 static void skd_free_skmsg(struct skd_device *skdev) in skd_free_skmsg() argument
4546 if (skdev->skmsg_table == NULL) in skd_free_skmsg()
4549 for (i = 0; i < skdev->num_fitmsg_context; i++) { in skd_free_skmsg()
4552 skmsg = &skdev->skmsg_table[i]; in skd_free_skmsg()
4557 pci_free_consistent(skdev->pdev, SKD_N_FITMSG_BYTES, in skd_free_skmsg()
4565 kfree(skdev->skmsg_table); in skd_free_skmsg()
4566 skdev->skmsg_table = NULL; in skd_free_skmsg()
4569 static void skd_free_sg_list(struct skd_device *skdev, in skd_free_sg_list() argument
4578 pci_free_consistent(skdev->pdev, nbytes, sg_list, dma_addr); in skd_free_sg_list()
4582 static void skd_free_skreq(struct skd_device *skdev) in skd_free_skreq() argument
4586 if (skdev->skreq_table == NULL) in skd_free_skreq()
4589 for (i = 0; i < skdev->num_req_context; i++) { in skd_free_skreq()
4592 skreq = &skdev->skreq_table[i]; in skd_free_skreq()
4594 skd_free_sg_list(skdev, skreq->sksg_list, in skd_free_skreq()
4595 skdev->sgs_per_request, in skd_free_skreq()
4604 kfree(skdev->skreq_table); in skd_free_skreq()
4605 skdev->skreq_table = NULL; in skd_free_skreq()
4608 static void skd_free_skspcl(struct skd_device *skdev) in skd_free_skspcl() argument
4613 if (skdev->skspcl_table == NULL) in skd_free_skspcl()
4616 for (i = 0; i < skdev->n_special; i++) { in skd_free_skspcl()
4619 skspcl = &skdev->skspcl_table[i]; in skd_free_skspcl()
4623 pci_free_consistent(skdev->pdev, nbytes, in skd_free_skspcl()
4631 skd_free_sg_list(skdev, skspcl->req.sksg_list, in skd_free_skspcl()
4641 kfree(skdev->skspcl_table); in skd_free_skspcl()
4642 skdev->skspcl_table = NULL; in skd_free_skspcl()
4645 static void skd_free_sksb(struct skd_device *skdev) in skd_free_sksb() argument
4650 skspcl = &skdev->internal_skspcl; in skd_free_sksb()
4655 pci_free_consistent(skdev->pdev, nbytes, in skd_free_sksb()
4664 pci_free_consistent(skdev->pdev, nbytes, in skd_free_sksb()
4671 skd_free_sg_list(skdev, skspcl->req.sksg_list, 1, in skd_free_sksb()
4678 static void skd_free_disk(struct skd_device *skdev) in skd_free_disk() argument
4680 struct gendisk *disk = skdev->disk; in skd_free_disk()
4691 skdev->disk = NULL; in skd_free_disk()
4694 static void skd_destruct(struct skd_device *skdev) in skd_destruct() argument
4696 if (skdev == NULL) in skd_destruct()
4700 pr_debug("%s:%s:%d disk\n", skdev->name, __func__, __LINE__); in skd_destruct()
4701 skd_free_disk(skdev); in skd_destruct()
4703 pr_debug("%s:%s:%d sksb\n", skdev->name, __func__, __LINE__); in skd_destruct()
4704 skd_free_sksb(skdev); in skd_destruct()
4706 pr_debug("%s:%s:%d skspcl\n", skdev->name, __func__, __LINE__); in skd_destruct()
4707 skd_free_skspcl(skdev); in skd_destruct()
4709 pr_debug("%s:%s:%d skreq\n", skdev->name, __func__, __LINE__); in skd_destruct()
4710 skd_free_skreq(skdev); in skd_destruct()
4712 pr_debug("%s:%s:%d skmsg\n", skdev->name, __func__, __LINE__); in skd_destruct()
4713 skd_free_skmsg(skdev); in skd_destruct()
4715 pr_debug("%s:%s:%d skcomp\n", skdev->name, __func__, __LINE__); in skd_destruct()
4716 skd_free_skcomp(skdev); in skd_destruct()
4718 pr_debug("%s:%s:%d skdev\n", skdev->name, __func__, __LINE__); in skd_destruct()
4719 kfree(skdev); in skd_destruct()
4730 struct skd_device *skdev; in skd_bdev_getgeo() local
4733 skdev = bdev->bd_disk->private_data; in skd_bdev_getgeo()
4736 skdev->name, __func__, __LINE__, in skd_bdev_getgeo()
4739 if (skdev->read_cap_is_valid) { in skd_bdev_getgeo()
4740 capacity = get_capacity(skdev->disk); in skd_bdev_getgeo()
4750 static int skd_bdev_attach(struct skd_device *skdev) in skd_bdev_attach() argument
4752 pr_debug("%s:%s:%d add_disk\n", skdev->name, __func__, __LINE__); in skd_bdev_attach()
4753 add_disk(skdev->disk); in skd_bdev_attach()
4778 static char *skd_pci_info(struct skd_device *skdev, char *str) in skd_pci_info() argument
4783 pcie_reg = pci_find_capability(skdev->pdev, PCI_CAP_ID_EXP); in skd_pci_info()
4791 pci_read_config_word(skdev->pdev, pcie_reg, &pcie_lstat); in skd_pci_info()
4812 struct skd_device *skdev; in skd_pci_probe() local
4850 skdev = skd_construct(pdev); in skd_pci_probe()
4851 if (skdev == NULL) { in skd_pci_probe()
4856 skd_pci_info(skdev, pci_str); in skd_pci_probe()
4857 pr_info("(%s): %s 64bit\n", skd_name(skdev), pci_str); in skd_pci_probe()
4864 skd_name(skdev), rc); in skd_pci_probe()
4865 skdev->pcie_error_reporting_is_enabled = 0; in skd_pci_probe()
4867 skdev->pcie_error_reporting_is_enabled = 1; in skd_pci_probe()
4870 pci_set_drvdata(pdev, skdev); in skd_pci_probe()
4872 skdev->disk->driverfs_dev = &pdev->dev; in skd_pci_probe()
4875 skdev->mem_phys[i] = pci_resource_start(pdev, i); in skd_pci_probe()
4876 skdev->mem_size[i] = (u32)pci_resource_len(pdev, i); in skd_pci_probe()
4877 skdev->mem_map[i] = ioremap(skdev->mem_phys[i], in skd_pci_probe()
4878 skdev->mem_size[i]); in skd_pci_probe()
4879 if (!skdev->mem_map[i]) { in skd_pci_probe()
4881 skd_name(skdev)); in skd_pci_probe()
4886 skdev->name, __func__, __LINE__, in skd_pci_probe()
4887 skdev->mem_map[i], in skd_pci_probe()
4888 (uint64_t)skdev->mem_phys[i], skdev->mem_size[i]); in skd_pci_probe()
4891 rc = skd_acquire_irq(skdev); in skd_pci_probe()
4894 skd_name(skdev), rc); in skd_pci_probe()
4898 rc = skd_start_timer(skdev); in skd_pci_probe()
4902 init_waitqueue_head(&skdev->waitq); in skd_pci_probe()
4904 skd_start_device(skdev); in skd_pci_probe()
4906 rc = wait_event_interruptible_timeout(skdev->waitq, in skd_pci_probe()
4907 (skdev->gendisk_on), in skd_pci_probe()
4909 if (skdev->gendisk_on > 0) { in skd_pci_probe()
4911 skd_bdev_attach(skdev); in skd_pci_probe()
4918 skd_name(skdev), rc); in skd_pci_probe()
4927 if (skdev->irq_type == SKD_IRQ_MSIX) { in skd_pci_probe()
4929 vmklnx_scsi_register_poll_handler(skdev->scsi_host, in skd_pci_probe()
4930 skdev->msix_entries[5].vector, in skd_pci_probe()
4931 skd_comp_q, skdev); in skd_pci_probe()
4933 vmklnx_scsi_register_poll_handler(skdev->scsi_host, in skd_pci_probe()
4934 skdev->pdev->irq, skd_isr, in skd_pci_probe()
4935 skdev); in skd_pci_probe()
4942 skd_stop_device(skdev); in skd_pci_probe()
4943 skd_release_irq(skdev); in skd_pci_probe()
4947 if (skdev->mem_map[i]) in skd_pci_probe()
4948 iounmap(skdev->mem_map[i]); in skd_pci_probe()
4950 if (skdev->pcie_error_reporting_is_enabled) in skd_pci_probe()
4953 skd_destruct(skdev); in skd_pci_probe()
4967 struct skd_device *skdev; in skd_pci_remove() local
4969 skdev = pci_get_drvdata(pdev); in skd_pci_remove()
4970 if (!skdev) { in skd_pci_remove()
4974 skd_stop_device(skdev); in skd_pci_remove()
4975 skd_release_irq(skdev); in skd_pci_remove()
4978 if (skdev->mem_map[i]) in skd_pci_remove()
4979 iounmap((u32 *)skdev->mem_map[i]); in skd_pci_remove()
4981 if (skdev->pcie_error_reporting_is_enabled) in skd_pci_remove()
4984 skd_destruct(skdev); in skd_pci_remove()
4996 struct skd_device *skdev; in skd_pci_suspend() local
4998 skdev = pci_get_drvdata(pdev); in skd_pci_suspend()
4999 if (!skdev) { in skd_pci_suspend()
5004 skd_stop_device(skdev); in skd_pci_suspend()
5006 skd_release_irq(skdev); in skd_pci_suspend()
5009 if (skdev->mem_map[i]) in skd_pci_suspend()
5010 iounmap((u32 *)skdev->mem_map[i]); in skd_pci_suspend()
5012 if (skdev->pcie_error_reporting_is_enabled) in skd_pci_suspend()
5026 struct skd_device *skdev; in skd_pci_resume() local
5028 skdev = pci_get_drvdata(pdev); in skd_pci_resume()
5029 if (!skdev) { in skd_pci_resume()
5065 skdev->name, rc); in skd_pci_resume()
5066 skdev->pcie_error_reporting_is_enabled = 0; in skd_pci_resume()
5068 skdev->pcie_error_reporting_is_enabled = 1; in skd_pci_resume()
5072 skdev->mem_phys[i] = pci_resource_start(pdev, i); in skd_pci_resume()
5073 skdev->mem_size[i] = (u32)pci_resource_len(pdev, i); in skd_pci_resume()
5074 skdev->mem_map[i] = ioremap(skdev->mem_phys[i], in skd_pci_resume()
5075 skdev->mem_size[i]); in skd_pci_resume()
5076 if (!skdev->mem_map[i]) { in skd_pci_resume()
5078 skd_name(skdev)); in skd_pci_resume()
5083 skdev->name, __func__, __LINE__, in skd_pci_resume()
5084 skdev->mem_map[i], in skd_pci_resume()
5085 (uint64_t)skdev->mem_phys[i], skdev->mem_size[i]); in skd_pci_resume()
5087 rc = skd_acquire_irq(skdev); in skd_pci_resume()
5095 rc = skd_start_timer(skdev); in skd_pci_resume()
5099 init_waitqueue_head(&skdev->waitq); in skd_pci_resume()
5101 skd_start_device(skdev); in skd_pci_resume()
5106 skd_stop_device(skdev); in skd_pci_resume()
5107 skd_release_irq(skdev); in skd_pci_resume()
5111 if (skdev->mem_map[i]) in skd_pci_resume()
5112 iounmap(skdev->mem_map[i]); in skd_pci_resume()
5114 if (skdev->pcie_error_reporting_is_enabled) in skd_pci_resume()
5127 struct skd_device *skdev; in skd_pci_shutdown() local
5131 skdev = pci_get_drvdata(pdev); in skd_pci_shutdown()
5132 if (!skdev) { in skd_pci_shutdown()
5137 pr_err("%s: calling stop\n", skd_name(skdev)); in skd_pci_shutdown()
5138 skd_stop_device(skdev); in skd_pci_shutdown()
5157 static const char *skd_name(struct skd_device *skdev) in skd_name() argument
5159 memset(skdev->id_str, 0, sizeof(skdev->id_str)); in skd_name()
5161 if (skdev->inquiry_is_valid) in skd_name()
5162 snprintf(skdev->id_str, sizeof(skdev->id_str), "%s:%s:[%s]", in skd_name()
5163 skdev->name, skdev->inq_serial_num, in skd_name()
5164 pci_name(skdev->pdev)); in skd_name()
5166 snprintf(skdev->id_str, sizeof(skdev->id_str), "%s:??:[%s]", in skd_name()
5167 skdev->name, pci_name(skdev->pdev)); in skd_name()
5169 return skdev->id_str; in skd_name()
5283 static void skd_log_skdev(struct skd_device *skdev, const char *event) in skd_log_skdev() argument
5286 skdev->name, __func__, __LINE__, skdev->name, skdev, event); in skd_log_skdev()
5288 skdev->name, __func__, __LINE__, in skd_log_skdev()
5289 skd_drive_state_to_str(skdev->drive_state), skdev->drive_state, in skd_log_skdev()
5290 skd_skdev_state_to_str(skdev->state), skdev->state); in skd_log_skdev()
5292 skdev->name, __func__, __LINE__, in skd_log_skdev()
5293 skdev->in_flight, skdev->cur_max_queue_depth, in skd_log_skdev()
5294 skdev->dev_max_queue_depth, skdev->queue_low_water_mark); in skd_log_skdev()
5296 skdev->name, __func__, __LINE__, in skd_log_skdev()
5297 skdev->timeout_stamp, skdev->skcomp_cycle, skdev->skcomp_ix); in skd_log_skdev()
5300 static void skd_log_skmsg(struct skd_device *skdev, in skd_log_skmsg() argument
5304 skdev->name, __func__, __LINE__, skdev->name, skmsg, event); in skd_log_skmsg()
5306 skdev->name, __func__, __LINE__, in skd_log_skmsg()
5311 static void skd_log_skreq(struct skd_device *skdev, in skd_log_skreq() argument
5315 skdev->name, __func__, __LINE__, skdev->name, skreq, event); in skd_log_skreq()
5317 skdev->name, __func__, __LINE__, in skd_log_skreq()
5321 skdev->name, __func__, __LINE__, in skd_log_skreq()
5331 skdev->name, __func__, __LINE__, in skd_log_skreq()
5336 skdev->name, __func__, __LINE__); in skd_log_skreq()