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>
        
*** 42,51 ****
--- 42,52 ----
  static int read_mbox(struct adapter *sc, void *data, int flags);
  static int read_cim_la(struct adapter *sc, void *data, int flags);
  static int read_cim_qcfg(struct adapter *sc, void *data, int flags);
  static int read_cim_ibq(struct adapter *sc, void *data, int flags);
  static int read_edc(struct adapter *sc, void *data, int flags);
+ static int flash_fw(struct adapter *, void *, int);
  
  int
  t4_ioctl(struct adapter *sc, int cmd, void *data, int mode)
  {
          int rc = ENOTSUP;
*** 87,96 ****
--- 88,100 ----
                  rc = read_cim_ibq(sc, data, mode);
                  break;
          case T4_IOCTL_GET_EDC:
                  rc = read_edc(sc, data, mode);
                  break;
+         case T4_IOCTL_LOAD_FW:
+                 rc = flash_fw(sc, data, mode);
+                 break;
          default:
                  return (EINVAL);
          }
  
          return (rc);
*** 1424,1436 ****
                             T4_MEMORY_READ);
          if (rc != 0)
                  goto done1;
  
          /* Copyout device log buffer and then carrier buffer */
!         if (ddi_copyout(buf, dl.data, dl.len, flags) < 0)
                  rc = EFAULT;
!         else if (ddi_copyout(&dl, data, sizeof (dl), flags) < 0)
                  rc = EFAULT;
  
  done1:
          kmem_free(buf, dparams->size);
  
--- 1428,1442 ----
                             T4_MEMORY_READ);
          if (rc != 0)
                  goto done1;
  
          /* Copyout device log buffer and then carrier buffer */
!         if (ddi_copyout(buf, (void *)((uintptr_t)data + sizeof(dl)), dl.len,
!             flags) < 0)
                  rc = EFAULT;
! 
!         if (ddi_copyout(&dl, data, sizeof(dl), flags) < 0)
                  rc = EFAULT;
  
  done1:
          kmem_free(buf, dparams->size);
  
*** 1633,1637 ****
--- 1639,1677 ----
          kmem_free(buf, t4mbox.len);
  
  _exit:
          return (rc);
  }
+ 
+ static int
+ flash_fw(struct adapter *sc, void *data, int flags)
+ {
+         unsigned int mbox = M_PCIE_FW_MASTER + 1;
+         struct t4_ldfw fw;
+         u8 *ptr = NULL;
+         int rc = 0;
+ 
+         if (ddi_copyin(data, &fw, sizeof(struct t4_ldfw), flags) < 0)
+                 return EFAULT;
+ 
+         if (!fw.len)
+                 return EINVAL;
+ 
+         ptr = (u8 *)kmem_zalloc(fw.len, KM_NOSLEEP);
+         if (ptr == NULL)
+                 return ENOMEM;
+ 
+         if (ddi_copyin((void *)((uintptr_t)data + sizeof(fw)), ptr, fw.len,
+             flags) < 0) {
+                 kmem_free(ptr, fw.len);
+                 return EFAULT;
+         }
+ 
+         if (sc->flags & FULL_INIT_DONE)
+                 mbox = sc->mbox;
+ 
+         rc = -t4_fw_upgrade(sc, mbox, ptr, fw.len, true);
+ 
+         kmem_free(ptr, fw.len);
+ 
+         return (rc);
+ }