Skip to content

Commit ad4bd2c

Browse files
shimodaygregkh
authored andcommitted
net: rswitch: Use unsigned int for desc related array index
[ Upstream commit 8857034 ] Array index should not be negative, so use unsigned int for descriptors related array index. Signed-off-by: Yoshihiro Shimoda <[email protected]> Signed-off-by: David S. Miller <[email protected]> Stable-dep-of: 0c9547e ("net: renesas: rswitch: fix race window between tx start and complete") Signed-off-by: Sasha Levin <[email protected]>
1 parent 2a584b1 commit ad4bd2c

File tree

2 files changed

+56
-46
lines changed

2 files changed

+56
-46
lines changed

drivers/net/ethernet/renesas/rswitch.c

Lines changed: 49 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ static void rswitch_clock_disable(struct rswitch_private *priv)
5555
iowrite32(RCDC_RCD, priv->addr + RCDC);
5656
}
5757

58-
static bool rswitch_agent_clock_is_enabled(void __iomem *coma_addr, int port)
58+
static bool rswitch_agent_clock_is_enabled(void __iomem *coma_addr,
59+
unsigned int port)
5960
{
6061
u32 val = ioread32(coma_addr + RCEC);
6162

@@ -65,7 +66,8 @@ static bool rswitch_agent_clock_is_enabled(void __iomem *coma_addr, int port)
6566
return false;
6667
}
6768

68-
static void rswitch_agent_clock_ctrl(void __iomem *coma_addr, int port, int enable)
69+
static void rswitch_agent_clock_ctrl(void __iomem *coma_addr, unsigned int port,
70+
int enable)
6971
{
7072
u32 val;
7173

@@ -99,7 +101,7 @@ static void rswitch_coma_init(struct rswitch_private *priv)
99101
/* R-Switch-2 block (TOP) */
100102
static void rswitch_top_init(struct rswitch_private *priv)
101103
{
102-
int i;
104+
unsigned int i;
103105

104106
for (i = 0; i < RSWITCH_MAX_NUM_QUEUES; i++)
105107
iowrite32((i / 16) << (GWCA_INDEX * 8), priv->addr + TPEMIMC7(i));
@@ -108,7 +110,7 @@ static void rswitch_top_init(struct rswitch_private *priv)
108110
/* Forwarding engine block (MFWD) */
109111
static void rswitch_fwd_init(struct rswitch_private *priv)
110112
{
111-
int i;
113+
unsigned int i;
112114

113115
/* For ETHA */
114116
for (i = 0; i < RSWITCH_NUM_PORTS; i++) {
@@ -165,7 +167,7 @@ static int rswitch_gwca_axi_ram_reset(struct rswitch_private *priv)
165167
static bool rswitch_is_any_data_irq(struct rswitch_private *priv, u32 *dis, bool tx)
166168
{
167169
u32 *mask = tx ? priv->gwca.tx_irq_bits : priv->gwca.rx_irq_bits;
168-
int i;
170+
unsigned int i;
169171

170172
for (i = 0; i < RSWITCH_NUM_IRQ_REGS; i++) {
171173
if (dis[i] & mask[i])
@@ -177,31 +179,34 @@ static bool rswitch_is_any_data_irq(struct rswitch_private *priv, u32 *dis, bool
177179

178180
static void rswitch_get_data_irq_status(struct rswitch_private *priv, u32 *dis)
179181
{
180-
int i;
182+
unsigned int i;
181183

182184
for (i = 0; i < RSWITCH_NUM_IRQ_REGS; i++) {
183185
dis[i] = ioread32(priv->addr + GWDIS(i));
184186
dis[i] &= ioread32(priv->addr + GWDIE(i));
185187
}
186188
}
187189

188-
static void rswitch_enadis_data_irq(struct rswitch_private *priv, int index, bool enable)
190+
static void rswitch_enadis_data_irq(struct rswitch_private *priv,
191+
unsigned int index, bool enable)
189192
{
190193
u32 offs = enable ? GWDIE(index / 32) : GWDID(index / 32);
191194

192195
iowrite32(BIT(index % 32), priv->addr + offs);
193196
}
194197

195-
static void rswitch_ack_data_irq(struct rswitch_private *priv, int index)
198+
static void rswitch_ack_data_irq(struct rswitch_private *priv,
199+
unsigned int index)
196200
{
197201
u32 offs = GWDIS(index / 32);
198202

199203
iowrite32(BIT(index % 32), priv->addr + offs);
200204
}
201205

202-
static int rswitch_next_queue_index(struct rswitch_gwca_queue *gq, bool cur, int num)
206+
static unsigned int rswitch_next_queue_index(struct rswitch_gwca_queue *gq,
207+
bool cur, unsigned int num)
203208
{
204-
int index = cur ? gq->cur : gq->dirty;
209+
unsigned int index = cur ? gq->cur : gq->dirty;
205210

206211
if (index + num >= gq->ring_size)
207212
index = (index + num) % gq->ring_size;
@@ -211,7 +216,7 @@ static int rswitch_next_queue_index(struct rswitch_gwca_queue *gq, bool cur, int
211216
return index;
212217
}
213218

214-
static int rswitch_get_num_cur_queues(struct rswitch_gwca_queue *gq)
219+
static unsigned int rswitch_get_num_cur_queues(struct rswitch_gwca_queue *gq)
215220
{
216221
if (gq->cur >= gq->dirty)
217222
return gq->cur - gq->dirty;
@@ -230,9 +235,10 @@ static bool rswitch_is_queue_rxed(struct rswitch_gwca_queue *gq)
230235
}
231236

232237
static int rswitch_gwca_queue_alloc_skb(struct rswitch_gwca_queue *gq,
233-
int start_index, int num)
238+
unsigned int start_index,
239+
unsigned int num)
234240
{
235-
int i, index;
241+
unsigned int i, index;
236242

237243
for (i = 0; i < num; i++) {
238244
index = (i + start_index) % gq->ring_size;
@@ -247,7 +253,7 @@ static int rswitch_gwca_queue_alloc_skb(struct rswitch_gwca_queue *gq,
247253
return 0;
248254

249255
err:
250-
for (i--; i >= 0; i--) {
256+
for (; i-- > 0; ) {
251257
index = (i + start_index) % gq->ring_size;
252258
dev_kfree_skb(gq->skbs[index]);
253259
gq->skbs[index] = NULL;
@@ -259,7 +265,7 @@ static int rswitch_gwca_queue_alloc_skb(struct rswitch_gwca_queue *gq,
259265
static void rswitch_gwca_queue_free(struct net_device *ndev,
260266
struct rswitch_gwca_queue *gq)
261267
{
262-
int i;
268+
unsigned int i;
263269

264270
if (!gq->dir_tx) {
265271
dma_free_coherent(ndev->dev.parent,
@@ -293,9 +299,9 @@ static void rswitch_gwca_ts_queue_free(struct rswitch_private *priv)
293299
static int rswitch_gwca_queue_alloc(struct net_device *ndev,
294300
struct rswitch_private *priv,
295301
struct rswitch_gwca_queue *gq,
296-
bool dir_tx, int ring_size)
302+
bool dir_tx, unsigned int ring_size)
297303
{
298-
int i, bit;
304+
unsigned int i, bit;
299305

300306
gq->dir_tx = dir_tx;
301307
gq->ring_size = ring_size;
@@ -350,11 +356,11 @@ static int rswitch_gwca_queue_format(struct net_device *ndev,
350356
struct rswitch_private *priv,
351357
struct rswitch_gwca_queue *gq)
352358
{
353-
int ring_size = sizeof(struct rswitch_ext_desc) * gq->ring_size;
359+
unsigned int ring_size = sizeof(struct rswitch_ext_desc) * gq->ring_size;
354360
struct rswitch_ext_desc *desc;
355361
struct rswitch_desc *linkfix;
356362
dma_addr_t dma_addr;
357-
int i;
363+
unsigned int i;
358364

359365
memset(gq->tx_ring, 0, ring_size);
360366
for (i = 0, desc = gq->tx_ring; i < gq->ring_size; i++, desc++) {
@@ -386,7 +392,7 @@ static int rswitch_gwca_queue_format(struct net_device *ndev,
386392

387393
err:
388394
if (!gq->dir_tx) {
389-
for (i--, desc = gq->tx_ring; i >= 0; i--, desc++) {
395+
for (desc = gq->tx_ring; i-- > 0; desc++) {
390396
dma_addr = rswitch_desc_get_dptr(&desc->desc);
391397
dma_unmap_single(ndev->dev.parent, dma_addr, PKT_BUF_SZ,
392398
DMA_FROM_DEVICE);
@@ -397,11 +403,12 @@ static int rswitch_gwca_queue_format(struct net_device *ndev,
397403
}
398404

399405
static void rswitch_gwca_ts_queue_fill(struct rswitch_private *priv,
400-
int start_index, int num)
406+
unsigned int start_index,
407+
unsigned int num)
401408
{
402409
struct rswitch_gwca_queue *gq = &priv->gwca.ts_queue;
403410
struct rswitch_ts_desc *desc;
404-
int i, index;
411+
unsigned int i, index;
405412

406413
for (i = 0; i < num; i++) {
407414
index = (i + start_index) % gq->ring_size;
@@ -412,12 +419,13 @@ static void rswitch_gwca_ts_queue_fill(struct rswitch_private *priv,
412419

413420
static int rswitch_gwca_queue_ext_ts_fill(struct net_device *ndev,
414421
struct rswitch_gwca_queue *gq,
415-
int start_index, int num)
422+
unsigned int start_index,
423+
unsigned int num)
416424
{
417425
struct rswitch_device *rdev = netdev_priv(ndev);
418426
struct rswitch_ext_ts_desc *desc;
427+
unsigned int i, index;
419428
dma_addr_t dma_addr;
420-
int i, index;
421429

422430
for (i = 0; i < num; i++) {
423431
index = (i + start_index) % gq->ring_size;
@@ -443,7 +451,7 @@ static int rswitch_gwca_queue_ext_ts_fill(struct net_device *ndev,
443451

444452
err:
445453
if (!gq->dir_tx) {
446-
for (i--; i >= 0; i--) {
454+
for (; i-- > 0; ) {
447455
index = (i + start_index) % gq->ring_size;
448456
desc = &gq->rx_ring[index];
449457
dma_addr = rswitch_desc_get_dptr(&desc->desc);
@@ -459,7 +467,7 @@ static int rswitch_gwca_queue_ext_ts_format(struct net_device *ndev,
459467
struct rswitch_private *priv,
460468
struct rswitch_gwca_queue *gq)
461469
{
462-
int ring_size = sizeof(struct rswitch_ext_ts_desc) * gq->ring_size;
470+
unsigned int ring_size = sizeof(struct rswitch_ext_ts_desc) * gq->ring_size;
463471
struct rswitch_ext_ts_desc *desc;
464472
struct rswitch_desc *linkfix;
465473
int err;
@@ -486,7 +494,7 @@ static int rswitch_gwca_queue_ext_ts_format(struct net_device *ndev,
486494

487495
static int rswitch_gwca_linkfix_alloc(struct rswitch_private *priv)
488496
{
489-
int i, num_queues = priv->gwca.num_queues;
497+
unsigned int i, num_queues = priv->gwca.num_queues;
490498
struct rswitch_gwca *gwca = &priv->gwca;
491499
struct device *dev = &priv->pdev->dev;
492500

@@ -536,7 +544,7 @@ static int rswitch_gwca_ts_queue_alloc(struct rswitch_private *priv)
536544
static struct rswitch_gwca_queue *rswitch_gwca_get(struct rswitch_private *priv)
537545
{
538546
struct rswitch_gwca_queue *gq;
539-
int index;
547+
unsigned int index;
540548

541549
index = find_first_zero_bit(priv->gwca.used, priv->gwca.num_queues);
542550
if (index >= priv->gwca.num_queues)
@@ -582,7 +590,7 @@ static void rswitch_txdmac_free(struct net_device *ndev)
582590
rswitch_gwca_put(rdev->priv, rdev->tx_queue);
583591
}
584592

585-
static int rswitch_txdmac_init(struct rswitch_private *priv, int index)
593+
static int rswitch_txdmac_init(struct rswitch_private *priv, unsigned int index)
586594
{
587595
struct rswitch_device *rdev = priv->rdev[index];
588596

@@ -616,7 +624,7 @@ static void rswitch_rxdmac_free(struct net_device *ndev)
616624
rswitch_gwca_put(rdev->priv, rdev->rx_queue);
617625
}
618626

619-
static int rswitch_rxdmac_init(struct rswitch_private *priv, int index)
627+
static int rswitch_rxdmac_init(struct rswitch_private *priv, unsigned int index)
620628
{
621629
struct rswitch_device *rdev = priv->rdev[index];
622630
struct net_device *ndev = rdev->ndev;
@@ -626,7 +634,8 @@ static int rswitch_rxdmac_init(struct rswitch_private *priv, int index)
626634

627635
static int rswitch_gwca_hw_init(struct rswitch_private *priv)
628636
{
629-
int i, err;
637+
unsigned int i;
638+
int err;
630639

631640
err = rswitch_gwca_change_mode(priv, GWMC_OPC_DISABLE);
632641
if (err < 0)
@@ -697,9 +706,10 @@ static bool rswitch_rx(struct net_device *ndev, int *quota)
697706
struct rswitch_device *rdev = netdev_priv(ndev);
698707
struct rswitch_gwca_queue *gq = rdev->rx_queue;
699708
struct rswitch_ext_ts_desc *desc;
700-
int limit, boguscnt, num, ret;
709+
int limit, boguscnt, ret;
701710
struct sk_buff *skb;
702711
dma_addr_t dma_addr;
712+
unsigned int num;
703713
u16 pkt_len;
704714
u32 get_ts;
705715

@@ -767,7 +777,7 @@ static void rswitch_tx_free(struct net_device *ndev)
767777
struct rswitch_ext_desc *desc;
768778
dma_addr_t dma_addr;
769779
struct sk_buff *skb;
770-
int size;
780+
unsigned int size;
771781

772782
for (; rswitch_get_num_cur_queues(gq) > 0;
773783
gq->dirty = rswitch_next_queue_index(gq, false, 1)) {
@@ -846,7 +856,7 @@ static void rswitch_queue_interrupt(struct net_device *ndev)
846856
static irqreturn_t rswitch_data_irq(struct rswitch_private *priv, u32 *dis)
847857
{
848858
struct rswitch_gwca_queue *gq;
849-
int i, index, bit;
859+
unsigned int i, index, bit;
850860

851861
for (i = 0; i < priv->gwca.num_queues; i++) {
852862
gq = &priv->gwca.queues[i];
@@ -913,8 +923,8 @@ static void rswitch_ts(struct rswitch_private *priv)
913923
struct skb_shared_hwtstamps shhwtstamps;
914924
struct rswitch_ts_desc *desc;
915925
struct timespec64 ts;
926+
unsigned int num;
916927
u32 tag, port;
917-
int num;
918928

919929
desc = &gq->ts_ring[gq->cur];
920930
while ((desc->desc.die_dt & DT_MASK) != DT_FEMPTY_ND) {
@@ -1431,7 +1441,7 @@ static int rswitch_ether_port_init_all(struct rswitch_private *priv)
14311441

14321442
static void rswitch_ether_port_deinit_all(struct rswitch_private *priv)
14331443
{
1434-
int i;
1444+
unsigned int i;
14351445

14361446
for (i = 0; i < RSWITCH_NUM_PORTS; i++) {
14371447
phy_exit(priv->rdev[i]->serdes);
@@ -1686,7 +1696,7 @@ static const struct of_device_id renesas_eth_sw_of_table[] = {
16861696
};
16871697
MODULE_DEVICE_TABLE(of, renesas_eth_sw_of_table);
16881698

1689-
static void rswitch_etha_init(struct rswitch_private *priv, int index)
1699+
static void rswitch_etha_init(struct rswitch_private *priv, unsigned int index)
16901700
{
16911701
struct rswitch_etha *etha = &priv->etha[index];
16921702

@@ -1702,7 +1712,7 @@ static void rswitch_etha_init(struct rswitch_private *priv, int index)
17021712
etha->psmcs = clk_get_rate(priv->clk) / 100000 / (25 * 2) - 1;
17031713
}
17041714

1705-
static int rswitch_device_alloc(struct rswitch_private *priv, int index)
1715+
static int rswitch_device_alloc(struct rswitch_private *priv, unsigned int index)
17061716
{
17071717
struct platform_device *pdev = priv->pdev;
17081718
struct rswitch_device *rdev;
@@ -1773,7 +1783,7 @@ static int rswitch_device_alloc(struct rswitch_private *priv, int index)
17731783
return err;
17741784
}
17751785

1776-
static void rswitch_device_free(struct rswitch_private *priv, int index)
1786+
static void rswitch_device_free(struct rswitch_private *priv, unsigned int index)
17771787
{
17781788
struct rswitch_device *rdev = priv->rdev[index];
17791789
struct net_device *ndev = rdev->ndev;

drivers/net/ethernet/renesas/rswitch.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -909,7 +909,7 @@ struct rswitch_ext_ts_desc {
909909
} __packed;
910910

911911
struct rswitch_etha {
912-
int index;
912+
unsigned int index;
913913
void __iomem *addr;
914914
void __iomem *coma_addr;
915915
bool external_phy;
@@ -938,12 +938,12 @@ struct rswitch_gwca_queue {
938938

939939
/* Common */
940940
dma_addr_t ring_dma;
941-
int ring_size;
942-
int cur;
943-
int dirty;
941+
unsigned int ring_size;
942+
unsigned int cur;
943+
unsigned int dirty;
944944

945-
/* For [rt]_ring */
946-
int index;
945+
/* For [rt]x_ring */
946+
unsigned int index;
947947
bool dir_tx;
948948
struct sk_buff **skbs;
949949
struct net_device *ndev; /* queue to ndev for irq */
@@ -959,7 +959,7 @@ struct rswitch_gwca_ts_info {
959959

960960
#define RSWITCH_NUM_IRQ_REGS (RSWITCH_MAX_NUM_QUEUES / BITS_PER_TYPE(u32))
961961
struct rswitch_gwca {
962-
int index;
962+
unsigned int index;
963963
struct rswitch_desc *linkfix_table;
964964
dma_addr_t linkfix_table_dma;
965965
u32 linkfix_table_size;

0 commit comments

Comments
 (0)