net:ethernet:aquantia: Fix for incorrect speed index.
authorPavel Belous <pavel.belous@aquantia.com>
Mon, 28 Aug 2017 18:52:11 +0000 (21:52 +0300)
committerDavid S. Miller <davem@davemloft.net>
Tue, 29 Aug 2017 22:11:44 +0000 (15:11 -0700)
The driver choose the optimal interrupt throttling settings depends
of current link speed.
Due this bug link_status field from aq_hw is never updated and as result
always used same interrupt throttling values.

Fixes: 3d2ff7eebe26 ("net: ethernet: aquantia: Atlantic hardware abstraction layer")
Signed-off-by: Pavel Belous <Pavel.Belous@aquantia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/aquantia/atlantic/aq_hw.h
drivers/net/ethernet/aquantia/atlantic/aq_nic.c
drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c
drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h

index fce0fd3f23ff251ae60392575f1c51bee4d88681..bf9b3f020e106cb07fd7630073f146d7f54ccfa9 100644 (file)
@@ -105,8 +105,7 @@ struct aq_hw_ops {
 
        int (*hw_set_mac_address)(struct aq_hw_s *self, u8 *mac_addr);
 
-       int (*hw_get_link_status)(struct aq_hw_s *self,
-                                 struct aq_hw_link_status_s *link_status);
+       int (*hw_get_link_status)(struct aq_hw_s *self);
 
        int (*hw_set_link_speed)(struct aq_hw_s *self, u32 speed);
 
index d6d8e7074c837c9a43b35c8073dac85e01c7a142..dce17a5b82b11b20e681c0dca99aeab4edf8dcd0 100644 (file)
@@ -125,33 +125,30 @@ static void aq_nic_service_timer_cb(unsigned long param)
        struct net_device *ndev = aq_nic_get_ndev(self);
        int err = 0;
        unsigned int i = 0U;
-       struct aq_hw_link_status_s link_status;
        struct aq_ring_stats_rx_s stats_rx;
        struct aq_ring_stats_tx_s stats_tx;
 
        if (aq_utils_obj_test(&self->header.flags, AQ_NIC_FLAGS_IS_NOT_READY))
                goto err_exit;
 
-       err = self->aq_hw_ops.hw_get_link_status(self->aq_hw, &link_status);
+       err = self->aq_hw_ops.hw_get_link_status(self->aq_hw);
        if (err < 0)
                goto err_exit;
 
-       self->aq_hw_ops.hw_interrupt_moderation_set(self->aq_hw,
-                           self->aq_nic_cfg.is_interrupt_moderation);
-
-       if (memcmp(&link_status, &self->link_status, sizeof(link_status))) {
-               if (link_status.mbps) {
-                       aq_utils_obj_set(&self->header.flags,
-                                        AQ_NIC_FLAG_STARTED);
-                       aq_utils_obj_clear(&self->header.flags,
-                                          AQ_NIC_LINK_DOWN);
-                       netif_carrier_on(self->ndev);
-               } else {
-                       netif_carrier_off(self->ndev);
-                       aq_utils_obj_set(&self->header.flags, AQ_NIC_LINK_DOWN);
-               }
+       self->link_status = self->aq_hw->aq_link_status;
 
-               self->link_status = link_status;
+       self->aq_hw_ops.hw_interrupt_moderation_set(self->aq_hw,
+                   self->aq_nic_cfg.is_interrupt_moderation);
+
+       if (self->link_status.mbps) {
+               aq_utils_obj_set(&self->header.flags,
+                                AQ_NIC_FLAG_STARTED);
+               aq_utils_obj_clear(&self->header.flags,
+                                  AQ_NIC_LINK_DOWN);
+               netif_carrier_on(self->ndev);
+       } else {
+               netif_carrier_off(self->ndev);
+               aq_utils_obj_set(&self->header.flags, AQ_NIC_LINK_DOWN);
        }
 
        memset(&stats_rx, 0U, sizeof(struct aq_ring_stats_rx_s));
index 8d6d8f5804daf2f431f0c93fcc8e4a2a7a1983ee..7a1332e9b9bce069423efcfd1f198b8701351788 100644 (file)
@@ -313,11 +313,11 @@ void hw_atl_utils_mpi_set(struct aq_hw_s *self,
 err_exit:;
 }
 
-int hw_atl_utils_mpi_get_link_status(struct aq_hw_s *self,
-                                    struct aq_hw_link_status_s *link_status)
+int hw_atl_utils_mpi_get_link_status(struct aq_hw_s *self)
 {
        u32 cp0x036C = aq_hw_read_reg(self, HW_ATL_MPI_STATE_ADR);
        u32 link_speed_mask = cp0x036C >> HW_ATL_MPI_SPEED_SHIFT;
+       struct aq_hw_link_status_s *link_status = &self->aq_link_status;
 
        if (!link_speed_mask) {
                link_status->mbps = 0U;
index a66aee51ab5b049c4e9f6367aebdd57cbbf5fc5a..e0360a6b2202ef5b4ac683a44edcde9bf20ebedc 100644 (file)
@@ -180,8 +180,7 @@ void hw_atl_utils_mpi_set(struct aq_hw_s *self,
 int hw_atl_utils_mpi_set_speed(struct aq_hw_s *self, u32 speed,
                               enum hal_atl_utils_fw_state_e state);
 
-int hw_atl_utils_mpi_get_link_status(struct aq_hw_s *self,
-                                    struct aq_hw_link_status_s *link_status);
+int hw_atl_utils_mpi_get_link_status(struct aq_hw_s *self);
 
 int hw_atl_utils_get_mac_permanent(struct aq_hw_s *self,
                                   struct aq_hw_caps_s *aq_hw_caps,