Skip to content

Commit 237d20c

Browse files
liupoerdavem330
authored andcommitted
net:enetc: enetc qos using the CBDR dma alloc function
Now we can use the enetc_cbd_alloc_data_mem() to replace complicated DMA data alloc method and CBDR memory basic seting. Signed-off-by: Po Liu <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 0cc11cd commit 237d20c

File tree

1 file changed

+22
-75
lines changed

1 file changed

+22
-75
lines changed

drivers/net/ethernet/freescale/enetc/enetc_qos.c

Lines changed: 22 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,14 @@ void enetc_sched_speed_set(struct enetc_ndev_priv *priv, int speed)
4545
| pspeed);
4646
}
4747

48-
#define ENETC_QOS_ALIGN 64
4948
static int enetc_setup_taprio(struct net_device *ndev,
5049
struct tc_taprio_qopt_offload *admin_conf)
5150
{
5251
struct enetc_ndev_priv *priv = netdev_priv(ndev);
5352
struct enetc_cbd cbd = {.cmd = 0};
5453
struct tgs_gcl_conf *gcl_config;
5554
struct tgs_gcl_data *gcl_data;
56-
dma_addr_t dma, dma_align;
55+
dma_addr_t dma;
5756
struct gce *gce;
5857
u16 data_size;
5958
u16 gcl_len;
@@ -84,16 +83,10 @@ static int enetc_setup_taprio(struct net_device *ndev,
8483
gcl_config = &cbd.gcl_conf;
8584

8685
data_size = struct_size(gcl_data, entry, gcl_len);
87-
tmp = dma_alloc_coherent(&priv->si->pdev->dev,
88-
data_size + ENETC_QOS_ALIGN,
89-
&dma, GFP_KERNEL);
90-
if (!tmp) {
91-
dev_err(&priv->si->pdev->dev,
92-
"DMA mapping of taprio gate list failed!\n");
86+
tmp = enetc_cbd_alloc_data_mem(priv->si, &cbd, data_size,
87+
&dma, (void *)&gcl_data);
88+
if (!tmp)
9389
return -ENOMEM;
94-
}
95-
dma_align = ALIGN(dma, ENETC_QOS_ALIGN);
96-
gcl_data = (struct tgs_gcl_data *)PTR_ALIGN(tmp, ENETC_QOS_ALIGN);
9790

9891
gce = (struct gce *)(gcl_data + 1);
9992

@@ -116,11 +109,8 @@ static int enetc_setup_taprio(struct net_device *ndev,
116109
temp_gce->period = cpu_to_le32(temp_entry->interval);
117110
}
118111

119-
cbd.length = cpu_to_le16(data_size);
120112
cbd.status_flags = 0;
121113

122-
cbd.addr[0] = cpu_to_le32(lower_32_bits(dma_align));
123-
cbd.addr[1] = cpu_to_le32(upper_32_bits(dma_align));
124114
cbd.cls = BDCR_CMD_PORT_GCL;
125115
cbd.status_flags = 0;
126116

@@ -133,8 +123,7 @@ static int enetc_setup_taprio(struct net_device *ndev,
133123
ENETC_QBV_PTGCR_OFFSET,
134124
tge & (~ENETC_QBV_TGE));
135125

136-
dma_free_coherent(&priv->si->pdev->dev, data_size + ENETC_QOS_ALIGN,
137-
tmp, dma);
126+
enetc_cbd_free_data_mem(priv->si, data_size, tmp, &dma);
138127

139128
return err;
140129
}
@@ -451,6 +440,7 @@ static struct actions_fwd enetc_act_fwd[] = {
451440
};
452441

453442
static struct enetc_psfp epsfp = {
443+
.dev_bitmap = 0,
454444
.psfp_sfi_bitmap = NULL,
455445
};
456446

@@ -464,7 +454,7 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,
464454
struct enetc_cbd cbd = {.cmd = 0};
465455
struct streamid_data *si_data;
466456
struct streamid_conf *si_conf;
467-
dma_addr_t dma, dma_align;
457+
dma_addr_t dma;
468458
u16 data_size;
469459
void *tmp;
470460
int port;
@@ -487,20 +477,11 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,
487477
cbd.status_flags = 0;
488478

489479
data_size = sizeof(struct streamid_data);
490-
tmp = dma_alloc_coherent(&priv->si->pdev->dev,
491-
data_size + ENETC_QOS_ALIGN,
492-
&dma, GFP_KERNEL);
493-
if (!tmp) {
494-
dev_err(&priv->si->pdev->dev,
495-
"DMA mapping of stream identify failed!\n");
480+
tmp = enetc_cbd_alloc_data_mem(priv->si, &cbd, data_size,
481+
&dma, (void *)&si_data);
482+
if (!tmp)
496483
return -ENOMEM;
497-
}
498-
dma_align = ALIGN(dma, ENETC_QOS_ALIGN);
499-
si_data = (struct streamid_data *)PTR_ALIGN(tmp, ENETC_QOS_ALIGN);
500484

501-
cbd.length = cpu_to_le16(data_size);
502-
cbd.addr[0] = cpu_to_le32(lower_32_bits(dma_align));
503-
cbd.addr[1] = cpu_to_le32(upper_32_bits(dma_align));
504485
eth_broadcast_addr(si_data->dmac);
505486
si_data->vid_vidm_tg = (ENETC_CBDR_SID_VID_MASK
506487
+ ((0x3 << 14) | ENETC_CBDR_SID_VIDM));
@@ -521,11 +502,6 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,
521502
goto out;
522503

523504
/* Enable the entry overwrite again incase space flushed by hardware */
524-
memset(&cbd, 0, sizeof(cbd));
525-
526-
cbd.index = cpu_to_le16((u16)sid->index);
527-
cbd.cmd = 0;
528-
cbd.cls = BDCR_CMD_STREAM_IDENTIFY;
529505
cbd.status_flags = 0;
530506

531507
si_conf->en = 0x80;
@@ -538,11 +514,6 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,
538514

539515
memset(si_data, 0, data_size);
540516

541-
cbd.length = cpu_to_le16(data_size);
542-
543-
cbd.addr[0] = cpu_to_le32(lower_32_bits(dma_align));
544-
cbd.addr[1] = cpu_to_le32(upper_32_bits(dma_align));
545-
546517
/* VIDM default to be 1.
547518
* VID Match. If set (b1) then the VID must match, otherwise
548519
* any VID is considered a match. VIDM setting is only used
@@ -562,8 +533,7 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,
562533

563534
err = enetc_send_cmd(priv->si, &cbd);
564535
out:
565-
dma_free_coherent(&priv->si->pdev->dev, data_size + ENETC_QOS_ALIGN,
566-
tmp, dma);
536+
enetc_cbd_free_data_mem(priv->si, data_size, tmp, &dma);
567537

568538
return err;
569539
}
@@ -632,7 +602,7 @@ static int enetc_streamcounter_hw_get(struct enetc_ndev_priv *priv,
632602
{
633603
struct enetc_cbd cbd = { .cmd = 2 };
634604
struct sfi_counter_data *data_buf;
635-
dma_addr_t dma, dma_align;
605+
dma_addr_t dma;
636606
u16 data_size;
637607
void *tmp;
638608
int err;
@@ -643,21 +613,11 @@ static int enetc_streamcounter_hw_get(struct enetc_ndev_priv *priv,
643613
cbd.status_flags = 0;
644614

645615
data_size = sizeof(struct sfi_counter_data);
646-
tmp = dma_alloc_coherent(&priv->si->pdev->dev,
647-
data_size + ENETC_QOS_ALIGN,
648-
&dma, GFP_KERNEL);
649-
if (!tmp) {
650-
dev_err(&priv->si->pdev->dev,
651-
"DMA mapping of stream counter failed!\n");
652-
return -ENOMEM;
653-
}
654-
dma_align = ALIGN(dma, ENETC_QOS_ALIGN);
655-
data_buf = (struct sfi_counter_data *)PTR_ALIGN(tmp, ENETC_QOS_ALIGN);
656-
657-
cbd.addr[0] = cpu_to_le32(lower_32_bits(dma_align));
658-
cbd.addr[1] = cpu_to_le32(upper_32_bits(dma_align));
659616

660-
cbd.length = cpu_to_le16(data_size);
617+
tmp = enetc_cbd_alloc_data_mem(priv->si, &cbd, data_size,
618+
&dma, (void *)&data_buf);
619+
if (!tmp)
620+
return -ENOMEM;
661621

662622
err = enetc_send_cmd(priv->si, &cbd);
663623
if (err)
@@ -684,8 +644,7 @@ static int enetc_streamcounter_hw_get(struct enetc_ndev_priv *priv,
684644
data_buf->flow_meter_dropl;
685645

686646
exit:
687-
dma_free_coherent(&priv->si->pdev->dev, data_size + ENETC_QOS_ALIGN,
688-
tmp, dma);
647+
enetc_cbd_free_data_mem(priv->si, data_size, tmp, &dma);
689648

690649
return err;
691650
}
@@ -725,7 +684,7 @@ static int enetc_streamgate_hw_set(struct enetc_ndev_priv *priv,
725684
struct sgcl_conf *sgcl_config;
726685
struct sgcl_data *sgcl_data;
727686
struct sgce *sgce;
728-
dma_addr_t dma, dma_align;
687+
dma_addr_t dma;
729688
u16 data_size;
730689
int err, i;
731690
void *tmp;
@@ -775,20 +734,10 @@ static int enetc_streamgate_hw_set(struct enetc_ndev_priv *priv,
775734
sgcl_config->acl_len = (sgi->num_entries - 1) & 0x3;
776735

777736
data_size = struct_size(sgcl_data, sgcl, sgi->num_entries);
778-
tmp = dma_alloc_coherent(&priv->si->pdev->dev,
779-
data_size + ENETC_QOS_ALIGN,
780-
&dma, GFP_KERNEL);
781-
if (!tmp) {
782-
dev_err(&priv->si->pdev->dev,
783-
"DMA mapping of stream counter failed!\n");
737+
tmp = enetc_cbd_alloc_data_mem(priv->si, &cbd, data_size,
738+
&dma, (void *)&sgcl_data);
739+
if (!tmp)
784740
return -ENOMEM;
785-
}
786-
dma_align = ALIGN(dma, ENETC_QOS_ALIGN);
787-
sgcl_data = (struct sgcl_data *)PTR_ALIGN(tmp, ENETC_QOS_ALIGN);
788-
789-
cbd.length = cpu_to_le16(data_size);
790-
cbd.addr[0] = cpu_to_le32(lower_32_bits(dma_align));
791-
cbd.addr[1] = cpu_to_le32(upper_32_bits(dma_align));
792741

793742
sgce = &sgcl_data->sgcl[0];
794743

@@ -843,9 +792,7 @@ static int enetc_streamgate_hw_set(struct enetc_ndev_priv *priv,
843792
err = enetc_send_cmd(priv->si, &cbd);
844793

845794
exit:
846-
dma_free_coherent(&priv->si->pdev->dev, data_size + ENETC_QOS_ALIGN,
847-
tmp, dma);
848-
795+
enetc_cbd_free_data_mem(priv->si, data_size, tmp, &dma);
849796
return err;
850797
}
851798

0 commit comments

Comments
 (0)