Skip to content

Commit 50c7568

Browse files
Joakim Zhanggregkh
authored andcommitted
net: stmmac: fix dma physical address of descriptor when display ring
[ Upstream commit bfaf91c ] Driver uses dma_alloc_coherent to allocate dma memory for descriptors, dma_alloc_coherent will return both the virtual address and physical address. AFAIK, virt_to_phys could not convert virtual address to physical address, for which memory is allocated by dma_alloc_coherent. dwmac4_display_ring() function is broken for various descriptor, it only support normal descriptor(struct dma_desc) now, this patch also extends to support all descriptor types. Signed-off-by: Joakim Zhang <qiangqing.zhang@nxp.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent a9daba1 commit 50c7568

5 files changed

Lines changed: 94 additions & 34 deletions

File tree

drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -402,19 +402,53 @@ static void dwmac4_rd_set_tx_ic(struct dma_desc *p)
402402
p->des2 |= cpu_to_le32(TDES2_INTERRUPT_ON_COMPLETION);
403403
}
404404

405-
static void dwmac4_display_ring(void *head, unsigned int size, bool rx)
405+
static void dwmac4_display_ring(void *head, unsigned int size, bool rx,
406+
dma_addr_t dma_rx_phy, unsigned int desc_size)
406407
{
407-
struct dma_desc *p = (struct dma_desc *)head;
408+
dma_addr_t dma_addr;
408409
int i;
409410

410411
pr_info("%s descriptor ring:\n", rx ? "RX" : "TX");
411412

412-
for (i = 0; i < size; i++) {
413-
pr_info("%03d [0x%x]: 0x%x 0x%x 0x%x 0x%x\n",
414-
i, (unsigned int)virt_to_phys(p),
415-
le32_to_cpu(p->des0), le32_to_cpu(p->des1),
416-
le32_to_cpu(p->des2), le32_to_cpu(p->des3));
417-
p++;
413+
if (desc_size == sizeof(struct dma_desc)) {
414+
struct dma_desc *p = (struct dma_desc *)head;
415+
416+
for (i = 0; i < size; i++) {
417+
dma_addr = dma_rx_phy + i * sizeof(*p);
418+
pr_info("%03d [%pad]: 0x%x 0x%x 0x%x 0x%x\n",
419+
i, &dma_addr,
420+
le32_to_cpu(p->des0), le32_to_cpu(p->des1),
421+
le32_to_cpu(p->des2), le32_to_cpu(p->des3));
422+
p++;
423+
}
424+
} else if (desc_size == sizeof(struct dma_extended_desc)) {
425+
struct dma_extended_desc *extp = (struct dma_extended_desc *)head;
426+
427+
for (i = 0; i < size; i++) {
428+
dma_addr = dma_rx_phy + i * sizeof(*extp);
429+
pr_info("%03d [%pad]: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
430+
i, &dma_addr,
431+
le32_to_cpu(extp->basic.des0), le32_to_cpu(extp->basic.des1),
432+
le32_to_cpu(extp->basic.des2), le32_to_cpu(extp->basic.des3),
433+
le32_to_cpu(extp->des4), le32_to_cpu(extp->des5),
434+
le32_to_cpu(extp->des6), le32_to_cpu(extp->des7));
435+
extp++;
436+
}
437+
} else if (desc_size == sizeof(struct dma_edesc)) {
438+
struct dma_edesc *ep = (struct dma_edesc *)head;
439+
440+
for (i = 0; i < size; i++) {
441+
dma_addr = dma_rx_phy + i * sizeof(*ep);
442+
pr_info("%03d [%pad]: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
443+
i, &dma_addr,
444+
le32_to_cpu(ep->des4), le32_to_cpu(ep->des5),
445+
le32_to_cpu(ep->des6), le32_to_cpu(ep->des7),
446+
le32_to_cpu(ep->basic.des0), le32_to_cpu(ep->basic.des1),
447+
le32_to_cpu(ep->basic.des2), le32_to_cpu(ep->basic.des3));
448+
ep++;
449+
}
450+
} else {
451+
pr_err("unsupported descriptor!");
418452
}
419453
}
420454

drivers/net/ethernet/stmicro/stmmac/enh_desc.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -417,19 +417,22 @@ static int enh_desc_get_rx_timestamp_status(void *desc, void *next_desc,
417417
}
418418
}
419419

420-
static void enh_desc_display_ring(void *head, unsigned int size, bool rx)
420+
static void enh_desc_display_ring(void *head, unsigned int size, bool rx,
421+
dma_addr_t dma_rx_phy, unsigned int desc_size)
421422
{
422423
struct dma_extended_desc *ep = (struct dma_extended_desc *)head;
424+
dma_addr_t dma_addr;
423425
int i;
424426

425427
pr_info("Extended %s descriptor ring:\n", rx ? "RX" : "TX");
426428

427429
for (i = 0; i < size; i++) {
428430
u64 x;
431+
dma_addr = dma_rx_phy + i * sizeof(*ep);
429432

430433
x = *(u64 *)ep;
431-
pr_info("%03d [0x%x]: 0x%x 0x%x 0x%x 0x%x\n",
432-
i, (unsigned int)virt_to_phys(ep),
434+
pr_info("%03d [%pad]: 0x%x 0x%x 0x%x 0x%x\n",
435+
i, &dma_addr,
433436
(unsigned int)x, (unsigned int)(x >> 32),
434437
ep->basic.des2, ep->basic.des3);
435438
ep++;

drivers/net/ethernet/stmicro/stmmac/hwif.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ struct stmmac_desc_ops {
7878
/* get rx timestamp status */
7979
int (*get_rx_timestamp_status)(void *desc, void *next_desc, u32 ats);
8080
/* Display ring */
81-
void (*display_ring)(void *head, unsigned int size, bool rx);
81+
void (*display_ring)(void *head, unsigned int size, bool rx,
82+
dma_addr_t dma_rx_phy, unsigned int desc_size);
8283
/* set MSS via context descriptor */
8384
void (*set_mss)(struct dma_desc *p, unsigned int mss);
8485
/* get descriptor skbuff address */

drivers/net/ethernet/stmicro/stmmac/norm_desc.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -269,19 +269,22 @@ static int ndesc_get_rx_timestamp_status(void *desc, void *next_desc, u32 ats)
269269
return 1;
270270
}
271271

272-
static void ndesc_display_ring(void *head, unsigned int size, bool rx)
272+
static void ndesc_display_ring(void *head, unsigned int size, bool rx,
273+
dma_addr_t dma_rx_phy, unsigned int desc_size)
273274
{
274275
struct dma_desc *p = (struct dma_desc *)head;
276+
dma_addr_t dma_addr;
275277
int i;
276278

277279
pr_info("%s descriptor ring:\n", rx ? "RX" : "TX");
278280

279281
for (i = 0; i < size; i++) {
280282
u64 x;
283+
dma_addr = dma_rx_phy + i * sizeof(*p);
281284

282285
x = *(u64 *)p;
283-
pr_info("%03d [0x%x]: 0x%x 0x%x 0x%x 0x%x",
284-
i, (unsigned int)virt_to_phys(p),
286+
pr_info("%03d [%pad]: 0x%x 0x%x 0x%x 0x%x",
287+
i, &dma_addr,
285288
(unsigned int)x, (unsigned int)(x >> 32),
286289
p->des2, p->des3);
287290
p++;

drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,6 +1109,7 @@ static int stmmac_phy_setup(struct stmmac_priv *priv)
11091109
static void stmmac_display_rx_rings(struct stmmac_priv *priv)
11101110
{
11111111
u32 rx_cnt = priv->plat->rx_queues_to_use;
1112+
unsigned int desc_size;
11121113
void *head_rx;
11131114
u32 queue;
11141115

@@ -1118,19 +1119,24 @@ static void stmmac_display_rx_rings(struct stmmac_priv *priv)
11181119

11191120
pr_info("\tRX Queue %u rings\n", queue);
11201121

1121-
if (priv->extend_desc)
1122+
if (priv->extend_desc) {
11221123
head_rx = (void *)rx_q->dma_erx;
1123-
else
1124+
desc_size = sizeof(struct dma_extended_desc);
1125+
} else {
11241126
head_rx = (void *)rx_q->dma_rx;
1127+
desc_size = sizeof(struct dma_desc);
1128+
}
11251129

11261130
/* Display RX ring */
1127-
stmmac_display_ring(priv, head_rx, priv->dma_rx_size, true);
1131+
stmmac_display_ring(priv, head_rx, priv->dma_rx_size, true,
1132+
rx_q->dma_rx_phy, desc_size);
11281133
}
11291134
}
11301135

11311136
static void stmmac_display_tx_rings(struct stmmac_priv *priv)
11321137
{
11331138
u32 tx_cnt = priv->plat->tx_queues_to_use;
1139+
unsigned int desc_size;
11341140
void *head_tx;
11351141
u32 queue;
11361142

@@ -1140,14 +1146,19 @@ static void stmmac_display_tx_rings(struct stmmac_priv *priv)
11401146

11411147
pr_info("\tTX Queue %d rings\n", queue);
11421148

1143-
if (priv->extend_desc)
1149+
if (priv->extend_desc) {
11441150
head_tx = (void *)tx_q->dma_etx;
1145-
else if (tx_q->tbs & STMMAC_TBS_AVAIL)
1151+
desc_size = sizeof(struct dma_extended_desc);
1152+
} else if (tx_q->tbs & STMMAC_TBS_AVAIL) {
11461153
head_tx = (void *)tx_q->dma_entx;
1147-
else
1154+
desc_size = sizeof(struct dma_edesc);
1155+
} else {
11481156
head_tx = (void *)tx_q->dma_tx;
1157+
desc_size = sizeof(struct dma_desc);
1158+
}
11491159

1150-
stmmac_display_ring(priv, head_tx, priv->dma_tx_size, false);
1160+
stmmac_display_ring(priv, head_tx, priv->dma_tx_size, false,
1161+
tx_q->dma_tx_phy, desc_size);
11511162
}
11521163
}
11531164

@@ -3710,18 +3721,23 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue)
37103721
unsigned int count = 0, error = 0, len = 0;
37113722
int status = 0, coe = priv->hw->rx_csum;
37123723
unsigned int next_entry = rx_q->cur_rx;
3724+
unsigned int desc_size;
37133725
struct sk_buff *skb = NULL;
37143726

37153727
if (netif_msg_rx_status(priv)) {
37163728
void *rx_head;
37173729

37183730
netdev_dbg(priv->dev, "%s: descriptor ring:\n", __func__);
3719-
if (priv->extend_desc)
3731+
if (priv->extend_desc) {
37203732
rx_head = (void *)rx_q->dma_erx;
3721-
else
3733+
desc_size = sizeof(struct dma_extended_desc);
3734+
} else {
37223735
rx_head = (void *)rx_q->dma_rx;
3736+
desc_size = sizeof(struct dma_desc);
3737+
}
37233738

3724-
stmmac_display_ring(priv, rx_head, priv->dma_rx_size, true);
3739+
stmmac_display_ring(priv, rx_head, priv->dma_rx_size, true,
3740+
rx_q->dma_rx_phy, desc_size);
37253741
}
37263742
while (count < limit) {
37273743
unsigned int buf1_len = 0, buf2_len = 0;
@@ -4289,24 +4305,27 @@ static int stmmac_set_mac_address(struct net_device *ndev, void *addr)
42894305
static struct dentry *stmmac_fs_dir;
42904306

42914307
static void sysfs_display_ring(void *head, int size, int extend_desc,
4292-
struct seq_file *seq)
4308+
struct seq_file *seq, dma_addr_t dma_phy_addr)
42934309
{
42944310
int i;
42954311
struct dma_extended_desc *ep = (struct dma_extended_desc *)head;
42964312
struct dma_desc *p = (struct dma_desc *)head;
4313+
dma_addr_t dma_addr;
42974314

42984315
for (i = 0; i < size; i++) {
42994316
if (extend_desc) {
4300-
seq_printf(seq, "%d [0x%x]: 0x%x 0x%x 0x%x 0x%x\n",
4301-
i, (unsigned int)virt_to_phys(ep),
4317+
dma_addr = dma_phy_addr + i * sizeof(*ep);
4318+
seq_printf(seq, "%d [%pad]: 0x%x 0x%x 0x%x 0x%x\n",
4319+
i, &dma_addr,
43024320
le32_to_cpu(ep->basic.des0),
43034321
le32_to_cpu(ep->basic.des1),
43044322
le32_to_cpu(ep->basic.des2),
43054323
le32_to_cpu(ep->basic.des3));
43064324
ep++;
43074325
} else {
4308-
seq_printf(seq, "%d [0x%x]: 0x%x 0x%x 0x%x 0x%x\n",
4309-
i, (unsigned int)virt_to_phys(p),
4326+
dma_addr = dma_phy_addr + i * sizeof(*p);
4327+
seq_printf(seq, "%d [%pad]: 0x%x 0x%x 0x%x 0x%x\n",
4328+
i, &dma_addr,
43104329
le32_to_cpu(p->des0), le32_to_cpu(p->des1),
43114330
le32_to_cpu(p->des2), le32_to_cpu(p->des3));
43124331
p++;
@@ -4334,11 +4353,11 @@ static int stmmac_rings_status_show(struct seq_file *seq, void *v)
43344353
if (priv->extend_desc) {
43354354
seq_printf(seq, "Extended descriptor ring:\n");
43364355
sysfs_display_ring((void *)rx_q->dma_erx,
4337-
priv->dma_rx_size, 1, seq);
4356+
priv->dma_rx_size, 1, seq, rx_q->dma_rx_phy);
43384357
} else {
43394358
seq_printf(seq, "Descriptor ring:\n");
43404359
sysfs_display_ring((void *)rx_q->dma_rx,
4341-
priv->dma_rx_size, 0, seq);
4360+
priv->dma_rx_size, 0, seq, rx_q->dma_rx_phy);
43424361
}
43434362
}
43444363

@@ -4350,11 +4369,11 @@ static int stmmac_rings_status_show(struct seq_file *seq, void *v)
43504369
if (priv->extend_desc) {
43514370
seq_printf(seq, "Extended descriptor ring:\n");
43524371
sysfs_display_ring((void *)tx_q->dma_etx,
4353-
priv->dma_tx_size, 1, seq);
4372+
priv->dma_tx_size, 1, seq, tx_q->dma_tx_phy);
43544373
} else if (!(tx_q->tbs & STMMAC_TBS_AVAIL)) {
43554374
seq_printf(seq, "Descriptor ring:\n");
43564375
sysfs_display_ring((void *)tx_q->dma_tx,
4357-
priv->dma_tx_size, 0, seq);
4376+
priv->dma_tx_size, 0, seq, tx_q->dma_tx_phy);
43584377
}
43594378
}
43604379

0 commit comments

Comments
 (0)