Print this page
9482 Want cxgbetool
Reviewed by: Toomas Soome <tsoome@me.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Approved by: Dan McDonald <danmcd@joyent.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/cxgbe/t4nex/t4_ioctl.c
          +++ new/usr/src/uts/common/io/cxgbe/t4nex/t4_ioctl.c
↓ open down ↓ 36 lines elided ↑ open up ↑
  37   37  static int get_sge_context(struct adapter *sc, void *data, int flags);
  38   38  static int get_devlog(struct adapter *sc, void *data, int flags);
  39   39  static int validate_mem_range(struct adapter *, uint32_t, int);
  40   40  static int read_card_mem(struct adapter *sc, void *data, int flags);
  41   41  static int read_tid_tab(struct adapter *sc, void *data, int flags);
  42   42  static int read_mbox(struct adapter *sc, void *data, int flags);
  43   43  static int read_cim_la(struct adapter *sc, void *data, int flags);
  44   44  static int read_cim_qcfg(struct adapter *sc, void *data, int flags);
  45   45  static int read_cim_ibq(struct adapter *sc, void *data, int flags);
  46   46  static int read_edc(struct adapter *sc, void *data, int flags);
       47 +static int flash_fw(struct adapter *, void *, int);
  47   48  
  48   49  int
  49   50  t4_ioctl(struct adapter *sc, int cmd, void *data, int mode)
  50   51  {
  51   52          int rc = ENOTSUP;
  52   53  
  53   54          switch (cmd) {
  54   55          case T4_IOCTL_PCIGET32:
  55   56          case T4_IOCTL_PCIPUT32:
  56   57                  rc = pci_rw(sc, data, mode, cmd == T4_IOCTL_PCIPUT32);
↓ open down ↓ 25 lines elided ↑ open up ↑
  82   83                  break;
  83   84          case T4_IOCTL_GET_CIM_QCFG:
  84   85                  rc = read_cim_qcfg(sc, data, mode);
  85   86                  break;
  86   87          case T4_IOCTL_GET_CIM_IBQ:
  87   88                  rc = read_cim_ibq(sc, data, mode);
  88   89                  break;
  89   90          case T4_IOCTL_GET_EDC:
  90   91                  rc = read_edc(sc, data, mode);
  91   92                  break;
       93 +        case T4_IOCTL_LOAD_FW:
       94 +                rc = flash_fw(sc, data, mode);
       95 +                break;
  92   96          default:
  93   97                  return (EINVAL);
  94   98          }
  95   99  
  96  100          return (rc);
  97  101  }
  98  102  
  99  103  static int
 100  104  pci_rw(struct adapter *sc, void *data, int flags, int write)
 101  105  {
↓ open down ↓ 1317 lines elided ↑ open up ↑
1419 1423                  goto done;
1420 1424          }
1421 1425  
1422 1426          rc = -t4_memory_rw(sc, sc->params.drv_memwin, dparams->memtype,
1423 1427                             dparams->start, dparams->size, (void *)buf,
1424 1428                             T4_MEMORY_READ);
1425 1429          if (rc != 0)
1426 1430                  goto done1;
1427 1431  
1428 1432          /* Copyout device log buffer and then carrier buffer */
1429      -        if (ddi_copyout(buf, dl.data, dl.len, flags) < 0)
     1433 +        if (ddi_copyout(buf, (void *)((uintptr_t)data + sizeof(dl)), dl.len,
     1434 +            flags) < 0)
1430 1435                  rc = EFAULT;
1431      -        else if (ddi_copyout(&dl, data, sizeof (dl), flags) < 0)
     1436 +
     1437 +        if (ddi_copyout(&dl, data, sizeof(dl), flags) < 0)
1432 1438                  rc = EFAULT;
1433 1439  
1434 1440  done1:
1435 1441          kmem_free(buf, dparams->size);
1436 1442  
1437 1443  done:
1438 1444          return (rc);
1439 1445  }
1440 1446  
1441 1447  static int
↓ open down ↓ 186 lines elided ↑ open up ↑
1628 1634                  *p =  t4_read_reg64(sc, data_reg + i);
1629 1635  
1630 1636          if (ddi_copyout(buf, t4mbox.data, t4mbox.len, flags) < 0)
1631 1637                  rc = EFAULT;
1632 1638  
1633 1639          kmem_free(buf, t4mbox.len);
1634 1640  
1635 1641  _exit:
1636 1642          return (rc);
1637 1643  }
     1644 +
     1645 +static int
     1646 +flash_fw(struct adapter *sc, void *data, int flags)
     1647 +{
     1648 +        unsigned int mbox = M_PCIE_FW_MASTER + 1;
     1649 +        struct t4_ldfw fw;
     1650 +        u8 *ptr = NULL;
     1651 +        int rc = 0;
     1652 +
     1653 +        if (ddi_copyin(data, &fw, sizeof(struct t4_ldfw), flags) < 0)
     1654 +                return EFAULT;
     1655 +
     1656 +        if (!fw.len)
     1657 +                return EINVAL;
     1658 +
     1659 +        ptr = (u8 *)kmem_zalloc(fw.len, KM_NOSLEEP);
     1660 +        if (ptr == NULL)
     1661 +                return ENOMEM;
     1662 +
     1663 +        if (ddi_copyin((void *)((uintptr_t)data + sizeof(fw)), ptr, fw.len,
     1664 +            flags) < 0) {
     1665 +                kmem_free(ptr, fw.len);
     1666 +                return EFAULT;
     1667 +        }
     1668 +
     1669 +        if (sc->flags & FULL_INIT_DONE)
     1670 +                mbox = sc->mbox;
     1671 +
     1672 +        rc = -t4_fw_upgrade(sc, mbox, ptr, fw.len, true);
     1673 +
     1674 +        kmem_free(ptr, fw.len);
     1675 +
     1676 +        return (rc);
     1677 +}
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX