Print this page
4031 scsa1394 violates DDI scsi_pkt(9S) allocation rules

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/1394/targets/scsa1394/hba.c
          +++ new/usr/src/uts/common/io/1394/targets/scsa1394/hba.c
↓ open down ↓ 48 lines elided ↑ open up ↑
  49   49  static void     scsa1394_cpr_resume(dev_info_t *);
  50   50  
  51   51  /* configuration routines */
  52   52  static void     scsa1394_cleanup(scsa1394_state_t *, int);
  53   53  static int      scsa1394_attach_1394(scsa1394_state_t *);
  54   54  static void     scsa1394_detach_1394(scsa1394_state_t *);
  55   55  static int      scsa1394_attach_threads(scsa1394_state_t *);
  56   56  static void     scsa1394_detach_threads(scsa1394_state_t *);
  57   57  static int      scsa1394_attach_scsa(scsa1394_state_t *);
  58   58  static void     scsa1394_detach_scsa(scsa1394_state_t *);
  59      -static int      scsa1394_create_cmd_cache(scsa1394_state_t *);
  60      -static void     scsa1394_destroy_cmd_cache(scsa1394_state_t *);
  61   59  static int      scsa1394_add_events(scsa1394_state_t *);
  62   60  static void     scsa1394_remove_events(scsa1394_state_t *);
  63   61  
  64   62  /* device configuration */
  65   63  static int      scsa1394_scsi_bus_config(dev_info_t *, uint_t,
  66   64                  ddi_bus_config_op_t, void *, dev_info_t **);
  67   65  static int      scsa1394_scsi_bus_unconfig(dev_info_t *, uint_t,
  68   66                  ddi_bus_config_op_t, void *);
  69   67  static void     scsa1394_create_children(scsa1394_state_t *);
  70   68  static void     scsa1394_bus_reset(dev_info_t *, ddi_eventcookie_t, void *,
↓ open down ↓ 20 lines elided ↑ open up ↑
  91   89  static int      scsa1394_scsi_start(struct scsi_address *, struct scsi_pkt *);
  92   90  static int      scsa1394_scsi_abort(struct scsi_address *, struct scsi_pkt *);
  93   91  static int      scsa1394_scsi_reset(struct scsi_address *, int);
  94   92  static int      scsa1394_scsi_getcap(struct scsi_address *, char *, int);
  95   93  static int      scsa1394_scsi_setcap(struct scsi_address *, char *, int, int);
  96   94  static void     scsa1394_scsi_dmafree(struct scsi_address *, struct scsi_pkt *);
  97   95  static void     scsa1394_scsi_sync_pkt(struct scsi_address *,
  98   96                  struct scsi_pkt *);
  99   97  
 100   98  /* pkt resource allocation routines */
 101      -static int      scsa1394_cmd_cache_constructor(void *, void *, int);
 102      -static void     scsa1394_cmd_cache_destructor(void *, void *);
 103      -static int      scsa1394_cmd_ext_alloc(scsa1394_state_t *, scsa1394_cmd_t *,
 104      -                int);
 105      -static void     scsa1394_cmd_ext_free(scsa1394_state_t *, scsa1394_cmd_t *);
 106   99  static int      scsa1394_cmd_cdb_dma_alloc(scsa1394_state_t *, scsa1394_cmd_t *,
 107  100                  int, int (*)(), caddr_t);
 108  101  static void     scsa1394_cmd_cdb_dma_free(scsa1394_state_t *, scsa1394_cmd_t *);
 109  102  static int      scsa1394_cmd_buf_dma_alloc(scsa1394_state_t *, scsa1394_cmd_t *,
 110  103                  int, int (*)(), caddr_t, struct buf *);
 111  104  static void     scsa1394_cmd_buf_dma_free(scsa1394_state_t *, scsa1394_cmd_t *);
 112  105  static int      scsa1394_cmd_dmac2seg(scsa1394_state_t *, scsa1394_cmd_t *,
 113  106                  ddi_dma_cookie_t *, uint_t, int);
 114  107  static void     scsa1394_cmd_seg_free(scsa1394_state_t *, scsa1394_cmd_t *);
 115  108  static int      scsa1394_cmd_pt_dma_alloc(scsa1394_state_t *, scsa1394_cmd_t *,
↓ open down ↓ 183 lines elided ↑ open up ↑
 299  292          if (scsa1394_attach_threads(sp) != DDI_SUCCESS) {
 300  293                  scsa1394_cleanup(sp, 3);
 301  294                  return (DDI_FAILURE);
 302  295          }
 303  296  
 304  297          if (scsa1394_attach_scsa(sp) != DDI_SUCCESS) {
 305  298                  scsa1394_cleanup(sp, 4);
 306  299                  return (DDI_FAILURE);
 307  300          }
 308  301  
 309      -        if (scsa1394_create_cmd_cache(sp) != DDI_SUCCESS) {
 310      -                scsa1394_cleanup(sp, 5);
 311      -                return (DDI_FAILURE);
 312      -        }
 313      -
 314  302          if (scsa1394_add_events(sp) != DDI_SUCCESS) {
 315      -                scsa1394_cleanup(sp, 6);
      303 +                scsa1394_cleanup(sp, 5);
 316  304                  return (DDI_FAILURE);
 317  305          }
 318  306  
 319  307          /* prevent async PM changes until we are done */
 320  308          (void) pm_busy_component(dip, 0);
 321  309  
 322  310          /* Set power to full on */
 323  311          (void) pm_raise_power(dip, 0, PM_LEVEL_D0);
 324  312  
 325  313          /* we are done */
↓ open down ↓ 126 lines elided ↑ open up ↑
 452  440   */
 453  441  static void
 454  442  scsa1394_cleanup(scsa1394_state_t *sp, int level)
 455  443  {
 456  444          ASSERT((level > 0) && (level <= SCSA1394_CLEANUP_LEVEL_MAX));
 457  445  
 458  446          switch (level) {
 459  447          default:
 460  448                  scsa1394_remove_events(sp);
 461  449                  /* FALLTHRU */
 462      -        case 6:
 463      -                scsa1394_detach_scsa(sp);
 464      -                /* FALLTHRU */
 465  450          case 5:
 466      -                scsa1394_destroy_cmd_cache(sp);
      451 +                scsa1394_detach_scsa(sp);
 467  452                  /* FALLTHRU */
 468  453          case 4:
 469  454                  scsa1394_detach_threads(sp);
 470  455                  /* FALLTHRU */
 471  456          case 3:
 472  457                  scsa1394_sbp2_detach(sp);
 473  458                  /* FALLTHRU */
 474  459          case 2:
 475  460                  scsa1394_detach_1394(sp);
 476  461                  /* FALLTHRU */
↓ open down ↓ 113 lines elided ↑ open up ↑
 590  575  {
 591  576          int     ret;
 592  577  
 593  578          ret = scsi_hba_detach(sp->s_dip);
 594  579          ASSERT(ret == DDI_SUCCESS);
 595  580  
 596  581          scsi_hba_tran_free(sp->s_tran);
 597  582  }
 598  583  
 599  584  static int
 600      -scsa1394_create_cmd_cache(scsa1394_state_t *sp)
 601      -{
 602      -        char    name[64];
 603      -
 604      -        (void) sprintf(name, "scsa1394%d_cache", sp->s_instance);
 605      -        sp->s_cmd_cache = kmem_cache_create(name,
 606      -            SCSA1394_CMD_SIZE, sizeof (void *),
 607      -            scsa1394_cmd_cache_constructor, scsa1394_cmd_cache_destructor,
 608      -            NULL, (void *)sp, NULL, 0);
 609      -
 610      -        return ((sp->s_cmd_cache == NULL) ? DDI_FAILURE : DDI_SUCCESS);
 611      -}
 612      -
 613      -static void
 614      -scsa1394_destroy_cmd_cache(scsa1394_state_t *sp)
 615      -{
 616      -        kmem_cache_destroy(sp->s_cmd_cache);
 617      -}
 618      -
 619      -static int
 620  585  scsa1394_add_events(scsa1394_state_t *sp)
 621  586  {
 622  587          ddi_eventcookie_t       br_evc, rem_evc, ins_evc;
 623  588  
 624  589          if (ddi_get_eventcookie(sp->s_dip, DDI_DEVI_BUS_RESET_EVENT,
 625  590              &br_evc) != DDI_SUCCESS) {
 626  591                  return (DDI_FAILURE);
 627  592          }
 628  593          if (ddi_add_event_handler(sp->s_dip, br_evc, scsa1394_bus_reset,
 629  594              sp, &sp->s_reset_cb_id) != DDI_SUCCESS) {
↓ open down ↓ 658 lines elided ↑ open up ↑
1288 1253          if (ap->a_lun >= sp->s_nluns) {
1289 1254                  return (NULL);
1290 1255          }
1291 1256          lp = &sp->s_lun[ap->a_lun];
1292 1257  
1293 1258          /*
1294 1259           * allocate cmd space
1295 1260           */
1296 1261          if (pkt == NULL) {
1297 1262                  is_new = B_TRUE;
1298      -                if ((cmd = kmem_cache_alloc(sp->s_cmd_cache, kf)) == NULL) {
     1263 +                pkt = scsi_hba_pkt_alloc(NULL, ap, max(SCSI_CDB_SIZE, cmdlen),
     1264 +                    statuslen, tgtlen, sizeof (scsa1394_cmd_t), callback, arg);
     1265 +                if (!pkt)
1299 1266                          return (NULL);
1300      -                }
1301 1267  
1302 1268                  /* initialize cmd */
1303      -                pkt = &cmd->sc_scsi_pkt;
1304      -                pkt->pkt_ha_private     = cmd;
1305      -                pkt->pkt_address        = *ap;
1306      -                pkt->pkt_private        = cmd->sc_priv;
1307      -                pkt->pkt_scbp           = (uchar_t *)&cmd->sc_scb;
1308      -                pkt->pkt_cdbp           = (uchar_t *)&cmd->sc_pkt_cdb;
1309      -                pkt->pkt_resid          = 0;
1310      -
1311      -                cmd->sc_lun             = lp;
1312      -                cmd->sc_pkt             = pkt;
1313      -                cmd->sc_cdb_len         = cmdlen;
1314      -                cmd->sc_scb_len         = statuslen;
1315      -                cmd->sc_priv_len        = tgtlen;
1316      -
1317      -                /* need external space? */
1318      -                if ((cmdlen > sizeof (cmd->sc_pkt_cdb)) ||
1319      -                    (statuslen > sizeof (cmd->sc_scb)) ||
1320      -                    (tgtlen > sizeof (cmd->sc_priv))) {
1321      -                        if (scsa1394_cmd_ext_alloc(sp, cmd, kf) !=
1322      -                            DDI_SUCCESS) {
1323      -                                kmem_cache_free(sp->s_cmd_cache, cmd);
1324      -                                lp->l_stat.stat_err_pkt_kmem_alloc++;
1325      -                                return (NULL);
1326      -                        }
1327      -                }
     1269 +                cmd = pkt->pkt_ha_private;
     1270 +                cmd->sc_lun = lp;
     1271 +                cmd->sc_pkt = pkt;
     1272 +                cmd->sc_orig_cdblen = cmdlen;
     1273 +                cmd->sc_task.ts_drv_priv = cmd;
1328 1274  
1329 1275                  /* allocate DMA resources for CDB */
1330 1276                  if (scsa1394_cmd_cdb_dma_alloc(sp, cmd, flags, callback, arg) !=
1331 1277                      DDI_SUCCESS) {
1332 1278                          scsa1394_scsi_destroy_pkt(ap, pkt);
1333 1279                          return (NULL);
1334 1280                  }
1335 1281          } else {
1336 1282                  is_new = B_FALSE;
1337 1283                  cmd = PKT2CMD(pkt);
↓ open down ↓ 44 lines elided ↑ open up ↑
1382 1328          if (cmd->sc_flags & SCSA1394_CMD_DMA_BUF_VALID) {
1383 1329                  scsa1394_cmd_buf_dma_free(sp, cmd);
1384 1330          }
1385 1331          if (cmd->sc_flags & SCSA1394_CMD_DMA_CDB_VALID) {
1386 1332                  scsa1394_cmd_cdb_dma_free(sp, cmd);
1387 1333          }
1388 1334          if (cmd->sc_flags & SCSA1394_CMD_DMA_BUF_MAPIN) {
1389 1335                  bp_mapout(cmd->sc_bp);
1390 1336                  cmd->sc_flags &= ~SCSA1394_CMD_DMA_BUF_MAPIN;
1391 1337          }
1392      -        if (cmd->sc_flags & SCSA1394_CMD_EXT) {
1393      -                scsa1394_cmd_ext_free(sp, cmd);
1394      -        }
1395 1338  
1396      -        kmem_cache_free(sp->s_cmd_cache, cmd);
     1339 +        scsi_hba_pkt_free(ap, pkt);
1397 1340  }
1398 1341  
1399 1342  static void
1400 1343  scsa1394_scsi_dmafree(struct scsi_address *ap, struct scsi_pkt *pkt)
1401 1344  {
1402 1345          scsa1394_state_t *sp = ADDR2STATE(ap);
1403 1346          scsa1394_cmd_t  *cmd = PKT2CMD(pkt);
1404 1347  
1405 1348          if (cmd->sc_flags & SCSA1394_CMD_DMA_BUF_VALID) {
1406 1349                  scsa1394_cmd_buf_dma_free(sp, cmd);
1407 1350          }
1408 1351          if (cmd->sc_flags & SCSA1394_CMD_DMA_BUF_MAPIN) {
1409 1352                  bp_mapout(cmd->sc_bp);
1410 1353                  cmd->sc_flags &= ~SCSA1394_CMD_DMA_BUF_MAPIN;
1411 1354          }
1412 1355  }
1413 1356  
1414 1357  /*ARGSUSED*/
1415 1358  static int
1416      -scsa1394_cmd_cache_constructor(void *buf, void *cdrarg, int kf)
1417      -{
1418      -        scsa1394_cmd_t  *cmd = buf;
1419      -
1420      -        bzero(buf, SCSA1394_CMD_SIZE);
1421      -        cmd->sc_task.ts_drv_priv = cmd;
1422      -
1423      -        return (0);
1424      -}
1425      -
1426      -/*ARGSUSED*/
1427      -static void
1428      -scsa1394_cmd_cache_destructor(void *buf, void *cdrarg)
1429      -{
1430      -}
1431      -
1432      -/*
1433      - * allocate and deallocate external cmd space (ie. not part of scsa1394_cmd_t)
1434      - * for non-standard length cdb, pkt_private, status areas
1435      - */
1436      -static int
1437      -scsa1394_cmd_ext_alloc(scsa1394_state_t *sp, scsa1394_cmd_t *cmd, int kf)
1438      -{
1439      -        struct scsi_pkt *pkt = cmd->sc_pkt;
1440      -        void            *buf;
1441      -
1442      -        if (cmd->sc_cdb_len > sizeof (cmd->sc_pkt_cdb)) {
1443      -                if ((buf = kmem_zalloc(cmd->sc_cdb_len, kf)) == NULL) {
1444      -                        return (DDI_FAILURE);
1445      -                }
1446      -                pkt->pkt_cdbp = buf;
1447      -                cmd->sc_flags |= SCSA1394_CMD_CDB_EXT;
1448      -        }
1449      -
1450      -        if (cmd->sc_scb_len > sizeof (cmd->sc_scb)) {
1451      -                if ((buf = kmem_zalloc(cmd->sc_scb_len, kf)) == NULL) {
1452      -                        scsa1394_cmd_ext_free(sp, cmd);
1453      -                        return (DDI_FAILURE);
1454      -                }
1455      -                pkt->pkt_scbp = buf;
1456      -                cmd->sc_flags |= SCSA1394_CMD_SCB_EXT;
1457      -        }
1458      -
1459      -        if (cmd->sc_priv_len > sizeof (cmd->sc_priv)) {
1460      -                if ((buf = kmem_zalloc(cmd->sc_priv_len, kf)) == NULL) {
1461      -                        scsa1394_cmd_ext_free(sp, cmd);
1462      -                        return (DDI_FAILURE);
1463      -                }
1464      -                pkt->pkt_private = buf;
1465      -                cmd->sc_flags |= SCSA1394_CMD_PRIV_EXT;
1466      -        }
1467      -
1468      -        return (DDI_SUCCESS);
1469      -}
1470      -
1471      -/*ARGSUSED*/
1472      -static void
1473      -scsa1394_cmd_ext_free(scsa1394_state_t *sp, scsa1394_cmd_t *cmd)
1474      -{
1475      -        struct scsi_pkt *pkt = cmd->sc_pkt;
1476      -
1477      -        if (cmd->sc_flags & SCSA1394_CMD_CDB_EXT) {
1478      -                kmem_free(pkt->pkt_cdbp, cmd->sc_cdb_len);
1479      -        }
1480      -        if (cmd->sc_flags & SCSA1394_CMD_SCB_EXT) {
1481      -                kmem_free(pkt->pkt_scbp, cmd->sc_scb_len);
1482      -        }
1483      -        if (cmd->sc_flags & SCSA1394_CMD_PRIV_EXT) {
1484      -                kmem_free(pkt->pkt_private, cmd->sc_priv_len);
1485      -        }
1486      -        cmd->sc_flags &= ~SCSA1394_CMD_EXT;
1487      -}
1488      -
1489      -/*ARGSUSED*/
1490      -static int
1491 1359  scsa1394_cmd_cdb_dma_alloc(scsa1394_state_t *sp, scsa1394_cmd_t *cmd,
1492 1360      int flags, int (*callback)(), caddr_t arg)
1493 1361  {
1494 1362          if (sbp2_task_orb_alloc(cmd->sc_lun->l_lun, &cmd->sc_task,
1495 1363              sizeof (scsa1394_cmd_orb_t)) != SBP2_SUCCESS) {
1496 1364                  return (DDI_FAILURE);
1497 1365          }
1498 1366  
1499 1367          cmd->sc_flags |= SCSA1394_CMD_DMA_CDB_VALID;
1500 1368          return (DDI_SUCCESS);
↓ open down ↓ 533 lines elided ↑ open up ↑
2034 1902                          break;
2035 1903                  default:
2036 1904                          break;
2037 1905                  }
2038 1906          }
2039 1907  }
2040 1908  
2041 1909  static void
2042 1910  scsa1394_cmd_fill_cdb(scsa1394_lun_t *lp, scsa1394_cmd_t *cmd)
2043 1911  {
2044      -        cmd->sc_cdb_actual_len = cmd->sc_cdb_len;
2045      -
2046 1912          mutex_enter(&lp->l_mutex);
2047 1913  
2048 1914          switch (lp->l_dtype_orig) {
2049 1915          case DTYPE_DIRECT:
2050 1916          case DTYPE_RODIRECT:
2051 1917          case DTYPE_OPTICAL:
2052 1918          case SCSA1394_DTYPE_RBC:
2053 1919                  scsa1394_cmd_fill_cdb_rbc(lp, cmd);
2054 1920                  break;
2055 1921          default:
↓ open down ↓ 17 lines elided ↑ open up ↑
2073 1939  
2074 1940          opcode = pkt->pkt_cdbp[0];
2075 1941          blk_size  = lp->l_lba_size;
2076 1942  
2077 1943          switch (opcode) {
2078 1944          case SCMD_READ:
2079 1945                  /* RBC only supports 10-byte read/write */
2080 1946                  lba = SCSA1394_LBA_6BYTE(pkt);
2081 1947                  len = SCSA1394_LEN_6BYTE(pkt);
2082 1948                  opcode = SCMD_READ_G1;
2083      -                cmd->sc_cdb_actual_len = CDB_GROUP1;
     1949 +                cmd->sc_orig_cdblen = CDB_GROUP1;
2084 1950                  break;
2085 1951          case SCMD_WRITE:
2086 1952                  lba = SCSA1394_LBA_6BYTE(pkt);
2087 1953                  len = SCSA1394_LEN_6BYTE(pkt);
2088 1954                  opcode = SCMD_WRITE_G1;
2089      -                cmd->sc_cdb_actual_len = CDB_GROUP1;
     1955 +                cmd->sc_orig_cdblen = CDB_GROUP1;
2090 1956                  break;
2091 1957          case SCMD_READ_G1:
2092 1958          case SCMD_READ_LONG:
2093 1959                  lba = SCSA1394_LBA_10BYTE(pkt);
2094 1960                  len = SCSA1394_LEN_10BYTE(pkt);
2095 1961                  break;
2096 1962          case SCMD_WRITE_G1:
2097 1963          case SCMD_WRITE_LONG:
2098 1964                  lba = SCSA1394_LBA_10BYTE(pkt);
2099 1965                  len = SCSA1394_LEN_10BYTE(pkt);
↓ open down ↓ 38 lines elided ↑ open up ↑
2138 2004  
2139 2005          /* finalize new CDB */
2140 2006          switch (pkt->pkt_cdbp[0]) {
2141 2007          case SCMD_READ:
2142 2008          case SCMD_WRITE:
2143 2009                  /*
2144 2010                   * We rewrite READ/WRITE G0 commands as READ/WRITE G1.
2145 2011                   * Build new cdb from scatch.
2146 2012                   * The lba and length fields is updated below.
2147 2013                   */
2148      -                bzero(cmd->sc_cdb, cmd->sc_cdb_actual_len);
     2014 +                bzero(pkt->pkt_cdbp, cmd->sc_orig_cdblen);
2149 2015                  break;
2150 2016          default:
2151      -                /*
2152      -                 * Copy the non lba/len fields.
2153      -                 * The lba and length fields is updated below.
2154      -                 */
2155      -                bcopy(pkt->pkt_cdbp, cmd->sc_cdb, cmd->sc_cdb_actual_len);
2156 2017                  break;
2157 2018          }
2158 2019  
2159      -        cmd->sc_cdb[0] = (uchar_t)opcode;
     2020 +        pkt->pkt_cdbp[0] = (uchar_t)opcode;
2160 2021          scsa1394_cmd_fill_cdb_lba(cmd, lba);
2161 2022          switch (opcode) {
2162 2023          case SCMD_READ_CD:
2163 2024                  scsa1394_cmd_fill_read_cd_cdb_len(cmd, len);
2164 2025                  break;
2165 2026          case SCMD_WRITE_G5:
2166 2027          case SCMD_READ_G5:
2167 2028                  scsa1394_cmd_fill_12byte_cdb_len(cmd, len);
2168 2029                  break;
2169 2030          default:
2170 2031                  scsa1394_cmd_fill_cdb_len(cmd, len);
2171 2032                  break;
2172 2033          }
2173 2034  }
2174 2035  
2175 2036  /*ARGSUSED*/
2176 2037  static void
2177 2038  scsa1394_cmd_fill_cdb_other(scsa1394_lun_t *lp, scsa1394_cmd_t *cmd)
2178 2039  {
2179      -        struct scsi_pkt *pkt = CMD2PKT(cmd);
2180      -
2181 2040          cmd->sc_xfer_bytes = cmd->sc_win_len;
2182 2041          cmd->sc_xfer_blks = cmd->sc_xfer_bytes / lp->l_lba_size;
2183 2042          cmd->sc_total_blks = cmd->sc_xfer_blks;
2184 2043          cmd->sc_lba = 0;
2185      -
2186      -        bcopy(pkt->pkt_cdbp, cmd->sc_cdb, cmd->sc_cdb_len);
2187 2044  }
2188 2045  
2189 2046  /*
2190 2047   * fill up parts of CDB
2191 2048   */
2192 2049  static void
2193 2050  scsa1394_cmd_fill_cdb_len(scsa1394_cmd_t *cmd, int len)
2194 2051  {
2195      -        cmd->sc_cdb[7] = len >> 8;
2196      -        cmd->sc_cdb[8] = (uchar_t)len;
     2052 +        struct scsi_pkt *pkt = CMD2PKT(cmd);
     2053 +
     2054 +        pkt->pkt_cdbp[7] = len >> 8;
     2055 +        pkt->pkt_cdbp[8] = (uchar_t)len;
2197 2056  }
2198 2057  
2199 2058  static void
2200 2059  scsa1394_cmd_fill_cdb_lba(scsa1394_cmd_t *cmd, int lba)
2201 2060  {
2202      -        cmd->sc_cdb[2] = lba >> 24;
2203      -        cmd->sc_cdb[3] = lba >> 16;
2204      -        cmd->sc_cdb[4] = lba >> 8;
2205      -        cmd->sc_cdb[5] = (uchar_t)lba;
     2061 +        struct scsi_pkt *pkt = CMD2PKT(cmd);
     2062 +
     2063 +        pkt->pkt_cdbp[2] = lba >> 24;
     2064 +        pkt->pkt_cdbp[3] = lba >> 16;
     2065 +        pkt->pkt_cdbp[4] = lba >> 8;
     2066 +        pkt->pkt_cdbp[5] = (uchar_t)lba;
2206 2067          cmd->sc_lba = lba;
2207 2068  }
2208 2069  
2209 2070  static void
2210 2071  scsa1394_cmd_fill_12byte_cdb_len(scsa1394_cmd_t *cmd, int len)
2211 2072  {
2212      -        cmd->sc_cdb[6] = len >> 24;
2213      -        cmd->sc_cdb[7] = len >> 16;
2214      -        cmd->sc_cdb[8] = len >> 8;
2215      -        cmd->sc_cdb[9] = (uchar_t)len;
     2073 +        struct scsi_pkt *pkt = CMD2PKT(cmd);
     2074 +
     2075 +        pkt->pkt_cdbp[6] = len >> 24;
     2076 +        pkt->pkt_cdbp[7] = len >> 16;
     2077 +        pkt->pkt_cdbp[8] = len >> 8;
     2078 +        pkt->pkt_cdbp[9] = (uchar_t)len;
2216 2079  }
2217 2080  
2218 2081  static void
2219 2082  scsa1394_cmd_fill_read_cd_cdb_len(scsa1394_cmd_t *cmd, int len)
2220 2083  {
2221      -        cmd->sc_cdb[6] = len >> 16;
2222      -        cmd->sc_cdb[7] = len >> 8;
2223      -        cmd->sc_cdb[8] = (uchar_t)len;
     2084 +        struct scsi_pkt *pkt = CMD2PKT(cmd);
     2085 +
     2086 +        pkt->pkt_cdbp[6] = len >> 16;
     2087 +        pkt->pkt_cdbp[7] = len >> 8;
     2088 +        pkt->pkt_cdbp[8] = (uchar_t)len;
2224 2089  }
2225 2090  
2226 2091  /*
2227 2092   * For SCMD_READ_CD, figure out the block size based on expected sector type.
2228 2093   * See MMC SCSI Specs section 6.1.15
2229 2094   */
2230 2095  static int
2231 2096  scsa1394_cmd_read_cd_blk_size(uchar_t expected_sector_type)
2232 2097  {
2233 2098          int blk_size;
↓ open down ↓ 207 lines elided ↑ open up ↑
2441 2306          ASSERT(cmd->sc_flags & SCSA1394_CMD_SYMBIOS_BREAKUP);
2442 2307  
2443 2308          cmd->sc_lba += cmd->sc_xfer_blks;
2444 2309          len = cmd->sc_resid_blks;
2445 2310  
2446 2311          /* limit xfer length for Symbios workaround */
2447 2312          if (len * cmd->sc_blk_size > scsa1394_symbios_size_max) {
2448 2313                  len = scsa1394_symbios_size_max / cmd->sc_blk_size;
2449 2314          }
2450 2315  
2451      -        switch (cmd->sc_cdb[0]) {
     2316 +        switch (cmd->sc_pkt->pkt_cdbp[0]) {
2452 2317          case SCMD_READ_CD:
2453 2318                  scsa1394_cmd_fill_read_cd_cdb_len(cmd, len);
2454 2319                  break;
2455 2320          case SCMD_WRITE_G5:
2456 2321          case SCMD_READ_G5:
2457 2322                  scsa1394_cmd_fill_12byte_cdb_len(cmd, len);
2458 2323                  break;
2459 2324          case SCMD_WRITE_G1:
2460 2325          case SCMD_WRITE_LONG:
2461 2326          default:
↓ open down ↓ 207 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX