aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/gemini/config-3.3
blob: ce6485015ff0b49a6229127277d720657e7ca23a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
CONFIG_ALIGNMENT_TRAP=y
CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y
CONFIG_ARCH_GEMINI=y
CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
CONFIG_ARCH_NR_GPIO=0
CONFIG_ARCH_REQUIRE_GPIOLIB=y
# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
CONFIG_ARCH_USES_GETTIMEOFFSET=y
CONFIG_ARM=y
# CONFIG_ARM_CPU_SUSPEND is not set
CONFIG_ARM_L1_CACHE_SHIFT=5
CONFIG_ARM_NR_BANKS=8
CONFIG_ARM_PATCH_PHYS_VIRT=y
# CONFIG_ARPD is not set
CONFIG_ATA=m
CONFIG_BCMA_POSSIBLE=y
# CONFIG_CACHE_L2X0 is not set
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=squashfs,jffs2 noinitrd console=ttyS0,19200 mem=32M"
CONFIG_CMDLINE_FROM_BOOTLOADER=y
CONFIG_CPU_32v4=y
CONFIG_CPU_ABRT_EV4=y
# CONFIG_CPU_BPREDICT_DISABLE is not set
CONFIG_CPU_CACHE_FA=y
CONFIG_CPU_CACHE_VIVT=y
CONFIG_CPU_COPY_FA=y
CONFIG_CPU_CP15=y
CONFIG_CPU_CP15_MMU=y
# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
CONFIG_CPU_FA526=y
# CONFIG_CPU_ICACHE_DISABLE is not set
CONFIG_CPU_PABRT_LEGACY=y
CONFIG_CPU_TLB_FA=y
CONFIG_CPU_USE_DOMAINS=y
# CONFIG_DEBUG_USER is not set
CONFIG_DECOMPRESS_LZMA=y
CONFIG_DLCI=m
CONFIG_DLCI_MAX=8
CONFIG_DMADEVICES=y
CONFIG_DNOTIFY=y
# CONFIG_DSCC4 is not set
# CONFIG_FARSYNC is not set
CONFIG_FRAME_POINTER=y
CONFIG_GEMINI_MEM_SWAP=y
CONFIG_GEMINI_NET_ENGINE_GMAC=y
CONFIG_GEMINI_WATCHDOG=y
CONFIG_GENERIC_ATOMIC64=y
CONFIG_GENERIC_BUG=y
CONFIG_GENERIC_GPIO=y
CONFIG_GENERIC_IRQ_SHOW=y
CONFIG_GENERIC_PCI_IOMAP=y
CONFIG_GPIOLIB=y
CONFIG_GPIO_SYSFS=y
# CONFIG_HAMRADIO is not set
CONFIG_HARDIRQS_SW_RESEND=y
CONFIG_HAS_DMA=y
CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT=y
CONFIG_HAVE_AOUT=y
CONFIG_HAVE_ARCH_KGDB=y
CONFIG_HAVE_ARCH_PFN_VALID=y
CONFIG_HAVE_C_RECORDMCOUNT=y
CONFIG_HAVE_DMA_API_DEBUG=y
CONFIG_HAVE_DYNAMIC_FTRACE=y
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
CONFIG_HAVE_FUNCTION_TRACER=y
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
CONFIG_HAVE_GENERIC_HARDIRQS=y
CONFIG_HAVE_IDE=y
CONFIG_HAVE_IRQ_WORK=y
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_HAVE_KERNEL_LZO=y
CONFIG_HAVE_KERNEL_XZ=y
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
CONFIG_HAVE_MEMBLOCK=y
CONFIG_HAVE_OPROFILE=y
CONFIG_HAVE_PERF_EVENTS=y
CONFIG_HAVE_PROC_CPU=y
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
CONFIG_HAVE_SPARSE_IRQ=y
CONFIG_HDLC=m
CONFIG_HDLC_CISCO=m
CONFIG_HDLC_FR=m
CONFIG_HDLC_PPP=m
CONFIG_HDLC_RAW=m
CONFIG_HWMON=y
CONFIG_HW_RANDOM=y
CONFIG_I2C=y
CONFIG_I2C_BOARDINFO=y
CONFIG_I2C_CHARDEV=y
CONFIG_INITRAMFS_SOURCE=""
# CONFIG_IP_ADVANCED_ROUTER is not set
CONFIG_IP_PIMSM_V1=y
CONFIG_IP_PIMSM_V2=y
CONFIG_KTIME_SCALAR=y
CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256
CONFIG_MACH_NAS4220B=y
CONFIG_MACH_RUT100=y
CONFIG_MACH_WBD111=y
CONFIG_MACH_WBD222=y
CONFIG_MDIO_BITBANG=y
CONFIG_MDIO_BOARDINFO=y
CONFIG_MDIO_GPIO=y
CONFIG_MIGHT_HAVE_PCI=y
CONFIG_MTD_PHYSMAP=y
CONFIG_MTD_REDBOOT_PARTS=y
CONFIG_NEED_DMA_MAP_STATE=y
CONFIG_NEED_PER_CPU_KM=y
CONFIG_NLS=m
CONFIG_PAGEFLAGS_EXTENDED=y
CONFIG_PAGE_OFFSET=0xC0000000
CONFIG_PCI=y
CONFIG_PERF_USE_VMALLOC=y
CONFIG_PHYLIB=y
# CONFIG_PREEMPT_RCU is not set
CONFIG_SCSI=m
CONFIG_SCSI_MOD=m
# CONFIG_SCSI_MULTI_LUN is not set
CONFIG_SPLIT_PTLOCK_CPUS=999999
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
CONFIG_UID16=y
CONFIG_USB=m
CONFIG_USB_ARCH_HAS_XHCI=y
CONFIG_USB_COMMON=m
# CONFIG_USB_EHCI_HCD is not set
CONFIG_USB_SUPPORT=y
# CONFIG_USB_UHCI_HCD is not set
CONFIG_VECTORS_BASE=0xffff0000
CONFIG_VM_EVENT_COUNTERS=y
CONFIG_WAN=y
CONFIG_XZ_DEC=y
CONFIG_ZBOOT_ROM_BSS=0x0
CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZONE_DMA_FLAG=0
-trunk-r3314/ath/if_ath.c 2008-04-17 18:17:28.000000000 +0200 @@ -3237,7 +3237,6 @@ struct ath_softc *sc = dev->priv; struct ieee80211_node *ni = NULL; struct ath_buf *bf = NULL; - struct ether_header *eh; ath_bufhead bf_head; struct ath_buf *tbf, *tempbf; struct sk_buff *tskb; @@ -3249,6 +3248,7 @@ */ int requeue = 0; #ifdef ATH_SUPERG_FF + struct ether_header *eh; unsigned int pktlen; struct ieee80211com *ic = &sc->sc_ic; struct ath_node *an; @@ -3314,27 +3314,9 @@ requeue = 1; goto hardstart_fail; } -#endif - /* If the skb data is shared, we will copy it so we can strip padding - * without affecting any other bridge ports. */ - if (skb_cloned(skb)) { - /* Remember the original SKB so we can free up our references */ - struct sk_buff *skb_new; - skb_new = skb_copy(skb, GFP_ATOMIC); - if (skb_new == NULL) { - DPRINTF(sc, ATH_DEBUG_XMIT, - "Dropping; skb_copy failure.\n"); - /* No free RAM, do not requeue! */ - goto hardstart_fail; - } - ieee80211_skb_copy_noderef(skb, skb_new); - ieee80211_dev_kfree_skb(&skb); - skb = skb_new; - } eh = (struct ether_header *)skb->data; -#ifdef ATH_SUPERG_FF /* NB: use this lock to protect an->an_tx_ffbuf (and txq->axq_stageq) * in athff_can_aggregate() call too. */ ATH_TXQ_LOCK_IRQ(txq); Index: madwifi-trunk-r3314/net80211/ieee80211_output.c =================================================================== --- madwifi-trunk-r3314.orig/net80211/ieee80211_output.c 2008-04-17 18:17:27.000000000 +0200 +++ madwifi-trunk-r3314/net80211/ieee80211_output.c 2008-04-17 18:18:04.000000000 +0200 @@ -283,7 +283,7 @@ * normal vap. */ if (vap->iv_xrvap && (ni == vap->iv_bss) && vap->iv_xrvap->iv_sta_assoc) { - struct sk_buff *skb1 = skb_copy(skb, GFP_ATOMIC); + struct sk_buff *skb1 = skb_clone(skb, GFP_ATOMIC); if (skb1) { memset(SKB_CB(skb1), 0, sizeof(struct ieee80211_cb)); #ifdef IEEE80211_DEBUG_REFCNT @@ -615,100 +615,45 @@ skb = skb_unshare(skb, GFP_ATOMIC); } -#ifdef ATH_SUPERG_FF - if (isff) { - if (skb == NULL) { + if (skb_cloned(skb) || + (need_headroom > skb_headroom(skb)) || + (!isff && (need_tailroom > skb_tailroom(skb)))) { + + if (pskb_expand_head(skb, need_headroom, need_tailroom, GFP_ATOMIC)) { IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT, - "%s: cannot unshare for encapsulation\n", - __func__); + "%s: cannot expand storage (tail)\n", __func__); vap->iv_stats.is_tx_nobuf++; - ieee80211_dev_kfree_skb(&skb2); - + ieee80211_dev_kfree_skb(&skb); return NULL; } + } - /* first skb header */ - if (skb_headroom(skb) < need_headroom) { - struct sk_buff *tmp = skb; - skb = skb_realloc_headroom(skb, need_headroom); - if (skb == NULL) { - IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT, - "%s: cannot expand storage (head1)\n", - __func__); - vap->iv_stats.is_tx_nobuf++; - ieee80211_dev_kfree_skb(&skb2); - return NULL; - } else - ieee80211_skb_copy_noderef(tmp, skb); - ieee80211_dev_kfree_skb(&tmp); - /* NB: cb[] area was copied, but not next ptr. must do that - * prior to return on success. */ +#ifdef ATH_SUPERG_FF + if (isff) { + if (skb_shared(skb2)) { + /* Take our own reference to the node in the clone */ + ieee80211_ref_node(SKB_CB(skb2)->ni); + /* Unshare the node, decrementing users in the old skb */ + skb2 = skb_unshare(skb2, GFP_ATOMIC); } - /* second skb with header and tail adjustments possible */ - if (skb_tailroom(skb2) < need_tailroom) { - int n = 0; - if (inter_headroom > skb_headroom(skb2)) - n = inter_headroom - skb_headroom(skb2); - if (pskb_expand_head(skb2, n, - need_tailroom - skb_tailroom(skb2), GFP_ATOMIC)) { - ieee80211_dev_kfree_skb(&skb2); - IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT, - "%s: cannot expand storage (tail2)\n", - __func__); - vap->iv_stats.is_tx_nobuf++; - /* this shouldn't happen, but don't send first ff either */ - ieee80211_dev_kfree_skb(&skb); - } - } else if (skb_headroom(skb2) < inter_headroom) { - struct sk_buff *tmp = skb2; + if ((skb_cloned(skb2) || + (inter_headroom > skb_headroom(skb2)) || + (need_tailroom > skb_tailroom(skb2)))) { - skb2 = skb_realloc_headroom(skb2, inter_headroom); - if (skb2 == NULL) { + if (pskb_expand_head(skb2, inter_headroom, + need_tailroom, GFP_ATOMIC)) { IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT, - "%s: cannot expand storage (head2)\n", - __func__); + "%s: cannot expand storage (tail)\n", __func__); vap->iv_stats.is_tx_nobuf++; - /* this shouldn't happen, but don't send first ff either */ ieee80211_dev_kfree_skb(&skb); - skb = NULL; - } else - ieee80211_skb_copy_noderef(tmp, skb); - ieee80211_dev_kfree_skb(&tmp); - } - if (skb) { - skb->next = skb2; + ieee80211_dev_kfree_skb(&skb2); + return NULL; + } } - return skb; + skb->next = skb2; } #endif /* ATH_SUPERG_FF */ - if (skb == NULL) { - IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT, - "%s: cannot unshare for encapsulation\n", __func__); - vap->iv_stats.is_tx_nobuf++; - } else if (skb_tailroom(skb) < need_tailroom) { - int n = 0; - if (need_headroom > skb_headroom(skb)) - n = need_headroom - skb_headroom(skb); - if (pskb_expand_head(skb, n, need_tailroom - - skb_tailroom(skb), GFP_ATOMIC)) { - IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT, - "%s: cannot expand storage (tail)\n", __func__); - vap->iv_stats.is_tx_nobuf++; - ieee80211_dev_kfree_skb(&skb); - } - } else if (skb_headroom(skb) < need_headroom) { - struct sk_buff *tmp = skb; - skb = skb_realloc_headroom(skb, need_headroom); - /* Increment reference count after copy */ - if (skb == NULL) { - IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT, - "%s: cannot expand storage (head)\n", __func__); - vap->iv_stats.is_tx_nobuf++; - } else - ieee80211_skb_copy_noderef(tmp, skb); - ieee80211_dev_kfree_skb(&tmp); - } return skb; } Index: madwifi-trunk-r3314/net80211/ieee80211_input.c =================================================================== --- madwifi-trunk-r3314.orig/net80211/ieee80211_input.c 2008-04-17 18:17:28.000000000 +0200 +++ madwifi-trunk-r3314/net80211/ieee80211_input.c 2008-04-17 18:25:48.000000000 +0200 @@ -244,20 +244,6 @@ vap->iv_stats.is_rx_tooshort++; goto out; } - /* Clone the SKB... we assume somewhere in this driver that we 'own' - * the skbuff passed into hard start and we do a lot of messing with it - * but bridges under some cases will not clone for the first pass of skb - * to a bridge port, but will then clone for subsequent ones. This is - * odd behavior but it means that if we have trashed the skb we are given - * then other ports get clones of the residual garbage. - */ - if ((skb2 = skb_copy(skb, GFP_ATOMIC)) == NULL) { - vap->iv_devstats.tx_dropped++; - goto out; - } - ieee80211_skb_copy_noderef(skb, skb2); - ieee80211_dev_kfree_skb(&skb); - skb = skb2; /* * Bit of a cheat here, we use a pointer for a 3-address @@ -738,7 +724,7 @@ /* ether_type must be length as FF frames are always LLC/SNAP encap'd */ frame_len = ntohs(eh_tmp->ether_type); - skb1 = skb_copy(skb, GFP_ATOMIC); + skb1 = skb_clone(skb, GFP_ATOMIC); if (skb1 == NULL) goto err; ieee80211_skb_copy_noderef(skb, skb1); @@ -1137,7 +1123,7 @@ if (ETHER_IS_MULTICAST(eh->ether_dhost) && !netif_queue_stopped(dev)) { /* Create a SKB for the BSS to send out. */ - skb1 = skb_copy(skb, GFP_ATOMIC); + skb1 = skb_clone(skb, GFP_ATOMIC); if (skb1) SKB_CB(skb1)->ni = ieee80211_ref_node(vap->iv_bss); }