On Fr, 2018-10-05 at 10:24 +0000, Igor Russkikh wrote:
> From: Dmitry Bezrukov <[email protected]>
> 
> +static void aqc111_configure_rx(struct usbnet *dev,
> +                             struct aqc111_data *aqc111_data)
> +{
> +     u8 reg8 = 0;
> +     u8 queue_num = 0;
> +     u16 reg16 = 0;
> +     u16 link_speed = 0, usb_host = 0;
> +     u8 buf[5] = { 0 };

DMA on stack.

> +     enum usb_device_speed usb_speed = dev->udev->speed;
> +
> +     buf[0] = 0x00;
> +     buf[1] = 0xF8;
> +     buf[2] = 0x07;
> +     switch (aqc111_data->link_speed) {
> +     case AQ_INT_SPEED_5G:
> +     {
> +             link_speed = 5000;
> +             reg8 = 0x05;
> +             reg16 = 0x001F;
> +             break;
> +     }
> +     case AQ_INT_SPEED_2_5G:
> +     {
> +             link_speed = 2500;
> +             reg16 = 0x003F;
> +             break;
> +     }
> +     case AQ_INT_SPEED_1G:
> +     {
> +             link_speed = 1000;
> +             reg16 = 0x009F;
> +             break;
> +     }
> +     case AQ_INT_SPEED_100M:
> +     {
> +             link_speed = 100;
> +             queue_num = 1;
> +             reg16 = 0x063F;
> +             buf[1] = 0xFB;
> +             buf[2] = 0x4;
> +             break;
> +     }
> +     }
> +
> +     if (aqc111_data->dpa) {
> +             /* Set Phy Flow control */
> +             aq_mdio_write_cmd(dev, AQ_GLB_ING_PAUSE_CTRL_REG,
> +                               AQ_PHY_AUTONEG_ADDR, 2, &reg16);
> +             aq_mdio_write_cmd(dev, AQ_GLB_EGR_PAUSE_CTRL_REG,
> +                               AQ_PHY_AUTONEG_ADDR, 2, &reg16);
> +     }
> +
> +     aqc111_write_cmd(dev, AQ_ACCESS_MAC, SFR_INTER_PACKET_GAP_0,
> +                      1, 1, &reg8);
> +
> +     aqc111_write_cmd(dev, AQ_ACCESS_MAC, SFR_TX_PAUSE_RESEND_T, 3, 3, buf);
> +
> +     switch (usb_speed) {

Needs to handle all speeds. And please add a comment explaining the
rationale.

> +     case USB_SPEED_SUPER:
> +     {
> +             usb_host = 3;
> +             break;
> +     }
> +     case USB_SPEED_HIGH:
> +     {
> +             usb_host = 2;
> +             break;
> +     }
> +     case USB_SPEED_FULL:
> +     case USB_SPEED_LOW:
> +     {
> +             usb_host = 1;
> +             queue_num = 0;
> +             break;
> +     }
> +     default:
> +     {
> +             usb_host = 0;
> +             break;
> +     }
> +     }
> +
> +     memcpy(buf, &AQC111_BULKIN_SIZE[queue_num], 5);
> +     /* RX bulk configuration */
> +     aqc111_write_cmd(dev, AQ_ACCESS_MAC, SFR_RX_BULKIN_QCTRL, 5, 5, buf);
> +
> +     /* Set high low water level */
> +     reg16 = 0x0810;
> +
> +     aqc111_write_cmd(dev, AQ_ACCESS_MAC, SFR_PAUSE_WATERLVL_LOW,
> +                      2, 2, &reg16);
> +     netdev_info(dev->net, "Link Speed %d, USB %d", link_speed, usb_host);
> +}

        Regards
                Oliver

Reply via email to