10
10
* Maintainer: Kumar Gala
11
11
* Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com>
13
* Copyright 2002-2009 Freescale Semiconductor, Inc.
13
* Copyright 2002-2009, 2011 Freescale Semiconductor, Inc.
14
14
* Copyright 2007 MontaVista Software, Inc.
16
16
* This program is free software; you can redistribute it and/or modify it
365
365
gfar_write(®s->rir0, DEFAULT_RIR0);
368
if (priv->rx_csum_enable)
368
if (ndev->features & NETIF_F_RXCSUM)
369
369
rctrl |= RCTRL_CHECKSUMMING;
371
371
if (priv->extended_hash) {
463
463
.ndo_start_xmit = gfar_start_xmit,
464
464
.ndo_stop = gfar_close,
465
465
.ndo_change_mtu = gfar_change_mtu,
466
.ndo_set_features = gfar_set_features,
466
467
.ndo_set_multicast_list = gfar_set_multi,
467
468
.ndo_tx_timeout = gfar_timeout,
468
469
.ndo_do_ioctl = gfar_ioctl,
513
511
/* Returns 1 if incoming frames use an FCB */
514
512
static inline int gfar_uses_fcb(struct gfar_private *priv)
516
return priv->vlgrp || priv->rx_csum_enable ||
514
return priv->vlgrp || (priv->ndev->features & NETIF_F_RXCSUM) ||
517
515
(priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER);
869
867
rqfcr = RQFCR_CLE | RQFCR_PID_MASK | RQFCR_CMP_EXACT;
870
ftp_rqfpr[rqfar] = rqfpr;
871
ftp_rqfcr[rqfar] = rqfcr;
868
priv->ftp_rqfpr[rqfar] = rqfpr;
869
priv->ftp_rqfcr[rqfar] = rqfcr;
872
870
gfar_write_filer(priv, rqfar, rqfcr, rqfpr);
875
873
rqfcr = RQFCR_CMP_NOMATCH;
876
ftp_rqfpr[rqfar] = rqfpr;
877
ftp_rqfcr[rqfar] = rqfcr;
874
priv->ftp_rqfpr[rqfar] = rqfpr;
875
priv->ftp_rqfcr[rqfar] = rqfcr;
878
876
gfar_write_filer(priv, rqfar, rqfcr, rqfpr);
881
879
rqfcr = RQFCR_CMP_EXACT | RQFCR_PID_PARSE | RQFCR_CLE | RQFCR_AND;
883
ftp_rqfcr[rqfar] = rqfcr;
884
ftp_rqfpr[rqfar] = rqfpr;
881
priv->ftp_rqfcr[rqfar] = rqfcr;
882
priv->ftp_rqfpr[rqfar] = rqfpr;
885
883
gfar_write_filer(priv, rqfar, rqfcr, rqfpr);
888
886
rqfcr = RQFCR_CMP_EXACT | RQFCR_PID_MASK | RQFCR_AND;
890
ftp_rqfcr[rqfar] = rqfcr;
891
ftp_rqfpr[rqfar] = rqfpr;
888
priv->ftp_rqfcr[rqfar] = rqfcr;
889
priv->ftp_rqfpr[rqfar] = rqfpr;
892
890
gfar_write_filer(priv, rqfar, rqfcr, rqfpr);
904
902
/* Default rule */
905
903
rqfcr = RQFCR_CMP_MATCH;
906
ftp_rqfcr[rqfar] = rqfcr;
907
ftp_rqfpr[rqfar] = rqfpr;
904
priv->ftp_rqfcr[rqfar] = rqfcr;
905
priv->ftp_rqfpr[rqfar] = rqfpr;
908
906
gfar_write_filer(priv, rqfar, rqfcr, rqfpr);
910
908
rqfar = cluster_entry_per_class(priv, rqfar, RQFPR_IPV6);
920
918
/* Rest are masked rules */
921
919
rqfcr = RQFCR_CMP_NOMATCH;
922
920
for (i = 0; i < rqfar; i++) {
923
ftp_rqfcr[i] = rqfcr;
924
ftp_rqfpr[i] = rqfpr;
921
priv->ftp_rqfcr[i] = rqfcr;
922
priv->ftp_rqfpr[i] = rqfpr;
925
923
gfar_write_filer(priv, i, rqfcr, rqfpr);
1030
1028
netif_napi_add(dev, &priv->gfargrp[i].napi, gfar_poll, GFAR_DEV_WEIGHT);
1032
1030
if (priv->device_flags & FSL_GIANFAR_DEV_HAS_CSUM) {
1033
priv->rx_csum_enable = 1;
1034
dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_HIGHDMA;
1036
priv->rx_csum_enable = 0;
1031
dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG |
1033
dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG |
1034
NETIF_F_RXCSUM | NETIF_F_HIGHDMA;
1038
1037
priv->vlgrp = NULL;
2292
/* Check if rx parser should be activated */
2293
void gfar_check_rx_parser_mode(struct gfar_private *priv)
2295
struct gfar __iomem *regs;
2298
regs = priv->gfargrp[0].regs;
2300
tempval = gfar_read(®s->rctrl);
2301
/* If parse is no longer required, then disable parser */
2302
if (tempval & RCTRL_REQ_PARSER)
2303
tempval |= RCTRL_PRSDEP_INIT;
2305
tempval &= ~RCTRL_PRSDEP_INIT;
2306
gfar_write(®s->rctrl, tempval);
2294
2310
/* Enables and disables VLAN insertion/extraction */
2295
2311
static void gfar_vlan_rx_register(struct net_device *dev,
2326
2342
/* Disable VLAN tag extraction */
2327
2343
tempval = gfar_read(®s->rctrl);
2328
2344
tempval &= ~RCTRL_VLEX;
2329
/* If parse is no longer required, then disable parser */
2330
if (tempval & RCTRL_REQ_PARSER)
2331
tempval |= RCTRL_PRSDEP_INIT;
2333
tempval &= ~RCTRL_PRSDEP_INIT;
2334
2345
gfar_write(®s->rctrl, tempval);
2347
gfar_check_rx_parser_mode(priv);
2337
2350
gfar_change_mtu(dev, dev->mtu);
2697
2710
if (priv->padding)
2698
2711
skb_pull(skb, priv->padding);
2700
if (priv->rx_csum_enable)
2713
if (dev->features & NETIF_F_RXCSUM)
2701
2714
gfar_rx_checksum(skb, fcb);
2703
2716
/* Tell the skb what kind of packet this is */