diff options
| author | Miquel Raynal <miquel.raynal@bootlin.com> | 2022-05-20 13:58:54 +0200 | 
|---|---|---|
| committer | Miquel Raynal <miquel.raynal@bootlin.com> | 2022-05-20 13:58:54 +0200 | 
| commit | e6828be5edcfea25cd70a2d1de41085c67ef9fa5 (patch) | |
| tree | 489ae4cdb47a4d83940e2472f49a3c601806b70e /net/mctp/route.c | |
| parent | 1fefc8ecb834c88edfc27e712d683872d0c541dd (diff) | |
| parent | c47452194641b5d27c20e557c84a46c85fd7ce37 (diff) | |
Merge tag 'spi-nor/for-5.19' into mtd/next
SPI NOR core changes:
- Read back written SR value to make sure the write was done correctly.
- Introduce a common function for Read ID that manufacturer drivers can
  use to verify the Octal DTR switch worked correctly.
- Add helpers for read/write any register commands so manufacturer
  drivers don't open code it every time.
- Clarify rdsr dummy cycles documentation.
- Add debugfs entry to expose internal flash parameters and state.
SPI NOR manufacturer drivers changes:
- Add support for Winbond W25Q512NW-IM, and Eon EN25QH256A.
- Move spi_nor_write_ear() to Winbond module since only Winbond flashes
  use it.
- Rework Micron and Cypress Octal DTR enable methods to improve
  readability.
- Use the common Read ID function to verify switch to Octal DTR mode for
  Micron and Cypress flashes.
- Skip polling status on volatile register writes for Micron and Cypress
  flashes since the operation is instant.
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Diffstat (limited to 'net/mctp/route.c')
| -rw-r--r-- | net/mctp/route.c | 16 | 
1 files changed, 12 insertions, 4 deletions
diff --git a/net/mctp/route.c b/net/mctp/route.c index d5e7db83fe9d..3b24b8d18b5b 100644 --- a/net/mctp/route.c +++ b/net/mctp/route.c @@ -503,6 +503,11 @@ static int mctp_route_output(struct mctp_route *route, struct sk_buff *skb)  	if (cb->ifindex) {  		/* direct route; use the hwaddr we stashed in sendmsg */ +		if (cb->halen != skb->dev->addr_len) { +			/* sanity check, sendmsg should have already caught this */ +			kfree_skb(skb); +			return -EMSGSIZE; +		}  		daddr = cb->haddr;  	} else {  		/* If lookup fails let the device handle daddr==NULL */ @@ -512,7 +517,7 @@ static int mctp_route_output(struct mctp_route *route, struct sk_buff *skb)  	rc = dev_hard_header(skb, skb->dev, ntohs(skb->protocol),  			     daddr, skb->dev->dev_addr, skb->len); -	if (rc) { +	if (rc < 0) {  		kfree_skb(skb);  		return -EHOSTUNREACH;  	} @@ -756,7 +761,7 @@ static int mctp_do_fragment_route(struct mctp_route *rt, struct sk_buff *skb,  {  	const unsigned int hlen = sizeof(struct mctp_hdr);  	struct mctp_hdr *hdr, *hdr2; -	unsigned int pos, size; +	unsigned int pos, size, headroom;  	struct sk_buff *skb2;  	int rc;  	u8 seq; @@ -770,6 +775,9 @@ static int mctp_do_fragment_route(struct mctp_route *rt, struct sk_buff *skb,  		return -EMSGSIZE;  	} +	/* keep same headroom as the original skb */ +	headroom = skb_headroom(skb); +  	/* we've got the header */  	skb_pull(skb, hlen); @@ -777,7 +785,7 @@ static int mctp_do_fragment_route(struct mctp_route *rt, struct sk_buff *skb,  		/* size of message payload */  		size = min(mtu - hlen, skb->len - pos); -		skb2 = alloc_skb(MCTP_HEADER_MAXLEN + hlen + size, GFP_KERNEL); +		skb2 = alloc_skb(headroom + hlen + size, GFP_KERNEL);  		if (!skb2) {  			rc = -ENOMEM;  			break; @@ -793,7 +801,7 @@ static int mctp_do_fragment_route(struct mctp_route *rt, struct sk_buff *skb,  			skb_set_owner_w(skb2, skb->sk);  		/* establish packet */ -		skb_reserve(skb2, MCTP_HEADER_MAXLEN); +		skb_reserve(skb2, headroom);  		skb_reset_network_header(skb2);  		skb_put(skb2, hlen + size);  		skb2->transport_header = skb2->network_header + hlen;  | 
