diff options
| author | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
| commit | 1ac731c529cd4d6adbce134754b51ff7d822b145 (patch) | |
| tree | 143ab3f35ca5f3b69f583c84e6964b17139c2ec1 /drivers/net/ethernet/renesas/rswitch.c | |
| parent | 07b4c950f27bef0362dc6ad7ee713aab61d58149 (diff) | |
| parent | 54116d442e001e1b6bd482122043b1870998a1f3 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.6 merge window.
Diffstat (limited to 'drivers/net/ethernet/renesas/rswitch.c')
| -rw-r--r-- | drivers/net/ethernet/renesas/rswitch.c | 61 | 
1 files changed, 38 insertions, 23 deletions
diff --git a/drivers/net/ethernet/renesas/rswitch.c b/drivers/net/ethernet/renesas/rswitch.c index 853394e5bb8b..fa6d6202b129 100644 --- a/drivers/net/ethernet/renesas/rswitch.c +++ b/drivers/net/ethernet/renesas/rswitch.c @@ -347,17 +347,6 @@ out:  	return -ENOMEM;  } -static int rswitch_gwca_ts_queue_alloc(struct rswitch_private *priv) -{ -	struct rswitch_gwca_queue *gq = &priv->gwca.ts_queue; - -	gq->ring_size = TS_RING_SIZE; -	gq->ts_ring = dma_alloc_coherent(&priv->pdev->dev, -					 sizeof(struct rswitch_ts_desc) * -					 (gq->ring_size + 1), &gq->ring_dma, GFP_KERNEL); -	return !gq->ts_ring ? -ENOMEM : 0; -} -  static void rswitch_desc_set_dptr(struct rswitch_desc *desc, dma_addr_t addr)  {  	desc->dptrl = cpu_to_le32(lower_32_bits(addr)); @@ -533,6 +522,28 @@ static void rswitch_gwca_linkfix_free(struct rswitch_private *priv)  	gwca->linkfix_table = NULL;  } +static int rswitch_gwca_ts_queue_alloc(struct rswitch_private *priv) +{ +	struct rswitch_gwca_queue *gq = &priv->gwca.ts_queue; +	struct rswitch_ts_desc *desc; + +	gq->ring_size = TS_RING_SIZE; +	gq->ts_ring = dma_alloc_coherent(&priv->pdev->dev, +					 sizeof(struct rswitch_ts_desc) * +					 (gq->ring_size + 1), &gq->ring_dma, GFP_KERNEL); + +	if (!gq->ts_ring) +		return -ENOMEM; + +	rswitch_gwca_ts_queue_fill(priv, 0, TS_RING_SIZE); +	desc = &gq->ts_ring[gq->ring_size]; +	desc->desc.die_dt = DT_LINKFIX; +	rswitch_desc_set_dptr(&desc->desc, gq->ring_dma); +	INIT_LIST_HEAD(&priv->gwca.ts_info_list); + +	return 0; +} +  static struct rswitch_gwca_queue *rswitch_gwca_get(struct rswitch_private *priv)  {  	struct rswitch_gwca_queue *gq; @@ -702,13 +713,14 @@ static bool rswitch_rx(struct net_device *ndev, int *quota)  	u16 pkt_len;  	u32 get_ts; +	if (*quota <= 0) +		return true; +  	boguscnt = min_t(int, gq->ring_size, *quota);  	limit = boguscnt;  	desc = &gq->rx_ring[gq->cur];  	while ((desc->desc.die_dt & DT_MASK) != DT_FEMPTY) { -		if (--boguscnt < 0) -			break;  		dma_rmb();  		pkt_len = le16_to_cpu(desc->desc.info_ds) & RX_DS;  		skb = gq->skbs[gq->cur]; @@ -734,6 +746,9 @@ static bool rswitch_rx(struct net_device *ndev, int *quota)  		gq->cur = rswitch_next_queue_index(gq, true, 1);  		desc = &gq->rx_ring[gq->cur]; + +		if (--boguscnt <= 0) +			break;  	}  	num = rswitch_get_num_cur_queues(gq); @@ -745,7 +760,7 @@ static bool rswitch_rx(struct net_device *ndev, int *quota)  		goto err;  	gq->dirty = rswitch_next_queue_index(gq, false, num); -	*quota -= limit - (++boguscnt); +	*quota -= limit - boguscnt;  	return boguscnt <= 0; @@ -1320,10 +1335,8 @@ out:  static void rswitch_phy_device_deinit(struct rswitch_device *rdev)  { -	if (rdev->ndev->phydev) { +	if (rdev->ndev->phydev)  		phy_disconnect(rdev->ndev->phydev); -		rdev->ndev->phydev = NULL; -	}  }  static int rswitch_serdes_set_params(struct rswitch_device *rdev) @@ -1437,7 +1450,10 @@ static int rswitch_open(struct net_device *ndev)  	rswitch_enadis_data_irq(rdev->priv, rdev->tx_queue->index, true);  	rswitch_enadis_data_irq(rdev->priv, rdev->rx_queue->index, true); -	iowrite32(GWCA_TS_IRQ_BIT, rdev->priv->addr + GWTSDIE); +	if (bitmap_empty(rdev->priv->opened_ports, RSWITCH_NUM_PORTS)) +		iowrite32(GWCA_TS_IRQ_BIT, rdev->priv->addr + GWTSDIE); + +	bitmap_set(rdev->priv->opened_ports, rdev->port, 1);  	return 0;  }; @@ -1448,8 +1464,10 @@ static int rswitch_stop(struct net_device *ndev)  	struct rswitch_gwca_ts_info *ts_info, *ts_info2;  	netif_tx_stop_all_queues(ndev); +	bitmap_clear(rdev->priv->opened_ports, rdev->port, 1); -	iowrite32(GWCA_TS_IRQ_BIT, rdev->priv->addr + GWTSDID); +	if (bitmap_empty(rdev->priv->opened_ports, RSWITCH_NUM_PORTS)) +		iowrite32(GWCA_TS_IRQ_BIT, rdev->priv->addr + GWTSDID);  	list_for_each_entry_safe(ts_info, ts_info2, &rdev->priv->gwca.ts_info_list, list) {  		if (ts_info->port != rdev->port) @@ -1478,7 +1496,7 @@ static netdev_tx_t rswitch_start_xmit(struct sk_buff *skb, struct net_device *nd  	if (rswitch_get_num_cur_queues(gq) >= gq->ring_size - 1) {  		netif_stop_subqueue(ndev, 0); -		return ret; +		return NETDEV_TX_BUSY;  	}  	if (skb_put_padto(skb, ETH_ZLEN)) @@ -1773,9 +1791,6 @@ static int rswitch_init(struct rswitch_private *priv)  	if (err < 0)  		goto err_ts_queue_alloc; -	rswitch_gwca_ts_queue_fill(priv, 0, TS_RING_SIZE); -	INIT_LIST_HEAD(&priv->gwca.ts_info_list); -  	for (i = 0; i < RSWITCH_NUM_PORTS; i++) {  		err = rswitch_device_alloc(priv, i);  		if (err < 0) {  |