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

Commit 7275ebfc authored by Raghu Vatsavayi's avatar Raghu Vatsavayi Committed by David S. Miller
Browse files

liquidio: New driver FW command structure



This patch is for new driver/firmware control command structure
(octnic_packet_params and octnic_cmd_setup ) and resultant code changes.

Signed-off-by: default avatarDerek Chickles <derek.chickles@caviumnetworks.com>
Signed-off-by: default avatarSatanand Burla <satananda.burla@caviumnetworks.com>
Signed-off-by: default avatarFelix Manlunas <felix.manlunas@caviumnetworks.com>
Signed-off-by: default avatarRaghu Vatsavayi <raghu.vatsavayi@caviumnetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a5b37888
Loading
Loading
Loading
Loading
+3 −106
Original line number Diff line number Diff line
@@ -2704,68 +2704,6 @@ static inline int send_nic_timestamp_pkt(struct octeon_device *oct,
	return retval;
}

static inline int is_ipv4(struct sk_buff *skb)
{
	return (skb->protocol == htons(ETH_P_IP)) &&
	       (ip_hdr(skb)->version == 4);
}

static inline int is_vlan(struct sk_buff *skb)
{
	return skb->protocol == htons(ETH_P_8021Q);
}

static inline int is_ip_fragmented(struct sk_buff *skb)
{
	/* The Don't fragment and Reserved flag fields are ignored.
	 * IP is fragmented if
	 * -  the More fragments bit is set (indicating this IP is a fragment
	 * with more to follow; the current offset could be 0 ).
	 * -  ths offset field is non-zero.
	 */
	return (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) ? 1 : 0;
}

static inline int is_ipv6(struct sk_buff *skb)
{
	return (skb->protocol == htons(ETH_P_IPV6)) &&
	       (ipv6_hdr(skb)->version == 6);
}

static inline int is_with_extn_hdr(struct sk_buff *skb)
{
	return (ipv6_hdr(skb)->nexthdr != IPPROTO_TCP) &&
	       (ipv6_hdr(skb)->nexthdr != IPPROTO_UDP);
}

static inline int is_tcpudp(struct sk_buff *skb)
{
	return (ip_hdr(skb)->protocol == IPPROTO_TCP) ||
	       (ip_hdr(skb)->protocol == IPPROTO_UDP);
}

static inline u32 get_ipv4_5tuple_tag(struct sk_buff *skb)
{
	u32 tag;
	struct iphdr *iphdr = ip_hdr(skb);

	tag = crc32(0, &iphdr->protocol, 1);
	tag = crc32(tag, (u8 *)&iphdr->saddr, 8);
	tag = crc32(tag, skb_transport_header(skb), 4);
	return tag;
}

static inline u32 get_ipv6_5tuple_tag(struct sk_buff *skb)
{
	u32 tag;
	struct ipv6hdr *ipv6hdr = ipv6_hdr(skb);

	tag = crc32(0, &ipv6hdr->nexthdr, 1);
	tag = crc32(tag, (u8 *)&ipv6hdr->saddr, 32);
	tag = crc32(tag, skb_transport_header(skb), 4);
	return tag;
}

/** \brief Transmit networks packets to the Octeon interface
 * @param skbuff   skbuff struct to be passed to network layer.
 * @param netdev    pointer to network device
@@ -2852,52 +2790,11 @@ static int liquidio_xmit(struct sk_buff *skb, struct net_device *netdev)

	cmdsetup.u64 = 0;
	cmdsetup.s.ifidx = lio->linfo.ifidx;
	cmdsetup.s.iq_no = iq_no;

	if (skb->ip_summed == CHECKSUM_PARTIAL) {
		if (is_ipv4(skb) && !is_ip_fragmented(skb) && is_tcpudp(skb)) {
			tag = get_ipv4_5tuple_tag(skb);

			cmdsetup.s.cksum_offset = sizeof(struct ethhdr) + 1;

			if (ip_hdr(skb)->ihl > 5)
				cmdsetup.s.ipv4opts_ipv6exthdr =
						OCT_PKT_PARAM_IPV4OPTS;

		} else if (is_ipv6(skb)) {
			tag = get_ipv6_5tuple_tag(skb);
	if (skb->ip_summed == CHECKSUM_PARTIAL)
		cmdsetup.s.transport_csum = 1;

			cmdsetup.s.cksum_offset = sizeof(struct ethhdr) + 1;

			if (is_with_extn_hdr(skb))
				cmdsetup.s.ipv4opts_ipv6exthdr =
						OCT_PKT_PARAM_IPV6EXTHDR;

		} else if (is_vlan(skb)) {
			if (vlan_eth_hdr(skb)->h_vlan_encapsulated_proto
				== htons(ETH_P_IP) &&
				!is_ip_fragmented(skb) && is_tcpudp(skb)) {
				tag = get_ipv4_5tuple_tag(skb);

				cmdsetup.s.cksum_offset =
					sizeof(struct vlan_ethhdr) + 1;

				if (ip_hdr(skb)->ihl > 5)
					cmdsetup.s.ipv4opts_ipv6exthdr =
						OCT_PKT_PARAM_IPV4OPTS;

			} else if (vlan_eth_hdr(skb)->h_vlan_encapsulated_proto
				== htons(ETH_P_IPV6)) {
				tag = get_ipv6_5tuple_tag(skb);

				cmdsetup.s.cksum_offset =
					sizeof(struct vlan_ethhdr) + 1;

				if (is_with_extn_hdr(skb))
					cmdsetup.s.ipv4opts_ipv6exthdr =
						OCT_PKT_PARAM_IPV6EXTHDR;
			}
		}
	}
	if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) {
		skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
		cmdsetup.s.timestamp = 1;
+11 −14
Original line number Diff line number Diff line
@@ -463,30 +463,27 @@ union octeon_rh {

#define  OCT_RH_SIZE   (sizeof(union  octeon_rh))

#define OCT_PKT_PARAM_IPV4OPTS   1
#define OCT_PKT_PARAM_IPV6EXTHDR 2

union octnic_packet_params {
	u32 u32;
	struct {
#ifdef __BIG_ENDIAN_BITFIELD
		u32 reserved:6;
		u32 reserved:16;
		u32 ip_csum:1;		/* Perform IP header checksum(s) */
		/* Perform Outer transport header checksum */
		u32 transport_csum:1;
		/* Find tunnel, and perform transport csum. */
		u32 tnl_csum:1;
		u32 ip_csum:1;
		u32 ipv4opts_ipv6exthdr:2;
		u32 ipsec_ops:4;
		u32 tsflag:1;
		u32 csoffset:9;
		u32 tsflag:1;		/* Timestamp this packet */
		u32 ipsec_ops:4;	/* IPsec operation */
		u32 ifidx:8;
#else
		u32 ifidx:8;
		u32 csoffset:9;
		u32 tsflag:1;
		u32 ipsec_ops:4;
		u32 ipv4opts_ipv6exthdr:2;
		u32 ip_csum:1;
		u32 tsflag:1;
		u32 tnl_csum:1;
		u32 reserved:6;
		u32 transport_csum:1;
		u32 ip_csum:1;
		u32 reserved:16;
#endif
	} s;
};
+5 −10
Original line number Diff line number Diff line
@@ -94,15 +94,15 @@ struct octnic_data_pkt {
 */
union octnic_cmd_setup {
	struct {
		u32 ifidx:8;
		u32 cksum_offset:7;
		u32 iq_no:8;
		u32 gather:1;
		u32 timestamp:1;
		u32 ipv4opts_ipv6exthdr:2;
		u32 ip_csum:1;
		u32 transport_csum:1;
		u32 tnl_csum:1;

		u32 ifidx:8;
		u32 rsvd:11;

		union {
			u32 datasize;
			u32 gatherptrs;
@@ -172,13 +172,8 @@ octnet_prepare_pci_cmd(struct octeon_instr_64B *cmd,

	packet_params.u32 = 0;

	if (setup->s.cksum_offset) {
		packet_params.s.csoffset = setup->s.cksum_offset;
		packet_params.s.ipv4opts_ipv6exthdr =
						setup->s.ipv4opts_ipv6exthdr;
	}

	packet_params.s.ip_csum = setup->s.ip_csum;
	packet_params.s.transport_csum = setup->s.transport_csum;
	packet_params.s.tnl_csum = setup->s.tnl_csum;
	packet_params.s.ifidx = setup->s.ifidx;
	packet_params.s.tsflag = setup->s.timestamp;