net: hns: separate debug dsaf device from service dsaf device
[deliverable/linux.git] / drivers / net / ethernet / hisilicon / hns / hns_ae_adapt.c
index a1cb461ac45f832763b4f1cf61b6764c62574c96..58341dad80421c8dadbd89109bbf37d0ab198e5f 100644 (file)
@@ -29,25 +29,6 @@ static struct hns_mac_cb *hns_get_mac_cb(struct hnae_handle *handle)
        return vf_cb->mac_cb;
 }
 
-/**
- * hns_ae_map_eport_to_dport - translate enet port id to dsaf port id
- * @port_id: enet port id
- *: debug port 0-1, service port 2 -7 (dsaf mode only 2)
- * return: dsaf port id
- *: service ports 0 - 5, debug port 6-7
- **/
-static int hns_ae_map_eport_to_dport(u32 port_id)
-{
-       int port_index;
-
-       if (port_id < DSAF_DEBUG_NW_NUM)
-               port_index = port_id + DSAF_SERVICE_PORT_NUM_PER_DSAF;
-       else
-               port_index = port_id - DSAF_DEBUG_NW_NUM;
-
-       return port_index;
-}
-
 static struct dsaf_device *hns_ae_get_dsaf_dev(struct hnae_ae_dev *dev)
 {
        return container_of(dev, struct dsaf_device, ae_dev);
@@ -56,50 +37,35 @@ static struct dsaf_device *hns_ae_get_dsaf_dev(struct hnae_ae_dev *dev)
 static struct hns_ppe_cb *hns_get_ppe_cb(struct hnae_handle *handle)
 {
        int ppe_index;
-       int ppe_common_index;
        struct ppe_common_cb *ppe_comm;
        struct  hnae_vf_cb *vf_cb = hns_ae_get_vf_cb(handle);
 
-       if (vf_cb->port_index < DSAF_SERVICE_PORT_NUM_PER_DSAF) {
-               ppe_index = vf_cb->port_index;
-               ppe_common_index = 0;
-       } else {
-               ppe_index = 0;
-               ppe_common_index =
-                       vf_cb->port_index - DSAF_SERVICE_PORT_NUM_PER_DSAF + 1;
-       }
-       ppe_comm = vf_cb->dsaf_dev->ppe_common[ppe_common_index];
+       ppe_comm = vf_cb->dsaf_dev->ppe_common[0];
+       ppe_index = vf_cb->port_index;
+
        return &ppe_comm->ppe_cb[ppe_index];
 }
 
 static int hns_ae_get_q_num_per_vf(
        struct dsaf_device *dsaf_dev, int port)
 {
-       int common_idx = hns_dsaf_get_comm_idx_by_port(port);
-
-       return dsaf_dev->rcb_common[common_idx]->max_q_per_vf;
+       return dsaf_dev->rcb_common[0]->max_q_per_vf;
 }
 
 static int hns_ae_get_vf_num_per_port(
        struct dsaf_device *dsaf_dev, int port)
 {
-       int common_idx = hns_dsaf_get_comm_idx_by_port(port);
-
-       return dsaf_dev->rcb_common[common_idx]->max_vfn;
+       return dsaf_dev->rcb_common[0]->max_vfn;
 }
 
 static struct ring_pair_cb *hns_ae_get_base_ring_pair(
        struct dsaf_device *dsaf_dev, int port)
 {
-       int common_idx = hns_dsaf_get_comm_idx_by_port(port);
-       struct rcb_common_cb *rcb_comm = dsaf_dev->rcb_common[common_idx];
+       struct rcb_common_cb *rcb_comm = dsaf_dev->rcb_common[0];
        int q_num = rcb_comm->max_q_per_vf;
        int vf_num = rcb_comm->max_vfn;
 
-       if (common_idx == HNS_DSAF_COMM_SERVICE_NW_IDX)
-               return &rcb_comm->ring_pair_cb[port * q_num * vf_num];
-       else
-               return &rcb_comm->ring_pair_cb[0];
+       return &rcb_comm->ring_pair_cb[port * q_num * vf_num];
 }
 
 static struct ring_pair_cb *hns_ae_get_ring_pair(struct hnae_queue *q)
@@ -110,7 +76,6 @@ static struct ring_pair_cb *hns_ae_get_ring_pair(struct hnae_queue *q)
 struct hnae_handle *hns_ae_get_handle(struct hnae_ae_dev *dev,
                                      u32 port_id)
 {
-       int port_idx;
        int vfnum_per_port;
        int qnum_per_vf;
        int i;
@@ -120,11 +85,10 @@ struct hnae_handle *hns_ae_get_handle(struct hnae_ae_dev *dev,
        struct hnae_vf_cb *vf_cb;
 
        dsaf_dev = hns_ae_get_dsaf_dev(dev);
-       port_idx = hns_ae_map_eport_to_dport(port_id);
 
-       ring_pair_cb = hns_ae_get_base_ring_pair(dsaf_dev, port_idx);
-       vfnum_per_port = hns_ae_get_vf_num_per_port(dsaf_dev, port_idx);
-       qnum_per_vf = hns_ae_get_q_num_per_vf(dsaf_dev, port_idx);
+       ring_pair_cb = hns_ae_get_base_ring_pair(dsaf_dev, port_id);
+       vfnum_per_port = hns_ae_get_vf_num_per_port(dsaf_dev, port_id);
+       qnum_per_vf = hns_ae_get_q_num_per_vf(dsaf_dev, port_id);
 
        vf_cb = kzalloc(sizeof(*vf_cb) +
                        qnum_per_vf * sizeof(struct hnae_queue *), GFP_KERNEL);
@@ -163,14 +127,14 @@ struct hnae_handle *hns_ae_get_handle(struct hnae_ae_dev *dev,
        }
 
        vf_cb->dsaf_dev = dsaf_dev;
-       vf_cb->port_index = port_idx;
-       vf_cb->mac_cb = &dsaf_dev->mac_cb[port_idx];
+       vf_cb->port_index = port_id;
+       vf_cb->mac_cb = dsaf_dev->mac_cb[port_id];
 
        ae_handle->phy_if = vf_cb->mac_cb->phy_if;
        ae_handle->phy_node = vf_cb->mac_cb->phy_node;
        ae_handle->if_support = vf_cb->mac_cb->if_support;
        ae_handle->port_type = vf_cb->mac_cb->mac_type;
-       ae_handle->dport_id = port_idx;
+       ae_handle->dport_id = port_id;
 
        return ae_handle;
 vf_id_err:
@@ -320,11 +284,8 @@ static void hns_ae_reset(struct hnae_handle *handle)
        struct hnae_vf_cb *vf_cb = hns_ae_get_vf_cb(handle);
 
        if (vf_cb->mac_cb->mac_type == HNAE_PORT_DEBUG) {
-               u8 ppe_common_index =
-                       vf_cb->port_index - DSAF_SERVICE_PORT_NUM_PER_DSAF + 1;
-
                hns_mac_reset(vf_cb->mac_cb);
-               hns_ppe_reset_common(vf_cb->dsaf_dev, ppe_common_index);
+               hns_ppe_reset_common(vf_cb->dsaf_dev, 0);
        }
 }
 
@@ -399,11 +360,16 @@ static void hns_ae_get_ring_bdnum_limit(struct hnae_queue *queue,
 static void hns_ae_get_pauseparam(struct hnae_handle *handle,
                                  u32 *auto_neg, u32 *rx_en, u32 *tx_en)
 {
-       assert(handle);
+       struct hns_mac_cb *mac_cb = hns_get_mac_cb(handle);
+       struct dsaf_device *dsaf_dev = mac_cb->dsaf_dev;
+
+       hns_mac_get_autoneg(mac_cb, auto_neg);
 
-       hns_mac_get_autoneg(hns_get_mac_cb(handle), auto_neg);
+       hns_mac_get_pauseparam(mac_cb, rx_en, tx_en);
 
-       hns_mac_get_pauseparam(hns_get_mac_cb(handle), rx_en, tx_en);
+       /* Service port's pause feature is provided by DSAF, not mac */
+       if (handle->port_type == HNAE_PORT_SERVICE)
+               hns_dsaf_get_rx_mac_pause_en(dsaf_dev, mac_cb->mac_id, rx_en);
 }
 
 static int hns_ae_set_autoneg(struct hnae_handle *handle, u8 enable)
@@ -436,12 +402,21 @@ static int hns_ae_set_pauseparam(struct hnae_handle *handle,
                                 u32 autoneg, u32 rx_en, u32 tx_en)
 {
        struct hns_mac_cb *mac_cb = hns_get_mac_cb(handle);
+       struct dsaf_device *dsaf_dev = mac_cb->dsaf_dev;
        int ret;
 
        ret = hns_mac_set_autoneg(mac_cb, autoneg);
        if (ret)
                return ret;
 
+       /* Service port's pause feature is provided by DSAF, not mac */
+       if (handle->port_type == HNAE_PORT_SERVICE) {
+               ret = hns_dsaf_set_rx_mac_pause_en(dsaf_dev,
+                                                  mac_cb->mac_id, rx_en);
+               if (ret)
+                       return ret;
+               rx_en = 0;
+       }
        return hns_mac_set_pauseparam(mac_cb, rx_en, tx_en);
 }
 
@@ -709,7 +684,6 @@ int hns_ae_cpld_set_led_id(struct hnae_handle *handle,
 void hns_ae_get_regs(struct hnae_handle *handle, void *data)
 {
        u32 *p = data;
-       u32 rcb_com_idx;
        int i;
        struct hnae_vf_cb *vf_cb = hns_ae_get_vf_cb(handle);
        struct hns_ppe_cb *ppe_cb = hns_get_ppe_cb(handle);
@@ -717,8 +691,7 @@ void hns_ae_get_regs(struct hnae_handle *handle, void *data)
        hns_ppe_get_regs(ppe_cb, p);
        p += hns_ppe_get_regs_count();
 
-       rcb_com_idx = hns_dsaf_get_comm_idx_by_port(vf_cb->port_index);
-       hns_rcb_get_common_regs(vf_cb->dsaf_dev->rcb_common[rcb_com_idx], p);
+       hns_rcb_get_common_regs(vf_cb->dsaf_dev->rcb_common[0], p);
        p += hns_rcb_get_common_regs_count();
 
        for (i = 0; i < handle->q_num; i++) {
This page took 0.03894 seconds and 5 git commands to generate.