提交 7275ebfc 编写于 作者: R Raghu Vatsavayi 提交者: David S. Miller

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: NDerek Chickles <derek.chickles@caviumnetworks.com>
Signed-off-by: NSatanand Burla <satananda.burla@caviumnetworks.com>
Signed-off-by: NFelix Manlunas <felix.manlunas@caviumnetworks.com>
Signed-off-by: NRaghu Vatsavayi <raghu.vatsavayi@caviumnetworks.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 a5b37888
......@@ -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;
......
......@@ -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;
};
......
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册