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);
+ }