Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eb72f74f authored by Hariprasad Shenai's avatar Hariprasad Shenai Committed by David S. Miller
Browse files

cxgb4: Handle clip return values



Add a warn message when clip table overflows. If clip table isn't
allocated, return from cxgb4_clip_release() to avoid panic.
Disable offload if clip isn't enabled in the hardware.

Signed-off-by: default avatarHariprasad Shenai <hariprasad@chelsio.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 515123e2
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -118,6 +118,11 @@ int cxgb4_clip_get(const struct net_device *dev, const u32 *lip, u8 v6)
			ret = clip6_get_mbox(dev, (const struct in6_addr *)lip);
			if (ret) {
				write_unlock_bh(&ctbl->lock);
				dev_err(adap->pdev_dev,
					"CLIP FW cmd failed with error %d, "
					"Connections using %pI6c wont be "
					"offloaded",
					ret, ce->addr6.sin6_addr.s6_addr);
				return ret;
			}
		} else {
@@ -127,6 +132,9 @@ int cxgb4_clip_get(const struct net_device *dev, const u32 *lip, u8 v6)
		}
	} else {
		write_unlock_bh(&ctbl->lock);
		dev_info(adap->pdev_dev, "CLIP table overflow, "
			 "Connections using %pI6c wont be offloaded",
			 (void *)lip);
		return -ENOMEM;
	}
	write_unlock_bh(&ctbl->lock);
@@ -146,6 +154,9 @@ void cxgb4_clip_release(const struct net_device *dev, const u32 *lip, u8 v6)
	int hash;
	int ret = -1;

	if (!ctbl)
		return;

	hash = clip_addr_hash(ctbl, addr, v6);

	read_lock_bh(&ctbl->lock);
+16 −6
Original line number Diff line number Diff line
@@ -4865,6 +4865,15 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
	}

#if IS_ENABLED(CONFIG_IPV6)
	if ((CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5) &&
	    (!(t4_read_reg(adapter, LE_DB_CONFIG_A) & ASLIPCOMPEN_F))) {
		/* CLIP functionality is not present in hardware,
		 * hence disable all offload features
		 */
		dev_warn(&pdev->dev,
			 "CLIP not enabled in hardware, continuing\n");
		adapter->params.offload = 0;
	} else {
		adapter->clipt = t4_init_clip_tbl(adapter->clipt_start,
						  adapter->clipt_end);
		if (!adapter->clipt) {
@@ -4875,6 +4884,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
				 "could not allocate Clip table, continuing\n");
			adapter->params.offload = 0;
		}
	}
#endif
	if (is_offload(adapter) && tid_init(&adapter->tids) < 0) {
		dev_warn(&pdev->dev, "could not allocate TID table, "
+4 −0
Original line number Diff line number Diff line
@@ -2802,6 +2802,10 @@
#define HASHEN_V(x) ((x) << HASHEN_S)
#define HASHEN_F    HASHEN_V(1U)

#define ASLIPCOMPEN_S    17
#define ASLIPCOMPEN_V(x) ((x) << ASLIPCOMPEN_S)
#define ASLIPCOMPEN_F    ASLIPCOMPEN_V(1U)

#define REQQPARERR_S    16
#define REQQPARERR_V(x) ((x) << REQQPARERR_S)
#define REQQPARERR_F    REQQPARERR_V(1U)