Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[SCSI] mvsas: misc improvements

Change code to match HBA datasheet.
Change code to make it readable.
Add support big endian for mvs_prd_imt.
Add cpu_to_le32 and cpu_to_le64 to use on addr.
Add scan_finished for structure mvs_prv_info.

Signed-off-by: Xiangliang Yu <yuxiangl@marvell.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>

authored by

Xiangliang Yu and committed by
James Bottomley
84fbd0ce a4632aae

+127 -113
+15 -13
drivers/scsi/mvsas/mv_64xx.c
··· 58 58 static void __devinit mvs_64xx_phy_hacks(struct mvs_info *mvi) 59 59 { 60 60 void __iomem *regs = mvi->regs; 61 + int i; 61 62 62 63 mvs_phy_hacks(mvi); 63 64 64 65 if (!(mvi->flags & MVF_FLAG_SOC)) { 65 66 /* TEST - for phy decoding error, adjust voltage levels */ 66 - mw32(MVS_P0_VSR_ADDR + 0, 0x8); 67 - mw32(MVS_P0_VSR_DATA + 0, 0x2F0); 68 - 69 - mw32(MVS_P0_VSR_ADDR + 8, 0x8); 70 - mw32(MVS_P0_VSR_DATA + 8, 0x2F0); 71 - 72 - mw32(MVS_P0_VSR_ADDR + 16, 0x8); 73 - mw32(MVS_P0_VSR_DATA + 16, 0x2F0); 74 - 75 - mw32(MVS_P0_VSR_ADDR + 24, 0x8); 76 - mw32(MVS_P0_VSR_DATA + 24, 0x2F0); 67 + for (i = 0; i < MVS_SOC_PORTS; i++) { 68 + mvs_write_port_vsr_addr(mvi, i, VSR_PHY_MODE8); 69 + mvs_write_port_vsr_data(mvi, i, 0x2F0); 70 + } 77 71 } else { 78 - int i; 79 72 /* disable auto port detection */ 80 73 mw32(MVS_GBL_PORT_TYPE, 0); 81 74 for (i = 0; i < mvi->chip->n_phy; i++) { ··· 314 321 /* init phys */ 315 322 mvs_64xx_phy_hacks(mvi); 316 323 324 + tmp = mvs_cr32(mvi, CMD_PHY_MODE_21); 325 + tmp &= 0x0000ffff; 326 + tmp |= 0x00fa0000; 327 + mvs_cw32(mvi, CMD_PHY_MODE_21, tmp); 328 + 317 329 /* enable auto port detection */ 318 330 mw32(MVS_GBL_PORT_TYPE, MODE_AUTO_DET_EN); 319 331 ··· 392 394 /* reset CMD queue */ 393 395 tmp = mr32(MVS_PCS); 394 396 tmp |= PCS_CMD_RST; 397 + tmp &= ~PCS_SELF_CLEAR; 395 398 mw32(MVS_PCS, tmp); 396 399 /* interrupt coalescing may cause missing HW interrput in some case, 397 400 * and the max count is 0x1ff, while our max slot is 0x200, 398 401 * it will make count 0. 399 402 */ 400 403 tmp = 0; 401 - mw32(MVS_INT_COAL, tmp); 404 + if (MVS_CHIP_SLOT_SZ > 0x1ff) 405 + mw32(MVS_INT_COAL, 0x1ff | COAL_EN); 406 + else 407 + mw32(MVS_INT_COAL, MVS_CHIP_SLOT_SZ | COAL_EN); 402 408 403 409 tmp = 0x10000 | interrupt_coalescing; 404 410 mw32(MVS_INT_COAL_TMOUT, tmp);
+45 -27
drivers/scsi/mvsas/mv_94xx.c
··· 271 271 static void mvs_94xx_phy_reset(struct mvs_info *mvi, u32 phy_id, int hard) 272 272 { 273 273 u32 tmp; 274 - 274 + u32 delay = 5000; 275 + if (hard == MVS_PHY_TUNE) { 276 + mvs_write_port_cfg_addr(mvi, phy_id, PHYR_SATA_CTL); 277 + tmp = mvs_read_port_cfg_data(mvi, phy_id); 278 + mvs_write_port_cfg_data(mvi, phy_id, tmp|0x20000000); 279 + mvs_write_port_cfg_data(mvi, phy_id, tmp|0x100000); 280 + return; 281 + } 275 282 tmp = mvs_read_port_irq_stat(mvi, phy_id); 276 283 tmp &= ~PHYEV_RDY_CH; 277 284 mvs_write_port_irq_stat(mvi, phy_id, tmp); ··· 288 281 mvs_write_phy_ctl(mvi, phy_id, tmp); 289 282 do { 290 283 tmp = mvs_read_phy_ctl(mvi, phy_id); 291 - } while (tmp & PHY_RST_HARD); 284 + udelay(10); 285 + delay--; 286 + } while ((tmp & PHY_RST_HARD) && delay); 287 + if (!delay) 288 + mv_dprintk("phy hard reset failed.\n"); 292 289 } else { 293 - mvs_write_port_vsr_addr(mvi, phy_id, VSR_PHY_STAT); 294 - tmp = mvs_read_port_vsr_data(mvi, phy_id); 290 + tmp = mvs_read_phy_ctl(mvi, phy_id); 295 291 tmp |= PHY_RST; 296 - mvs_write_port_vsr_data(mvi, phy_id, tmp); 292 + mvs_write_phy_ctl(mvi, phy_id, tmp); 297 293 } 298 294 } 299 295 ··· 423 413 mvs_94xx_phy_disable(mvi, i); 424 414 /* set phy local SAS address */ 425 415 mvs_set_sas_addr(mvi, i, CONFIG_ID_FRAME3, CONFIG_ID_FRAME4, 426 - (mvi->phy[i].dev_sas_addr)); 416 + cpu_to_le64(mvi->phy[i].dev_sas_addr)); 427 417 428 418 mvs_94xx_enable_xmt(mvi, i); 429 419 mvs_94xx_config_reg_from_hba(mvi, i); ··· 469 459 */ 470 460 cctl = mr32(MVS_CTL); 471 461 cctl |= CCTL_ENDIAN_CMD; 472 - cctl |= CCTL_ENDIAN_DATA; 473 462 cctl &= ~CCTL_ENDIAN_OPEN; 474 463 cctl |= CCTL_ENDIAN_RSP; 475 464 mw32_f(MVS_CTL, cctl); ··· 476 467 /* reset CMD queue */ 477 468 tmp = mr32(MVS_PCS); 478 469 tmp |= PCS_CMD_RST; 470 + tmp &= ~PCS_SELF_CLEAR; 479 471 mw32(MVS_PCS, tmp); 480 472 /* interrupt coalescing may cause missing HW interrput in some case, 481 473 * and the max count is 0x1ff, while our max slot is 0x200, 482 474 * it will make count 0. 483 475 */ 484 476 tmp = 0; 485 - mw32(MVS_INT_COAL, tmp); 477 + if (MVS_CHIP_SLOT_SZ > 0x1ff) 478 + mw32(MVS_INT_COAL, 0x1ff | COAL_EN); 479 + else 480 + mw32(MVS_INT_COAL, MVS_CHIP_SLOT_SZ | COAL_EN); 486 481 487 482 tmp = 0x10000 | interrupt_coalescing; 488 483 mw32(MVS_INT_COAL_TMOUT, tmp); ··· 687 674 static void mvs_94xx_free_reg_set(struct mvs_info *mvi, u8 *tfs) 688 675 { 689 676 void __iomem *regs = mvi->regs; 690 - u32 tmp; 691 677 u8 reg_set = *tfs; 692 678 693 679 if (*tfs == MVS_ID_NOT_MAPPED) 694 680 return; 695 681 696 682 mvi->sata_reg_set &= ~bit(reg_set); 697 - if (reg_set < 32) { 683 + if (reg_set < 32) 698 684 w_reg_set_enable(reg_set, (u32)mvi->sata_reg_set); 699 - tmp = mr32(MVS_INT_STAT_SRS_0) & (u32)mvi->sata_reg_set; 700 - if (tmp) 701 - mw32(MVS_INT_STAT_SRS_0, tmp); 702 - } else { 703 - w_reg_set_enable(reg_set, mvi->sata_reg_set); 704 - tmp = mr32(MVS_INT_STAT_SRS_1) & mvi->sata_reg_set; 705 - if (tmp) 706 - mw32(MVS_INT_STAT_SRS_1, tmp); 707 - } 685 + else 686 + w_reg_set_enable(reg_set, (u32)(mvi->sata_reg_set >> 32)); 708 687 709 688 *tfs = MVS_ID_NOT_MAPPED; 710 689 ··· 712 707 return 0; 713 708 714 709 i = mv_ffc64(mvi->sata_reg_set); 715 - if (i > 32) { 710 + if (i >= 32) { 716 711 mvi->sata_reg_set |= bit(i); 717 712 w_reg_set_enable(i, (u32)(mvi->sata_reg_set >> 32)); 718 713 *tfs = i; ··· 731 726 int i; 732 727 struct scatterlist *sg; 733 728 struct mvs_prd *buf_prd = prd; 729 + struct mvs_prd_imt im_len; 730 + *(u32 *)&im_len = 0; 734 731 for_each_sg(scatter, sg, nr, i) { 735 732 buf_prd->addr = cpu_to_le64(sg_dma_address(sg)); 736 - buf_prd->im_len.len = cpu_to_le32(sg_dma_len(sg)); 733 + im_len.len = sg_dma_len(sg); 734 + buf_prd->im_len = cpu_to_le32(*(u32 *)&im_len); 737 735 buf_prd++; 738 736 } 739 737 } ··· 759 751 for (i = 0; i < 7; i++) { 760 752 mvs_write_port_cfg_addr(mvi, port_id, 761 753 CONFIG_ID_FRAME0 + i * 4); 762 - id_frame[i] = mvs_read_port_cfg_data(mvi, port_id); 754 + id_frame[i] = cpu_to_le32(mvs_read_port_cfg_data(mvi, port_id)); 763 755 } 764 756 memcpy(id, id_frame, 28); 765 757 } ··· 774 766 for (i = 0; i < 7; i++) { 775 767 mvs_write_port_cfg_addr(mvi, port_id, 776 768 CONFIG_ATT_ID_FRAME0 + i * 4); 777 - id_frame[i] = mvs_read_port_cfg_data(mvi, port_id); 769 + id_frame[i] = cpu_to_le32(mvs_read_port_cfg_data(mvi, port_id)); 778 770 mv_dprintk("94xx phy %d atta frame %d %x.\n", 779 771 port_id + mvi->id * mvi->chip->n_phy, i, id_frame[i]); 780 772 } ··· 932 924 int i; 933 925 struct mvs_prd *buf_prd = prd; 934 926 dma_addr_t buf_dma; 927 + struct mvs_prd_imt im_len; 928 + 929 + *(u32 *)&im_len = 0; 935 930 buf_prd += from; 936 931 932 + #define PRD_CHAINED_ENTRY 0x01 937 933 if ((mvi->pdev->revision == VANIR_A0_REV) || 938 934 (mvi->pdev->revision == VANIR_B0_REV)) 939 935 buf_dma = (phy_mask <= 0x08) ? ··· 945 933 else 946 934 return; 947 935 948 - for (i = 0; i < MAX_SG_ENTRY - from; i++) { 949 - buf_prd->addr = cpu_to_le64(buf_dma); 950 - buf_prd->im_len.len = cpu_to_le32(buf_len); 951 - ++buf_prd; 936 + for (i = from; i < MAX_SG_ENTRY; i++, ++buf_prd) { 937 + if (i == MAX_SG_ENTRY - 1) { 938 + buf_prd->addr = cpu_to_le64(virt_to_phys(buf_prd - 1)); 939 + im_len.len = 2; 940 + im_len.misc_ctl = PRD_CHAINED_ENTRY; 941 + } else { 942 + buf_prd->addr = cpu_to_le64(buf_dma); 943 + im_len.len = buf_len; 944 + } 945 + buf_prd->im_len = cpu_to_le32(*(u32 *)&im_len); 952 946 } 953 947 } 954 948
+10 -3
drivers/scsi/mvsas/mv_94xx.h
··· 142 142 143 143 enum chip_register_bits { 144 144 PHY_MIN_SPP_PHYS_LINK_RATE_MASK = (0x7 << 8), 145 - PHY_MAX_SPP_PHYS_LINK_RATE_MASK = (0x7 << 8), 146 - PHY_NEG_SPP_PHYS_LINK_RATE_MASK_OFFSET = (12), 145 + PHY_MAX_SPP_PHYS_LINK_RATE_MASK = (0x7 << 12), 146 + PHY_NEG_SPP_PHYS_LINK_RATE_MASK_OFFSET = (16), 147 147 PHY_NEG_SPP_PHYS_LINK_RATE_MASK = 148 148 (0x3 << PHY_NEG_SPP_PHYS_LINK_RATE_MASK_OFFSET), 149 149 }; ··· 219 219 #define MAX_SG_ENTRY 255 220 220 221 221 struct mvs_prd_imt { 222 + #ifndef __BIG_ENDIAN 222 223 __le32 len:22; 223 224 u8 _r_a:2; 224 225 u8 misc_ctl:4; 225 226 u8 inter_sel:4; 227 + #else 228 + u32 inter_sel:4; 229 + u32 misc_ctl:4; 230 + u32 _r_a:2; 231 + u32 len:22; 232 + #endif 226 233 }; 227 234 228 235 struct mvs_prd { 229 236 /* 64-bit buffer address */ 230 237 __le64 addr; 231 238 /* 22-bit length */ 232 - struct mvs_prd_imt im_len; 239 + __le32 im_len; 233 240 } __attribute__ ((packed)); 234 241 235 242 /*
-12
drivers/scsi/mvsas/mv_chips.h
··· 184 184 185 185 /* not to halt for different port op during wideport link change */ 186 186 mvs_cw32(mvi, CMD_APP_ERR_CONFIG, 0xffefbf7d); 187 - 188 - /* workaround for Seagate disk not-found OOB sequence, recv 189 - * COMINIT before sending out COMWAKE */ 190 - tmp = mvs_cr32(mvi, CMD_PHY_MODE_21); 191 - tmp &= 0x0000ffff; 192 - tmp |= 0x00fa0000; 193 - mvs_cw32(mvi, CMD_PHY_MODE_21, tmp); 194 - 195 - tmp = mvs_cr32(mvi, CMD_PHY_TIMER); 196 - tmp &= 0x1fffffff; 197 - tmp |= (2U << 29); /* 8 ms retry */ 198 - mvs_cw32(mvi, CMD_PHY_TIMER, tmp); 199 187 } 200 188 201 189 static inline void mvs_int_sata(struct mvs_info *mvi)
+2 -1
drivers/scsi/mvsas/mv_init.c
··· 104 104 struct asd_sas_phy *sas_phy = &phy->sas_phy; 105 105 106 106 phy->mvi = mvi; 107 + phy->port = NULL; 107 108 init_timer(&phy->timer); 108 109 sas_phy->enabled = (phy_id < mvi->chip->n_phy) ? 1 : 0; 109 110 sas_phy->class = SAS; ··· 367 366 const struct pci_device_id *ent, 368 367 struct Scsi_Host *shost, unsigned int id) 369 368 { 370 - struct mvs_info *mvi; 369 + struct mvs_info *mvi = NULL; 371 370 struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost); 372 371 373 372 mvi = kzalloc(sizeof(*mvi) +
+53 -56
drivers/scsi/mvsas/mv_sas.c
··· 300 300 301 301 if (ret) 302 302 return ret; 303 - if (dev_is_sata(dev)) { 303 + if (!dev_is_sata(dev)) { 304 + sas_change_queue_depth(sdev, 305 + MVS_QUEUE_SIZE, 306 + SCSI_QDEPTH_DEFAULT); 304 307 } 305 308 return 0; 306 309 } ··· 314 311 unsigned short core_nr; 315 312 struct mvs_info *mvi; 316 313 struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost); 314 + struct mvs_prv_info *mvs_prv = sha->lldd_ha; 317 315 318 316 core_nr = ((struct mvs_prv_info *)sha->lldd_ha)->n_host; 319 317 ··· 323 319 for (i = 0; i < mvi->chip->n_phy; ++i) 324 320 mvs_bytes_dmaed(mvi, i); 325 321 } 322 + mvs_prv->scan_finished = 1; 326 323 } 327 324 328 325 int mvs_scan_finished(struct Scsi_Host *shost, unsigned long time) 329 326 { 330 - /* give the phy enabling interrupt event time to come in (1s 331 - * is empirically about all it takes) */ 332 - if (time < HZ) 327 + struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost); 328 + struct mvs_prv_info *mvs_prv = sha->lldd_ha; 329 + 330 + if (mvs_prv->scan_finished == 0) 333 331 return 0; 334 - /* Wait for discovery to finish */ 332 + 335 333 scsi_flush_work(shost); 336 334 return 1; 337 335 } ··· 631 625 } 632 626 if (is_tmf) 633 627 flags |= (MCH_SSP_FR_TASK << MCH_SSP_FR_TYPE_SHIFT); 628 + else 629 + flags |= (MCH_SSP_FR_CMD << MCH_SSP_FR_TYPE_SHIFT); 630 + 634 631 hdr->flags = cpu_to_le32(flags | (tei->n_elem << MCH_PRD_LEN_SHIFT)); 635 632 hdr->tags = cpu_to_le32(tag); 636 633 hdr->data_len = cpu_to_le32(task->total_xfer_len); ··· 1058 1049 mvs_slot_free(mvi, slot_idx); 1059 1050 } 1060 1051 1061 - static void mvs_update_wideport(struct mvs_info *mvi, int i) 1052 + static void mvs_update_wideport(struct mvs_info *mvi, int phy_no) 1062 1053 { 1063 - struct mvs_phy *phy = &mvi->phy[i]; 1054 + struct mvs_phy *phy = &mvi->phy[phy_no]; 1064 1055 struct mvs_port *port = phy->port; 1065 1056 int j, no; 1066 1057 ··· 1115 1106 return NULL; 1116 1107 1117 1108 MVS_CHIP_DISP->write_port_cfg_addr(mvi, i, PHYR_SATA_SIG3); 1118 - s[3] = MVS_CHIP_DISP->read_port_cfg_data(mvi, i); 1109 + s[3] = cpu_to_le32(MVS_CHIP_DISP->read_port_cfg_data(mvi, i)); 1119 1110 1120 1111 MVS_CHIP_DISP->write_port_cfg_addr(mvi, i, PHYR_SATA_SIG2); 1121 - s[2] = MVS_CHIP_DISP->read_port_cfg_data(mvi, i); 1112 + s[2] = cpu_to_le32(MVS_CHIP_DISP->read_port_cfg_data(mvi, i)); 1122 1113 1123 1114 MVS_CHIP_DISP->write_port_cfg_addr(mvi, i, PHYR_SATA_SIG1); 1124 - s[1] = MVS_CHIP_DISP->read_port_cfg_data(mvi, i); 1115 + s[1] = cpu_to_le32(MVS_CHIP_DISP->read_port_cfg_data(mvi, i)); 1125 1116 1126 1117 MVS_CHIP_DISP->write_port_cfg_addr(mvi, i, PHYR_SATA_SIG0); 1127 - s[0] = MVS_CHIP_DISP->read_port_cfg_data(mvi, i); 1118 + s[0] = cpu_to_le32(MVS_CHIP_DISP->read_port_cfg_data(mvi, i)); 1128 1119 1129 1120 /* Workaround: take some ATAPI devices for ATA */ 1130 1121 if (((s[1] & 0x00FFFFFF) == 0x00EB1401) && (*(u8 *)&s[3] == 0x01)) ··· 1210 1201 if (MVS_CHIP_DISP->phy_work_around) 1211 1202 MVS_CHIP_DISP->phy_work_around(mvi, i); 1212 1203 } 1213 - mv_dprintk("port %d attach dev info is %x\n", 1204 + mv_dprintk("phy %d attach dev info is %x\n", 1214 1205 i + mvi->id * mvi->chip->n_phy, phy->att_dev_info); 1215 - mv_dprintk("port %d attach sas addr is %llx\n", 1206 + mv_dprintk("phy %d attach sas addr is %llx\n", 1216 1207 i + mvi->id * mvi->chip->n_phy, phy->att_dev_sas_addr); 1217 1208 out_done: 1218 1209 if (get_st) ··· 1237 1228 } 1238 1229 hi = i/((struct mvs_prv_info *)sas_ha->lldd_ha)->n_phy; 1239 1230 mvi = ((struct mvs_prv_info *)sas_ha->lldd_ha)->mvi[hi]; 1240 - if (sas_port->id >= mvi->chip->n_phy) 1241 - port = &mvi->port[sas_port->id - mvi->chip->n_phy]; 1231 + if (i >= mvi->chip->n_phy) 1232 + port = &mvi->port[i - mvi->chip->n_phy]; 1242 1233 else 1243 - port = &mvi->port[sas_port->id]; 1234 + port = &mvi->port[i]; 1244 1235 if (lock) 1245 1236 spin_lock_irqsave(&mvi->lock, flags); 1246 1237 port->port_attached = 1; ··· 1269 1260 return; 1270 1261 } 1271 1262 list_for_each_entry(dev, &port->dev_list, dev_list_node) 1272 - mvs_do_release_task(phy->mvi, phy_no, NULL); 1263 + mvs_do_release_task(phy->mvi, phy_no, dev); 1273 1264 1274 1265 } 1275 1266 ··· 1333 1324 mvi_device->dev_status = MVS_DEV_NORMAL; 1334 1325 mvi_device->dev_type = dev->dev_type; 1335 1326 mvi_device->mvi_info = mvi; 1327 + mvi_device->sas_device = dev; 1336 1328 if (parent_dev && DEV_IS_EXPANDER(parent_dev->dev_type)) { 1337 1329 int phy_id; 1338 1330 u8 phy_num = parent_dev->ex_dev.num_phys; ··· 1385 1375 mv_dprintk("found dev has gone.\n"); 1386 1376 } 1387 1377 dev->lldd_dev = NULL; 1378 + mvi_dev->sas_device = NULL; 1388 1379 1389 1380 spin_unlock_irqrestore(&mvi->lock, flags); 1390 1381 } ··· 1466 1455 } 1467 1456 1468 1457 wait_for_completion(&task->completion); 1469 - res = -TMF_RESP_FUNC_FAILED; 1458 + res = TMF_RESP_FUNC_FAILED; 1470 1459 /* Even TMF timed out, return direct. */ 1471 1460 if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { 1472 1461 if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { ··· 1516 1505 u8 *lun, struct mvs_tmf_task *tmf) 1517 1506 { 1518 1507 struct sas_ssp_task ssp_task; 1519 - DECLARE_COMPLETION_ONSTACK(completion); 1520 1508 if (!(dev->tproto & SAS_PROTOCOL_SSP)) 1521 1509 return TMF_RESP_FUNC_ESUPP; 1522 1510 1523 - strncpy((u8 *)&ssp_task.LUN, lun, 8); 1511 + memcpy(ssp_task.LUN, lun, 8); 1524 1512 1525 1513 return mvs_exec_internal_tmf_task(dev, &ssp_task, 1526 1514 sizeof(ssp_task), tmf); ··· 1543 1533 int mvs_lu_reset(struct domain_device *dev, u8 *lun) 1544 1534 { 1545 1535 unsigned long flags; 1546 - int i, phyno[WIDE_PORT_MAX_PHY], num , rc = TMF_RESP_FUNC_FAILED; 1536 + int rc = TMF_RESP_FUNC_FAILED; 1547 1537 struct mvs_tmf_task tmf_task; 1548 1538 struct mvs_device * mvi_dev = dev->lldd_dev; 1549 1539 struct mvs_info *mvi = mvi_dev->mvi_info; ··· 1552 1542 mvi_dev->dev_status = MVS_DEV_EH; 1553 1543 rc = mvs_debug_issue_ssp_tmf(dev, lun, &tmf_task); 1554 1544 if (rc == TMF_RESP_FUNC_COMPLETE) { 1555 - num = mvs_find_dev_phyno(dev, phyno); 1556 1545 spin_lock_irqsave(&mvi->lock, flags); 1557 - for (i = 0; i < num; i++) 1558 - mvs_release_task(mvi, dev); 1546 + mvs_release_task(mvi, dev); 1559 1547 spin_unlock_irqrestore(&mvi->lock, flags); 1560 1548 } 1561 1549 /* If failed, fall-through I_T_Nexus reset */ ··· 1571 1563 1572 1564 if (mvi_dev->dev_status != MVS_DEV_EH) 1573 1565 return TMF_RESP_FUNC_COMPLETE; 1566 + else 1567 + mvi_dev->dev_status = MVS_DEV_NORMAL; 1574 1568 rc = mvs_debug_I_T_nexus_reset(dev); 1575 1569 mv_printk("%s for device[%x]:rc= %d\n", 1576 1570 __func__, mvi_dev->device_id, rc); ··· 1616 1606 case TMF_RESP_FUNC_FAILED: 1617 1607 case TMF_RESP_FUNC_COMPLETE: 1618 1608 break; 1619 - default: 1620 - rc = TMF_RESP_FUNC_COMPLETE; 1621 - break; 1622 1609 } 1623 1610 } 1624 1611 mv_printk("%s:rc= %d\n", __func__, rc); ··· 1635 1628 u32 tag; 1636 1629 1637 1630 if (!mvi_dev) { 1638 - mv_printk("%s:%d TMF_RESP_FUNC_FAILED\n", __func__, __LINE__); 1639 - rc = TMF_RESP_FUNC_FAILED; 1631 + mv_printk("Device has removed\n"); 1632 + return TMF_RESP_FUNC_FAILED; 1640 1633 } 1641 1634 1642 1635 mvi = mvi_dev->mvi_info; ··· 1684 1677 /* to do free register_set */ 1685 1678 if (SATA_DEV == dev->dev_type) { 1686 1679 struct mvs_slot_info *slot = task->lldd_task; 1687 - struct task_status_struct *tstat; 1688 1680 u32 slot_idx = (u32)(slot - mvi->slot_info); 1689 - tstat = &task->task_status; 1690 - mv_dprintk(KERN_DEBUG "mv_abort_task() mvi=%p task=%p " 1681 + mv_dprintk("mvs_abort_task() mvi=%p task=%p " 1691 1682 "slot=%p slot_idx=x%x\n", 1692 1683 mvi, task, slot, slot_idx); 1693 - tstat->stat = SAS_ABORTED_TASK; 1694 - if (mvi_dev && mvi_dev->running_req) 1695 - mvi_dev->running_req--; 1696 - if (sas_protocol_ata(task->task_proto)) 1697 - mvs_free_reg_set(mvi, mvi_dev); 1684 + mvs_tmf_timedout((unsigned long)task); 1698 1685 mvs_slot_task_free(mvi, task, slot, slot_idx); 1699 - return -1; 1686 + rc = TMF_RESP_FUNC_COMPLETE; 1687 + goto out; 1700 1688 } 1701 - } else { 1702 - /* SMP */ 1703 1689 1704 1690 } 1705 1691 out: ··· 1813 1813 { 1814 1814 struct mvs_slot_info *slot = &mvi->slot_info[slot_idx]; 1815 1815 int stat; 1816 - u32 err_dw0 = le32_to_cpu(*(u32 *) (slot->response)); 1816 + u32 err_dw0 = le32_to_cpu(*(u32 *)slot->response); 1817 1817 u32 err_dw1 = le32_to_cpu(*((u32 *)slot->response + 1)); 1818 1818 u32 tfs = 0; 1819 1819 enum mvs_port_type type = PORT_TYPE_SAS; ··· 1847 1847 case SAS_PROTOCOL_STP: 1848 1848 case SAS_PROTOCOL_SATA | SAS_PROTOCOL_STP: 1849 1849 { 1850 - if (err_dw0 == 0x80400002) 1851 - mv_printk("find reserved error, why?\n"); 1852 - 1853 1850 task->ata_task.use_ncq = 0; 1851 + stat = SAS_PROTO_RESPONSE; 1854 1852 mvs_sata_done(mvi, task, slot_idx, err_dw0); 1855 1853 } 1856 1854 break; ··· 1910 1912 1911 1913 /* error info record present */ 1912 1914 if (unlikely((rx_desc & RXQ_ERR) && (*(u64 *) slot->response))) { 1915 + mv_dprintk("port %d slot %d rx_desc %X has error info" 1916 + "%016llX.\n", slot->port->sas_port.id, slot_idx, 1917 + rx_desc, (u64)(*(u64 *)slot->response)); 1913 1918 tstat->stat = mvs_slot_err(mvi, task, slot_idx); 1914 1919 tstat->resp = SAS_TASK_COMPLETE; 1915 1920 goto out; ··· 1974 1973 spin_unlock(&mvi->lock); 1975 1974 if (task->task_done) 1976 1975 task->task_done(task); 1977 - else 1978 - mv_dprintk("why has not task_done.\n"); 1976 + 1979 1977 spin_lock(&mvi->lock); 1980 1978 1981 1979 return sts; ··· 2115 2115 struct mvs_phy *phy = &mvi->phy[phy_no]; 2116 2116 2117 2117 phy->irq_status = MVS_CHIP_DISP->read_port_irq_stat(mvi, phy_no); 2118 - mv_dprintk("port %d ctrl sts=0x%X.\n", phy_no+mvi->id*mvi->chip->n_phy, 2118 + MVS_CHIP_DISP->write_port_irq_stat(mvi, phy_no, phy->irq_status); 2119 + mv_dprintk("phy %d ctrl sts=0x%08X.\n", phy_no+mvi->id*mvi->chip->n_phy, 2119 2120 MVS_CHIP_DISP->read_phy_ctl(mvi, phy_no)); 2120 - mv_dprintk("Port %d irq sts = 0x%X\n", phy_no+mvi->id*mvi->chip->n_phy, 2121 + mv_dprintk("phy %d irq sts = 0x%08X\n", phy_no+mvi->id*mvi->chip->n_phy, 2121 2122 phy->irq_status); 2122 2123 2123 2124 /* ··· 2127 2126 */ 2128 2127 2129 2128 if (phy->irq_status & PHYEV_DCDR_ERR) { 2130 - mv_dprintk("port %d STP decoding error.\n", 2129 + mv_dprintk("phy %d STP decoding error.\n", 2131 2130 phy_no + mvi->id*mvi->chip->n_phy); 2132 2131 } 2133 2132 2134 2133 if (phy->irq_status & PHYEV_POOF) { 2134 + mdelay(500); 2135 2135 if (!(phy->phy_event & PHY_PLUG_OUT)) { 2136 2136 int dev_sata = phy->phy_type & PORT_TYPE_SATA; 2137 2137 int ready; ··· 2143 2141 (void *)(unsigned long)phy_no, 2144 2142 PHY_PLUG_EVENT); 2145 2143 ready = mvs_is_phy_ready(mvi, phy_no); 2146 - if (!ready) 2147 - mv_dprintk("phy%d Unplug Notice\n", 2148 - phy_no + 2149 - mvi->id * mvi->chip->n_phy); 2150 2144 if (ready || dev_sata) { 2151 2145 if (MVS_CHIP_DISP->stp_reset) 2152 2146 MVS_CHIP_DISP->stp_reset(mvi, ··· 2162 2164 if (phy->timer.function == NULL) { 2163 2165 phy->timer.data = (unsigned long)phy; 2164 2166 phy->timer.function = mvs_sig_time_out; 2165 - phy->timer.expires = jiffies + 10*HZ; 2167 + phy->timer.expires = jiffies + 5*HZ; 2166 2168 add_timer(&phy->timer); 2167 2169 } 2168 2170 } ··· 2196 2198 phy_no + mvi->id*mvi->chip->n_phy); 2197 2199 } 2198 2200 } else if (phy->irq_status & PHYEV_BROAD_CH) { 2199 - mv_dprintk("port %d broadcast change.\n", 2201 + mv_dprintk("phy %d broadcast change.\n", 2200 2202 phy_no + mvi->id*mvi->chip->n_phy); 2201 2203 mvs_handle_event(mvi, (void *)(unsigned long)phy_no, 2202 2204 EXP_BRCT_CHG); 2203 2205 } 2204 - MVS_CHIP_DISP->write_port_irq_stat(mvi, phy_no, phy->irq_status); 2205 2206 } 2206 2207 2207 2208 int mvs_int_rx(struct mvs_info *mvi, bool self_clear)
+2 -1
drivers/scsi/mvsas/mv_sas.h
··· 417 417 struct mvs_prv_info{ 418 418 u8 n_host; 419 419 u8 n_phy; 420 - u16 reserve; 420 + u8 scan_finished; 421 + u8 reserve; 421 422 struct mvs_info *mvi[2]; 422 423 }; 423 424