2020-07-31 06:47:32

by Florinel Iordache

[permalink] [raw]
Subject: [PATCH net 0/5] DPAA FMan driver fixes

Here are several fixes for the DPAA FMan driver.

Florinel Iordache (5):
fsl/fman: use 32-bit unsigned integer
fsl/fman: fix dereference null return value
fsl/fman: fix unreachable code
fsl/fman: check dereferencing null pointer
fsl/fman: fix eth hash table allocation

drivers/net/ethernet/freescale/fman/fman.c | 3 +--
drivers/net/ethernet/freescale/fman/fman_dtsec.c | 4 ++--
drivers/net/ethernet/freescale/fman/fman_mac.h | 2 +-
drivers/net/ethernet/freescale/fman/fman_memac.c | 2 +-
drivers/net/ethernet/freescale/fman/fman_port.c | 9 ++++++++-
drivers/net/ethernet/freescale/fman/fman_tgec.c | 2 +-
6 files changed, 14 insertions(+), 8 deletions(-)

--
1.9.1


2020-07-31 06:47:36

by Florinel Iordache

[permalink] [raw]
Subject: [PATCH net 1/5] fsl/fman: use 32-bit unsigned integer

Potentially overflowing expression (ts_freq << 16 and intgr << 16)
declared as type u32 (32-bit unsigned) is evaluated using 32-bit
arithmetic and then used in a context that expects an expression of
type u64 (64-bit unsigned) which ultimately is used as 16-bit
unsigned by typecasting to u16. Fixed by using an unsigned 32-bit
integer since the value is truncated anyway in the end.

Fixes: 414fd46e ("fsl/fman: Add FMan support")

Signed-off-by: Florinel Iordache <[email protected]>
---
drivers/net/ethernet/freescale/fman/fman.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/freescale/fman/fman.c b/drivers/net/ethernet/freescale/fman/fman.c
index f151d6e..ef67e85 100644
--- a/drivers/net/ethernet/freescale/fman/fman.c
+++ b/drivers/net/ethernet/freescale/fman/fman.c
@@ -1398,8 +1398,7 @@ static void enable_time_stamp(struct fman *fman)
{
struct fman_fpm_regs __iomem *fpm_rg = fman->fpm_regs;
u16 fm_clk_freq = fman->state->fm_clk_freq;
- u32 tmp, intgr, ts_freq;
- u64 frac;
+ u32 tmp, intgr, ts_freq, frac;

ts_freq = (u32)(1 << fman->state->count1_micro_bit);
/* configure timestamp so that bit 8 will count 1 microsecond
--
1.9.1

2020-07-31 06:47:44

by Florinel Iordache

[permalink] [raw]
Subject: [PATCH net 3/5] fsl/fman: fix unreachable code

The parameter 'priority' is incorrectly forced to zero which ultimately
induces logically dead code in the subsequent lines.

Fixes: 57ba4c9b ("fsl/fman: Add FMan MAC support")

Signed-off-by: Florinel Iordache <[email protected]>
---
drivers/net/ethernet/freescale/fman/fman_memac.c | 1 -
1 file changed, 1 deletion(-)

diff --git a/drivers/net/ethernet/freescale/fman/fman_memac.c b/drivers/net/ethernet/freescale/fman/fman_memac.c
index a5500ed..bb02b37 100644
--- a/drivers/net/ethernet/freescale/fman/fman_memac.c
+++ b/drivers/net/ethernet/freescale/fman/fman_memac.c
@@ -852,7 +852,6 @@ int memac_set_tx_pause_frames(struct fman_mac *memac, u8 priority,

tmp = ioread32be(&regs->command_config);
tmp &= ~CMD_CFG_PFC_MODE;
- priority = 0;

iowrite32be(tmp, &regs->command_config);

--
1.9.1

2020-07-31 06:48:00

by Florinel Iordache

[permalink] [raw]
Subject: [PATCH net 4/5] fsl/fman: check dereferencing null pointer

Add a safe check to avoid dereferencing null pointer

Fixes: 57ba4c9b ("fsl/fman: Add FMan MAC support")

Signed-off-by: Florinel Iordache <[email protected]>
---
drivers/net/ethernet/freescale/fman/fman_dtsec.c | 4 ++--
drivers/net/ethernet/freescale/fman/fman_memac.c | 3 ++-
drivers/net/ethernet/freescale/fman/fman_tgec.c | 2 +-
3 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/freescale/fman/fman_dtsec.c b/drivers/net/ethernet/freescale/fman/fman_dtsec.c
index 004c266..bce3c93 100644
--- a/drivers/net/ethernet/freescale/fman/fman_dtsec.c
+++ b/drivers/net/ethernet/freescale/fman/fman_dtsec.c
@@ -1200,7 +1200,7 @@ int dtsec_del_hash_mac_address(struct fman_mac *dtsec, enet_addr_t *eth_addr)
list_for_each(pos,
&dtsec->multicast_addr_hash->lsts[bucket]) {
hash_entry = ETH_HASH_ENTRY_OBJ(pos);
- if (hash_entry->addr == addr) {
+ if (hash_entry && hash_entry->addr == addr) {
list_del_init(&hash_entry->node);
kfree(hash_entry);
break;
@@ -1213,7 +1213,7 @@ int dtsec_del_hash_mac_address(struct fman_mac *dtsec, enet_addr_t *eth_addr)
list_for_each(pos,
&dtsec->unicast_addr_hash->lsts[bucket]) {
hash_entry = ETH_HASH_ENTRY_OBJ(pos);
- if (hash_entry->addr == addr) {
+ if (hash_entry && hash_entry->addr == addr) {
list_del_init(&hash_entry->node);
kfree(hash_entry);
break;
diff --git a/drivers/net/ethernet/freescale/fman/fman_memac.c b/drivers/net/ethernet/freescale/fman/fman_memac.c
index bb02b37..52ee982 100644
--- a/drivers/net/ethernet/freescale/fman/fman_memac.c
+++ b/drivers/net/ethernet/freescale/fman/fman_memac.c
@@ -852,6 +852,7 @@ int memac_set_tx_pause_frames(struct fman_mac *memac, u8 priority,

tmp = ioread32be(&regs->command_config);
tmp &= ~CMD_CFG_PFC_MODE;
+ priority = 0;

iowrite32be(tmp, &regs->command_config);

@@ -981,7 +982,7 @@ int memac_del_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr)

list_for_each(pos, &memac->multicast_addr_hash->lsts[hash]) {
hash_entry = ETH_HASH_ENTRY_OBJ(pos);
- if (hash_entry->addr == addr) {
+ if (hash_entry && hash_entry->addr == addr) {
list_del_init(&hash_entry->node);
kfree(hash_entry);
break;
diff --git a/drivers/net/ethernet/freescale/fman/fman_tgec.c b/drivers/net/ethernet/freescale/fman/fman_tgec.c
index 8c7eb87..41946b1 100644
--- a/drivers/net/ethernet/freescale/fman/fman_tgec.c
+++ b/drivers/net/ethernet/freescale/fman/fman_tgec.c
@@ -626,7 +626,7 @@ int tgec_del_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr)

list_for_each(pos, &tgec->multicast_addr_hash->lsts[hash]) {
hash_entry = ETH_HASH_ENTRY_OBJ(pos);
- if (hash_entry->addr == addr) {
+ if (hash_entry && hash_entry->addr == addr) {
list_del_init(&hash_entry->node);
kfree(hash_entry);
break;
--
1.9.1

2020-07-31 06:48:51

by Florinel Iordache

[permalink] [raw]
Subject: [PATCH net 5/5] fsl/fman: fix eth hash table allocation

Fix memory allocation for ethernet address hash table.
The code was wrongly allocating an array for eth hash table which
is incorrect because this is the main structure for eth hash table
(struct eth_hash_t) that contains inside a number of elements.

Fixes: 57ba4c9b ("fsl/fman: Add FMan MAC support")

Signed-off-by: Florinel Iordache <[email protected]>
---
drivers/net/ethernet/freescale/fman/fman_mac.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/freescale/fman/fman_mac.h b/drivers/net/ethernet/freescale/fman/fman_mac.h
index dd6d052..19f327e 100644
--- a/drivers/net/ethernet/freescale/fman/fman_mac.h
+++ b/drivers/net/ethernet/freescale/fman/fman_mac.h
@@ -252,7 +252,7 @@ static inline struct eth_hash_t *alloc_hash_table(u16 size)
struct eth_hash_t *hash;

/* Allocate address hash table */
- hash = kmalloc_array(size, sizeof(struct eth_hash_t *), GFP_KERNEL);
+ hash = kmalloc(sizeof(*hash), GFP_KERNEL);
if (!hash)
return NULL;

--
1.9.1

2020-07-31 06:49:05

by Florinel Iordache

[permalink] [raw]
Subject: [PATCH net 2/5] fsl/fman: fix dereference null return value

Check before using returned value to avoid dereferencing null pointer.

Fixes: 18a6c85f ("fsl/fman: Add FMan Port Support")

Signed-off-by: Florinel Iordache <[email protected]>
---
drivers/net/ethernet/freescale/fman/fman_port.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/freescale/fman/fman_port.c b/drivers/net/ethernet/freescale/fman/fman_port.c
index 87b26f0..c27df15 100644
--- a/drivers/net/ethernet/freescale/fman/fman_port.c
+++ b/drivers/net/ethernet/freescale/fman/fman_port.c
@@ -1767,6 +1767,7 @@ static int fman_port_probe(struct platform_device *of_dev)
struct fman_port *port;
struct fman *fman;
struct device_node *fm_node, *port_node;
+ struct platform_device *fm_pdev;
struct resource res;
struct resource *dev_res;
u32 val;
@@ -1791,8 +1792,14 @@ static int fman_port_probe(struct platform_device *of_dev)
goto return_err;
}

- fman = dev_get_drvdata(&of_find_device_by_node(fm_node)->dev);
+ fm_pdev = of_find_device_by_node(fm_node);
of_node_put(fm_node);
+ if (!fm_pdev) {
+ err = -EINVAL;
+ goto return_err;
+ }
+
+ fman = dev_get_drvdata(&fm_pdev->dev);
if (!fman) {
err = -EINVAL;
goto return_err;
--
1.9.1

2020-07-31 07:49:12

by Madalin-cristian Bucur

[permalink] [raw]
Subject: RE: [PATCH net 4/5] fsl/fman: check dereferencing null pointer

> -----Original Message-----
> From: Florinel Iordache <[email protected]>
> Sent: 31 July 2020 09:46
> To: Madalin Bucur <[email protected]>; [email protected];
> [email protected]; [email protected]
> Cc: [email protected]; Florinel Iordache
> <[email protected]>
> Subject: [PATCH net 4/5] fsl/fman: check dereferencing null pointer
>
> Add a safe check to avoid dereferencing null pointer
>
> Fixes: 57ba4c9b ("fsl/fman: Add FMan MAC support")
>
> Signed-off-by: Florinel Iordache <[email protected]>
> ---
> drivers/net/ethernet/freescale/fman/fman_dtsec.c | 4 ++--
> drivers/net/ethernet/freescale/fman/fman_memac.c | 3 ++-
> drivers/net/ethernet/freescale/fman/fman_tgec.c | 2 +-
> 3 files changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/ethernet/freescale/fman/fman_dtsec.c
> b/drivers/net/ethernet/freescale/fman/fman_dtsec.c
> index 004c266..bce3c93 100644
> --- a/drivers/net/ethernet/freescale/fman/fman_dtsec.c
> +++ b/drivers/net/ethernet/freescale/fman/fman_dtsec.c
> @@ -1200,7 +1200,7 @@ int dtsec_del_hash_mac_address(struct fman_mac
> *dtsec, enet_addr_t *eth_addr)
> list_for_each(pos,
> &dtsec->multicast_addr_hash->lsts[bucket]) {
> hash_entry = ETH_HASH_ENTRY_OBJ(pos);
> - if (hash_entry->addr == addr) {
> + if (hash_entry && hash_entry->addr == addr) {
> list_del_init(&hash_entry->node);
> kfree(hash_entry);
> break;
> @@ -1213,7 +1213,7 @@ int dtsec_del_hash_mac_address(struct fman_mac
> *dtsec, enet_addr_t *eth_addr)
> list_for_each(pos,
> &dtsec->unicast_addr_hash->lsts[bucket]) {
> hash_entry = ETH_HASH_ENTRY_OBJ(pos);
> - if (hash_entry->addr == addr) {
> + if (hash_entry && hash_entry->addr == addr) {
> list_del_init(&hash_entry->node);
> kfree(hash_entry);
> break;
> diff --git a/drivers/net/ethernet/freescale/fman/fman_memac.c
> b/drivers/net/ethernet/freescale/fman/fman_memac.c
> index bb02b37..52ee982 100644
> --- a/drivers/net/ethernet/freescale/fman/fman_memac.c
> +++ b/drivers/net/ethernet/freescale/fman/fman_memac.c
> @@ -852,6 +852,7 @@ int memac_set_tx_pause_frames(struct fman_mac *memac,
> u8 priority,
>
> tmp = ioread32be(&regs->command_config);
> tmp &= ~CMD_CFG_PFC_MODE;
> + priority = 0;

This line seems to be added by mistake.

>
> iowrite32be(tmp, &regs->command_config);
>
> @@ -981,7 +982,7 @@ int memac_del_hash_mac_address(struct fman_mac *memac,
> enet_addr_t *eth_addr)
>
> list_for_each(pos, &memac->multicast_addr_hash->lsts[hash]) {
> hash_entry = ETH_HASH_ENTRY_OBJ(pos);
> - if (hash_entry->addr == addr) {
> + if (hash_entry && hash_entry->addr == addr) {
> list_del_init(&hash_entry->node);
> kfree(hash_entry);
> break;
> diff --git a/drivers/net/ethernet/freescale/fman/fman_tgec.c
> b/drivers/net/ethernet/freescale/fman/fman_tgec.c
> index 8c7eb87..41946b1 100644
> --- a/drivers/net/ethernet/freescale/fman/fman_tgec.c
> +++ b/drivers/net/ethernet/freescale/fman/fman_tgec.c
> @@ -626,7 +626,7 @@ int tgec_del_hash_mac_address(struct fman_mac *tgec,
> enet_addr_t *eth_addr)
>
> list_for_each(pos, &tgec->multicast_addr_hash->lsts[hash]) {
> hash_entry = ETH_HASH_ENTRY_OBJ(pos);
> - if (hash_entry->addr == addr) {
> + if (hash_entry && hash_entry->addr == addr) {
> list_del_init(&hash_entry->node);
> kfree(hash_entry);
> break;
> --
> 1.9.1