]> git.pld-linux.org Git - packages/kernel.git/blob - linux-2.4.13-acenic-rollback.patch
- [2.4.2x, 2.6.x] don't recursively crash in die() on CHRP/PReP machines
[packages/kernel.git] / linux-2.4.13-acenic-rollback.patch
1 diff -u --recursive --new-file v2.4.12/linux/drivers/net/acenic.c linux/drivers/net/acenic.c
2 --- v2.4.12/linux/drivers/net/acenic.c  Thu Oct 11 08:02:26 2001
3 +++ linux/drivers/net/acenic.c  Fri Oct 12 15:35:53 2001
4 @@ -165,10 +165,6 @@
5  #define SMP_CACHE_BYTES        L1_CACHE_BYTES
6  #endif
7  
8 -#if (BITS_PER_LONG == 64) || defined(CONFIG_HIGHMEM)
9 -#define ACE_64BIT_PTR  1
10 -#endif
11 -
12  #ifndef SET_MODULE_OWNER
13  #define SET_MODULE_OWNER(dev)          {do{} while(0);}
14  #define ACE_MOD_INC_USE_COUNT          MOD_INC_USE_COUNT
15 @@ -203,9 +199,15 @@
16         *dma_handle = virt_to_bus(virt_ptr);
17         return virt_ptr;
18  }
19 +
20  #define pci_free_consistent(cookie, size, ptr, dma_ptr)        kfree(ptr)
21 -#define pci_map_single(cookie, address, size, dir)     virt_to_bus(address)
22 -#define pci_unmap_single(cookie, address, size, dir)
23 +#define pci_map_page(cookie, page, off, size, dir)     \
24 +       virt_to_bus(page_address(page)+(off))
25 +#define pci_unmap_page(cookie, address, size, dir)
26 +#define pci_set_dma_mask(dev, mask)            \
27 +       (((u64)(mask) & 0xffffffff00000000) == 0 ? 0 : -EIO)
28 +#define pci_dma_supported(dev, mask)           \
29 +       (((u64)(mask) & 0xffffffff00000000) == 0 ? 1 : 0)
30  #endif
31  
32  #if (LINUX_VERSION_CODE < 0x02032b)
33 @@ -263,10 +265,6 @@
34  #define ace_if_down(dev)                       {do{} while(0);}
35  #endif
36  
37 -#ifndef pci_set_dma_mask
38 -#define pci_set_dma_mask(dev, mask)            dev->dma_mask = mask;
39 -#endif
40 -
41  #if (LINUX_VERSION_CODE >= 0x02031b)
42  #define NEW_NETINIT
43  #define ACE_PROBE_ARG                          void
44 @@ -598,7 +596,7 @@
45                 dev->irq = pdev->irq;
46                 dev->open = &ace_open;
47                 dev->hard_start_xmit = &ace_start_xmit;
48 -               dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_HIGHDMA;
49 +               dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
50                 if (1) {
51                         static void ace_watchdog(struct net_device *dev);
52                         dev->tx_timeout = &ace_watchdog;
53 @@ -740,6 +738,8 @@
54                         kfree(dev);
55                         continue;
56                 }
57 +               if (ap->pci_using_dac)
58 +                       dev->features |= NETIF_F_HIGHDMA;
59  
60                 boards_found++;
61         }
62 @@ -816,9 +816,9 @@
63                                 dma_addr_t mapping;
64  
65                                 mapping = ap->skb->rx_std_skbuff[i].mapping;
66 -                               pci_unmap_single(ap->pdev, mapping,
67 -                                                ACE_STD_BUFSIZE - (2 + 16),
68 -                                                PCI_DMA_FROMDEVICE);
69 +                               pci_unmap_page(ap->pdev, mapping,
70 +                                              ACE_STD_BUFSIZE - (2 + 16),
71 +                                              PCI_DMA_FROMDEVICE);
72  
73                                 ap->rx_std_ring[i].size = 0;
74                                 ap->skb->rx_std_skbuff[i].skb = NULL;
75 @@ -833,9 +833,9 @@
76                                         dma_addr_t mapping;
77  
78                                         mapping = ap->skb->rx_mini_skbuff[i].mapping;
79 -                                       pci_unmap_single(ap->pdev, mapping,
80 -                                                        ACE_MINI_BUFSIZE - (2 + 16),
81 -                                                        PCI_DMA_FROMDEVICE);
82 +                                       pci_unmap_page(ap->pdev, mapping,
83 +                                                      ACE_MINI_BUFSIZE - (2 + 16),
84 +                                                      PCI_DMA_FROMDEVICE);
85  
86                                         ap->rx_mini_ring[i].size = 0;
87                                         ap->skb->rx_mini_skbuff[i].skb = NULL;
88 @@ -849,9 +849,9 @@
89                                 dma_addr_t mapping;
90  
91                                 mapping = ap->skb->rx_jumbo_skbuff[i].mapping;
92 -                               pci_unmap_single(ap->pdev, mapping,
93 -                                                ACE_JUMBO_BUFSIZE - (2 + 16),
94 -                                                PCI_DMA_FROMDEVICE);
95 +                               pci_unmap_page(ap->pdev, mapping,
96 +                                              ACE_JUMBO_BUFSIZE - (2 + 16),
97 +                                              PCI_DMA_FROMDEVICE);
98  
99                                 ap->rx_jumbo_ring[i].size = 0;
100                                 ap->skb->rx_jumbo_skbuff[i].skb = NULL;
101 @@ -1210,12 +1210,6 @@
102                 ap->pci_latency);
103  
104         /*
105 -        * Make sure to enable the 64 bit DMA mask if we're in a 64bit slot
106 -        */
107 -       if (!(pci_state & PCI_32BIT))
108 -               pci_set_dma_mask(ap->pdev, (dma_addr_t)~0ULL);
109 -
110 -       /*
111          * Set the max DMA transfer size. Seems that for most systems
112          * the performance is better when no MAX parameter is
113          * set. However for systems enabling PCI write and invalidate,
114 @@ -1309,12 +1303,24 @@
115  #endif
116                 
117         /*
118 +        * Configure DMA attributes.
119 +        */
120 +       if (!pci_set_dma_mask(ap->pdev, (u64) 0xffffffffffffffff)) {
121 +               ap->pci_using_dac = 1;
122 +       } else if (!pci_set_dma_mask(ap->pdev, (u64) 0xffffffff)) {
123 +               ap->pci_using_dac = 0;
124 +       } else {
125 +               ecode = -ENODEV;
126 +               goto init_error;
127 +       }
128 +
129 +       /*
130          * Initialize the generic info block and the command+event rings
131          * and the control blocks for the transmit and receive rings
132          * as they need to be setup once and for all.
133          */
134         if (!(info = pci_alloc_consistent(ap->pdev, sizeof(struct ace_info),
135 -                                   &ap->info_dma))) {
136 +                                         &ap->info_dma))) {
137                 ecode = -EAGAIN;
138                 goto init_error;
139         }
140 @@ -1355,12 +1361,8 @@
141         ace_load_firmware(dev);
142         ap->fw_running = 0;
143  
144 -       tmp_ptr = (unsigned long) ap->info_dma;
145 -#ifdef ACE_64BIT_PTR
146 +       tmp_ptr = (u64) ap->info_dma;
147         writel(tmp_ptr >> 32, &regs->InfoPtrHi);
148 -#else
149 -       writel(0, &regs->InfoPtrHi);
150 -#endif
151         writel(tmp_ptr & 0xffffffff, &regs->InfoPtrLo);
152  
153         memset(ap->evt_ring, 0, EVT_RING_ENTRIES * sizeof(struct event));
154 @@ -1796,9 +1798,12 @@
155                  * Make sure IP header starts on a fresh cache line.
156                  */
157                 skb_reserve(skb, 2 + 16);
158 -               mapping = pci_map_single(ap->pdev, skb->data,
159 -                                        ACE_STD_BUFSIZE - (2 + 16),
160 -                                        PCI_DMA_FROMDEVICE);
161 +               mapping = pci_map_page(ap->pdev,
162 +                                      virt_to_page(skb->data),
163 +                                      ((unsigned long) skb->data &
164 +                                       ~PAGE_MASK),
165 +                                      ACE_STD_BUFSIZE - (2 + 16),
166 +                                      PCI_DMA_FROMDEVICE);
167                 ap->skb->rx_std_skbuff[idx].skb = skb;
168                 ap->skb->rx_std_skbuff[idx].mapping = mapping;
169  
170 @@ -1860,9 +1865,12 @@
171                  * Make sure the IP header ends up on a fresh cache line
172                  */
173                 skb_reserve(skb, 2 + 16);
174 -               mapping = pci_map_single(ap->pdev, skb->data,
175 -                                        ACE_MINI_BUFSIZE - (2 + 16),
176 -                                        PCI_DMA_FROMDEVICE);
177 +               mapping = pci_map_page(ap->pdev,
178 +                                      virt_to_page(skb->data),
179 +                                      ((unsigned long) skb->data &
180 +                                       ~PAGE_MASK),
181 +                                      ACE_MINI_BUFSIZE - (2 + 16),
182 +                                      PCI_DMA_FROMDEVICE);
183                 ap->skb->rx_mini_skbuff[idx].skb = skb;
184                 ap->skb->rx_mini_skbuff[idx].mapping = mapping;
185  
186 @@ -1919,9 +1927,12 @@
187                  * Make sure the IP header ends up on a fresh cache line
188                  */
189                 skb_reserve(skb, 2 + 16);
190 -               mapping = pci_map_single(ap->pdev, skb->data,
191 -                                        ACE_JUMBO_BUFSIZE - (2 + 16),
192 -                                        PCI_DMA_FROMDEVICE);
193 +               mapping = pci_map_page(ap->pdev,
194 +                                      virt_to_page(skb->data),
195 +                                      ((unsigned long) skb->data &
196 +                                       ~PAGE_MASK),
197 +                                      ACE_JUMBO_BUFSIZE - (2 + 16),
198 +                                      PCI_DMA_FROMDEVICE);
199                 ap->skb->rx_jumbo_skbuff[idx].skb = skb;
200                 ap->skb->rx_jumbo_skbuff[idx].mapping = mapping;
201  
202 @@ -2129,8 +2140,8 @@
203  
204                 skb = rip->skb;
205                 rip->skb = NULL;
206 -               pci_unmap_single(ap->pdev, rip->mapping, mapsize,
207 -                                PCI_DMA_FROMDEVICE);
208 +               pci_unmap_page(ap->pdev, rip->mapping, mapsize,
209 +                              PCI_DMA_FROMDEVICE);
210                 skb_put(skb, retdesc->size);
211  
212                 /*
213 @@ -2198,8 +2209,8 @@
214                 mapping = info->mapping;
215  
216                 if (mapping) {
217 -                       pci_unmap_single(ap->pdev, mapping, info->maplen,
218 -                                        PCI_DMA_TODEVICE);
219 +                       pci_unmap_page(ap->pdev, mapping, info->maplen,
220 +                                      PCI_DMA_TODEVICE);
221                         info->mapping = 0;
222                 }
223  
224 @@ -2488,11 +2499,10 @@
225  
226                 if (mapping) {
227                         memset(ap->tx_ring+i, 0, sizeof(struct tx_desc));
228 -                       pci_unmap_single(ap->pdev, mapping, info->maplen,
229 -                                        PCI_DMA_TODEVICE);
230 +                       pci_unmap_page(ap->pdev, mapping, info->maplen,
231 +                                      PCI_DMA_TODEVICE);
232                         info->mapping = 0;
233                 }
234 -
235                 if (skb) {
236                         dev_kfree_skb(skb);
237                         info->skb = NULL;
238 @@ -2512,75 +2522,35 @@
239         return 0;
240  }
241  
242 -
243 -/*
244 - * Following below should be (in more clean form!) in arch/ARCH/kernel/pci_*.
245 - * For now, let it stay here.
246 - */
247 -#if defined(CONFIG_HIGHMEM) && MAX_SKB_FRAGS
248 -
249 -#if defined(CONFIG_X86)
250 -#define DMAADDR_OFFSET 0
251 -typedef unsigned long long dmaaddr_high_t;
252 -#elif defined(CONFIG_PPC)
253 -#define DMAADDR_OFFSET PCI_DRAM_OFFSET
254 -typedef unsigned long dmaaddr_high_t;
255 -#endif
256 -
257 -
258 -static inline dmaaddr_high_t
259 -pci_map_single_high(struct pci_dev *hwdev, struct page *page,
260 -                   int offset, size_t size, int dir)
261 -{
262 -       dmaaddr_high_t phys;
263 -
264 -       phys = (page-mem_map) * (dmaaddr_high_t) PAGE_SIZE + offset;
265 -
266 -       return (phys + DMAADDR_OFFSET);
267 -}
268 -
269 -#else
270 -
271 -typedef unsigned long dmaaddr_high_t;
272 -
273 -static inline dmaaddr_high_t
274 -pci_map_single_high(struct pci_dev *hwdev, struct page *page,
275 -                   int offset, size_t size, int dir)
276 -{
277 -       return pci_map_single(hwdev, page_address(page) + offset, size, dir);
278 -}
279 -
280 -#endif
281 -
282 -
283 -static inline dmaaddr_high_t
284 +static inline dma_addr_t
285  ace_map_tx_skb(struct ace_private *ap, struct sk_buff *skb,
286                struct sk_buff *tail, u32 idx)
287  {
288         unsigned long addr;
289         struct tx_ring_info *info;
290  
291 -       addr = pci_map_single(ap->pdev, skb->data, skb->len, PCI_DMA_TODEVICE);
292 +       addr = pci_map_page(ap->pdev,
293 +                           virt_to_page(skb->data),
294 +                           ((unsigned long) skb->data &
295 +                            ~PAGE_MASK),
296 +                           skb->len, PCI_DMA_TODEVICE);
297  
298         info = ap->skb->tx_skbuff + idx;
299         info->skb = tail;
300         info->mapping = addr;
301         info->maplen = skb->len;
302 -
303         return addr;
304  }
305  
306  
307  static inline void
308 -ace_load_tx_bd(struct tx_desc *desc, dmaaddr_high_t addr, u32 flagsize)
309 +ace_load_tx_bd(struct tx_desc *desc, u64 addr, u32 flagsize)
310  {
311  #if !USE_TX_COAL_NOW
312         flagsize &= ~BD_FLG_COAL_NOW;
313  #endif
314  
315 -#ifdef ACE_64BIT_PTR
316         desc->addr.addrhi = addr >> 32;
317 -#endif
318         desc->addr.addrlo = addr;
319         desc->flagsize = flagsize;
320  }
321 @@ -2642,16 +2612,16 @@
322                 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
323                         skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
324                         struct tx_ring_info *info;
325 -                       dmaaddr_high_t phys;
326 +                       dma_addr_t phys;
327  
328                         len += frag->size;
329                         info = ap->skb->tx_skbuff + idx;
330                         desc = ap->tx_ring + idx;
331  
332 -                       phys = pci_map_single_high(ap->pdev, frag->page,
333 -                                                  frag->page_offset,
334 -                                                  frag->size,
335 -                                                  PCI_DMA_TODEVICE);
336 +                       phys = pci_map_page(ap->pdev, frag->page,
337 +                                           frag->page_offset,
338 +                                           frag->size,
339 +                                           PCI_DMA_TODEVICE);
340  
341                         flagsize = (frag->size << 16);
342                         if (skb->ip_summed == CHECKSUM_HW)
343 @@ -2673,7 +2643,6 @@
344                         }
345                         info->mapping = phys;
346                         info->maplen = frag->size;
347 -
348                         ace_load_tx_bd(desc, phys, flagsize);
349                 }
350         }
351 @@ -2995,7 +2964,7 @@
352  
353         while (size > 0) {
354                 tsize = min_t(u32, ((~dest & (ACE_WINDOW_SIZE - 1)) + 1),
355 -                               min_t(u32, size, ACE_WINDOW_SIZE));
356 +                           min_t(u32, size, ACE_WINDOW_SIZE));
357                 tdest = (unsigned long)&regs->Window +
358                         (dest & (ACE_WINDOW_SIZE - 1));
359                 writel(dest & ~(ACE_WINDOW_SIZE - 1), &regs->WinBase);
360 @@ -3026,7 +2995,7 @@
361  
362         while (size > 0) {
363                 tsize = min_t(u32, ((~dest & (ACE_WINDOW_SIZE - 1)) + 1),
364 -                           min_t(u32, size, ACE_WINDOW_SIZE));
365 +                               min_t(u32, size, ACE_WINDOW_SIZE));
366                 tdest = (unsigned long)&regs->Window +
367                         (dest & (ACE_WINDOW_SIZE - 1));
368                 writel(dest & ~(ACE_WINDOW_SIZE - 1), &regs->WinBase);
369 diff -u --recursive --new-file v2.4.12/linux/drivers/net/acenic.h linux/drivers/net/acenic.h
370 --- v2.4.12/linux/drivers/net/acenic.h  Thu Oct 11 08:02:26 2001
371 +++ linux/drivers/net/acenic.h  Fri Oct 12 15:35:53 2001
372 @@ -582,7 +582,6 @@
373         aceaddr stats2_ptr;
374  };
375  
376 -
377  struct ring_info {
378         struct sk_buff          *skb;
379         dma_addr_t              mapping;
380 @@ -684,6 +683,7 @@
381         u32                     last_tx, last_std_rx, last_mini_rx;
382  #endif
383         struct net_device_stats stats;
384 +       int                     pci_using_dac;
385  };
386  
387  
388 @@ -705,31 +705,11 @@
389  
390  static inline void set_aceaddr(aceaddr *aa, dma_addr_t addr)
391  {
392 -       unsigned long baddr = (unsigned long) addr;
393 -#ifdef ACE_64BIT_PTR
394 +       u64 baddr = (u64) addr;
395         aa->addrlo = baddr & 0xffffffff;
396         aa->addrhi = baddr >> 32;
397 -#else
398 -       /* Don't bother setting zero every time */
399 -       aa->addrlo = baddr;
400 -#endif
401         mb();
402  }
403 -
404 -
405 -#if 0
406 -static inline void *get_aceaddr(aceaddr *aa)
407 -{
408 -       unsigned long addr;
409 -       mb();
410 -#ifdef ACE_64BIT_PTR
411 -       addr = (u64)aa->addrhi << 32 | aa->addrlo;
412 -#else
413 -       addr = aa->addrlo;
414 -#endif
415 -       return (void *)addr;
416 -}
417 -#endif
418  
419  
420  static inline void ace_set_txprd(struct ace_regs *regs,
This page took 0.051093 seconds and 3 git commands to generate.