View | Details | Raw Unified | Return to bug 206581
Collapse All | Expand All

(-)b/bxe.c (-6 / +13 lines)
Lines 4422-4498 bxe_ifmedia_status(struct ifnet *ifp, struct ifmediareq Link Here
4422
4422
4423
    ifmr->ifm_active |= sc->media;
4423
    ifmr->ifm_active |= sc->media;
4424
4424
4425
    if (sc->link_vars.duplex == DUPLEX_FULL) {
4425
    if (sc->link_vars.duplex == DUPLEX_FULL) {
4426
        ifmr->ifm_active |= IFM_FDX;
4426
        ifmr->ifm_active |= IFM_FDX;
4427
    } else {
4427
    } else {
4428
        ifmr->ifm_active |= IFM_HDX;
4428
        ifmr->ifm_active |= IFM_HDX;
4429
    }
4429
    }
4430
}
4430
}
4431
4431
4432
static int
4432
static int
4433
bxe_ioctl_nvram(struct bxe_softc *sc,
4433
bxe_ioctl_nvram(struct bxe_softc *sc,
4434
                uint32_t         priv_op,
4434
                uint32_t         priv_op,
4435
                struct ifreq     *ifr)
4435
                struct ifreq     *ifr)
4436
{
4436
{
4437
    struct bxe_nvram_data nvdata_base;
4437
    struct bxe_nvram_data nvdata_base;
4438
    struct bxe_nvram_data *nvdata;
4438
    struct bxe_nvram_data *nvdata;
4439
    int len;
4439
    int len;
4440
    int error = 0;
4440
    int error = 0;
4441
4441
4442
    copyin(ifr->ifr_data, &nvdata_base, sizeof(nvdata_base));
4442
    if ((error = copyin(ifr->ifr_data, &nvdata_base, sizeof(nvdata_base))) != 0
4443
        return error;
4443
4444
4444
    len = (sizeof(struct bxe_nvram_data) +
4445
    len = (sizeof(struct bxe_nvram_data) +
4445
           nvdata_base.len -
4446
           nvdata_base.len -
4446
           sizeof(uint32_t));
4447
           sizeof(uint32_t));
4447
4448
4448
    if (len > sizeof(struct bxe_nvram_data)) {
4449
    if (len > sizeof(struct bxe_nvram_data)) {
4449
        if ((nvdata = (struct bxe_nvram_data *)
4450
        if ((nvdata = (struct bxe_nvram_data *)
4450
                 malloc(len, M_DEVBUF,
4451
                 malloc(len, M_DEVBUF,
4451
                        (M_NOWAIT | M_ZERO))) == NULL) {
4452
                        (M_NOWAIT | M_ZERO))) == NULL) {
4452
            BLOGE(sc, "BXE_IOC_RD_NVRAM malloc failed priv_op 0x%x "
4453
            BLOGE(sc, "BXE_IOC_RD_NVRAM malloc failed priv_op 0x%x "
4453
                " len = 0x%x\n", priv_op, len);
4454
                " len = 0x%x\n", priv_op, len);
4454
            return (1);
4455
            return (1);
4455
        }
4456
        }
4456
        memcpy(nvdata, &nvdata_base, sizeof(struct bxe_nvram_data));
4457
        memcpy(nvdata, &nvdata_base, sizeof(struct bxe_nvram_data));
4457
    } else {
4458
    } else {
4458
        nvdata = &nvdata_base;
4459
        nvdata = &nvdata_base;
4459
    }
4460
    }
4460
4461
4461
    if (priv_op == BXE_IOC_RD_NVRAM) {
4462
    if (priv_op == BXE_IOC_RD_NVRAM) {
4462
        BLOGD(sc, DBG_IOCTL, "IOC_RD_NVRAM 0x%x %d\n",
4463
        BLOGD(sc, DBG_IOCTL, "IOC_RD_NVRAM 0x%x %d\n",
4463
              nvdata->offset, nvdata->len);
4464
              nvdata->offset, nvdata->len);
4464
        error = bxe_nvram_read(sc,
4465
        if ((error = bxe_nvram_read(sc,
4465
                               nvdata->offset,
4466
                               nvdata->offset,
4466
                               (uint8_t *)nvdata->value,
4467
                               (uint8_t *)nvdata->value,
4467
                               nvdata->len);
4468
                               nvdata->len)) != 0) {
4468
        copyout(nvdata, ifr->ifr_data, len);
4469
            goto bxe_ioctl_nvram_exit;
4470
        }
4471
        error = copyout(nvdata, ifr->ifr_data, len);
4469
    } else { /* BXE_IOC_WR_NVRAM */
4472
    } else { /* BXE_IOC_WR_NVRAM */
4470
        BLOGD(sc, DBG_IOCTL, "IOC_WR_NVRAM 0x%x %d\n",
4473
        BLOGD(sc, DBG_IOCTL, "IOC_WR_NVRAM 0x%x %d\n",
4471
              nvdata->offset, nvdata->len);
4474
              nvdata->offset, nvdata->len);
4472
        copyin(ifr->ifr_data, nvdata, len);
4475
        if ((error = copyin(ifr->ifr_data, nvdata, len)) != 0) {
4476
            goto bxe_ioctl_nvram_exit;
4477
        }
4473
        error = bxe_nvram_write(sc,
4478
        error = bxe_nvram_write(sc,
4474
                                nvdata->offset,
4479
                                nvdata->offset,
4475
                                (uint8_t *)nvdata->value,
4480
                                (uint8_t *)nvdata->value,
4476
                                nvdata->len);
4481
                                nvdata->len);
4477
    }
4482
    }
4478
4483
4484
    bxe_ioctl_nvram_exit:
4479
    if (len > sizeof(struct bxe_nvram_data)) {
4485
    if (len > sizeof(struct bxe_nvram_data)) {
4480
        free(nvdata, M_DEVBUF);
4486
        free(nvdata, M_DEVBUF);
4481
    }
4487
    }
4482
4488
4483
    return (error);
4489
    return (error);
4484
}
4490
}
4485
4491
4486
static int
4492
static int
4487
bxe_ioctl_stats_show(struct bxe_softc *sc,
4493
bxe_ioctl_stats_show(struct bxe_softc *sc,
4488
                     uint32_t         priv_op,
4494
                     uint32_t         priv_op,
4489
                     struct ifreq     *ifr)
4495
                     struct ifreq     *ifr)
4490
{
4496
{
4491
    const size_t str_size   = (BXE_NUM_ETH_STATS * STAT_NAME_LEN);
4497
    const size_t str_size   = (BXE_NUM_ETH_STATS * STAT_NAME_LEN);
4492
    const size_t stats_size = (BXE_NUM_ETH_STATS * sizeof(uint64_t));
4498
    const size_t stats_size = (BXE_NUM_ETH_STATS * sizeof(uint64_t));
4493
    caddr_t p_tmp;
4499
    caddr_t p_tmp;
4494
    uint32_t *offset;
4500
    uint32_t *offset;
4495
    int i;
4501
    int i;
4496
4502
4497
    switch (priv_op)
4503
    switch (priv_op)
4498
    {
4504
    {
Lines 4752-4792 bxe_ioctl(if_t ifp, Link Here
4752
            BLOGE(sc, "Changing VLAN_HWFILTER is not supported!\n");
4758
            BLOGE(sc, "Changing VLAN_HWFILTER is not supported!\n");
4753
            error = EINVAL;
4759
            error = EINVAL;
4754
        }
4760
        }
4755
4761
4756
        /* XXX not yet...
4762
        /* XXX not yet...
4757
         * IFCAP_WOL_MAGIC
4763
         * IFCAP_WOL_MAGIC
4758
         */
4764
         */
4759
4765
4760
        break;
4766
        break;
4761
4767
4762
    case SIOCSIFMEDIA:
4768
    case SIOCSIFMEDIA:
4763
    case SIOCGIFMEDIA:
4769
    case SIOCGIFMEDIA:
4764
        /* set/get interface media */
4770
        /* set/get interface media */
4765
        BLOGD(sc, DBG_IOCTL,
4771
        BLOGD(sc, DBG_IOCTL,
4766
              "Received SIOCSIFMEDIA/SIOCGIFMEDIA ioctl (cmd=%lu)\n",
4772
              "Received SIOCSIFMEDIA/SIOCGIFMEDIA ioctl (cmd=%lu)\n",
4767
              (command & 0xff));
4773
              (command & 0xff));
4768
        error = ifmedia_ioctl(ifp, ifr, &sc->ifmedia, command);
4774
        error = ifmedia_ioctl(ifp, ifr, &sc->ifmedia, command);
4769
        break;
4775
        break;
4770
4776
4771
    case SIOCGPRIVATE_0:
4777
    case SIOCGPRIVATE_0:
4772
        copyin(ifr->ifr_data, &priv_op, sizeof(priv_op));
4778
        if ((error = copyin(ifr->ifr_data, &priv_op, sizeof(priv_op))) != 0)
4779
            break;
4773
4780
4774
        switch (priv_op)
4781
        switch (priv_op)
4775
        {
4782
        {
4776
        case BXE_IOC_RD_NVRAM:
4783
        case BXE_IOC_RD_NVRAM:
4777
        case BXE_IOC_WR_NVRAM:
4784
        case BXE_IOC_WR_NVRAM:
4778
            nvdata = (struct bxe_nvram_data *)ifr->ifr_data;
4785
            nvdata = (struct bxe_nvram_data *)ifr->ifr_data;
4779
            BLOGD(sc, DBG_IOCTL,
4786
            BLOGD(sc, DBG_IOCTL,
4780
                  "Received Private NVRAM ioctl addr=0x%x size=%u\n",
4787
                  "Received Private NVRAM ioctl addr=0x%x size=%u\n",
4781
                  nvdata->offset, nvdata->len);
4788
                  nvdata->offset, nvdata->len);
4782
            error = bxe_ioctl_nvram(sc, priv_op, ifr);
4789
            error = bxe_ioctl_nvram(sc, priv_op, ifr);
4783
            break;
4790
            break;
4784
4791
4785
        case BXE_IOC_STATS_SHOW_NUM:
4792
        case BXE_IOC_STATS_SHOW_NUM:
4786
        case BXE_IOC_STATS_SHOW_STR:
4793
        case BXE_IOC_STATS_SHOW_STR:
4787
        case BXE_IOC_STATS_SHOW_CNT:
4794
        case BXE_IOC_STATS_SHOW_CNT:
4788
            BLOGD(sc, DBG_IOCTL, "Received Private Stats ioctl (%d)\n",
4795
            BLOGD(sc, DBG_IOCTL, "Received Private Stats ioctl (%d)\n",
4789
                  priv_op);
4796
                  priv_op);
4790
            error = bxe_ioctl_stats_show(sc, priv_op, ifr);
4797
            error = bxe_ioctl_stats_show(sc, priv_op, ifr);
4791
            break;
4798
            break;
4792
4799

Return to bug 206581