| 1 | /******************************************************************************/ |
| 2 | /* */ |
| 3 | /* Broadcom BCM5700 Linux Network Driver, Copyright (c) 2000 - 2004 Broadcom */ |
| 4 | /* Corporation. */ |
| 5 | /* All rights reserved. */ |
| 6 | /* */ |
| 7 | /* This program is free software; you can redistribute it and/or modify */ |
| 8 | /* it under the terms of the GNU General Public License as published by */ |
| 9 | /* the Free Software Foundation, located in the file LICENSE. */ |
| 10 | /* */ |
| 11 | /******************************************************************************/ |
| 12 | |
| 13 | |
| 14 | #ifndef MM_H |
| 15 | #define MM_H |
| 16 | |
| 17 | #include <linux/config.h> |
| 18 | |
| 19 | #if defined(CONFIG_SMP) && !defined(__SMP__) |
| 20 | #define __SMP__ |
| 21 | #endif |
| 22 | |
| 23 | #if defined(CONFIG_MODVERSIONS) && defined(MODULE) && !defined(MODVERSIONS) |
| 24 | #ifndef BCM_SMALL_DRV |
| 25 | #define MODVERSIONS |
| 26 | #endif |
| 27 | #endif |
| 28 | |
| 29 | #ifndef B57UM |
| 30 | #define __NO_VERSION__ |
| 31 | #endif |
| 32 | #include <linux/version.h> |
| 33 | |
| 34 | #ifdef MODULE |
| 35 | |
| 36 | #if defined(MODVERSIONS) && (LINUX_VERSION_CODE < 0x020500) |
| 37 | #ifndef BCM_SMALL_DRV |
| 38 | #include <linux/modversions.h> |
| 39 | #endif |
| 40 | #endif |
| 41 | |
| 42 | #if (LINUX_VERSION_CODE < 0x020605) |
| 43 | #include <linux/module.h> |
| 44 | #else |
| 45 | #include <linux/moduleparam.h> |
| 46 | #endif |
| 47 | |
| 48 | #else |
| 49 | |
| 50 | #define MOD_INC_USE_COUNT |
| 51 | #define MOD_DEC_USE_COUNT |
| 52 | #define SET_MODULE_OWNER(dev) |
| 53 | #define MODULE_DEVICE_TABLE(pci, pci_tbl) |
| 54 | #endif |
| 55 | |
| 56 | |
| 57 | #include <linux/kernel.h> |
| 58 | #include <linux/sched.h> |
| 59 | #include <linux/string.h> |
| 60 | #include <linux/timer.h> |
| 61 | #include <linux/errno.h> |
| 62 | #include <linux/ioport.h> |
| 63 | #include <linux/slab.h> |
| 64 | #include <linux/interrupt.h> |
| 65 | #include <linux/pci.h> |
| 66 | #include <linux/init.h> |
| 67 | #include <linux/netdevice.h> |
| 68 | #include <linux/etherdevice.h> |
| 69 | #include <linux/skbuff.h> |
| 70 | #include <linux/reboot.h> |
| 71 | #include <asm/processor.h> /* Processor type for cache alignment. */ |
| 72 | #include <asm/bitops.h> |
| 73 | #include <asm/io.h> |
| 74 | #include <asm/unaligned.h> |
| 75 | #include <linux/delay.h> |
| 76 | #include <asm/byteorder.h> |
| 77 | #include <linux/time.h> |
| 78 | #include <asm/uaccess.h> |
| 79 | #if (LINUX_VERSION_CODE >= 0x020400) |
| 80 | #if (LINUX_VERSION_CODE < 0x020500) |
| 81 | #include <linux/wrapper.h> |
| 82 | #endif |
| 83 | #include <linux/ethtool.h> |
| 84 | #endif |
| 85 | #ifdef CONFIG_PROC_FS |
| 86 | #include <linux/smp_lock.h> |
| 87 | #include <linux/proc_fs.h> |
| 88 | #define BCM_PROC_FS 1 |
| 89 | #endif |
| 90 | #ifdef NETIF_F_HW_VLAN_TX |
| 91 | #include <linux/if_vlan.h> |
| 92 | #define BCM_VLAN 1 |
| 93 | #endif |
| 94 | #ifdef NETIF_F_TSO |
| 95 | #define BCM_TSO 1 |
| 96 | #define INCLUDE_TCP_SEG_SUPPORT 1 |
| 97 | #include <net/ip.h> |
| 98 | #include <net/tcp.h> |
| 99 | #include <net/checksum.h> |
| 100 | #endif |
| 101 | |
| 102 | #ifndef LINUX_KERNEL_VERSION |
| 103 | #define LINUX_KERNEL_VERSION 0 |
| 104 | #endif |
| 105 | |
| 106 | #ifndef MAX_SKB_FRAGS |
| 107 | #define MAX_SKB_FRAGS 0 |
| 108 | #endif |
| 109 | |
| 110 | #if (LINUX_VERSION_CODE >= 0x020400) |
| 111 | #ifndef ETHTOOL_GEEPROM |
| 112 | |
| 113 | #define ETHTOOL_GEEPROM 0x0000000b /* Get EEPROM data */ |
| 114 | #define ETHTOOL_SEEPROM 0x0000000c /* Set EEPROM data */ |
| 115 | |
| 116 | /* for passing EEPROM chunks */ |
| 117 | struct ethtool_eeprom { |
| 118 | u32 cmd; |
| 119 | u32 magic; |
| 120 | u32 offset; /* in bytes */ |
| 121 | u32 len; /* in bytes */ |
| 122 | u8 data[0]; |
| 123 | }; |
| 124 | #define BCM_EEDUMP_LEN(info_p, size) *((u32 *) &((info_p)->reserved1[24]))=size |
| 125 | |
| 126 | #else |
| 127 | |
| 128 | #define BCM_EEDUMP_LEN(info_p, size) (info_p)->eedump_len=size |
| 129 | |
| 130 | #endif |
| 131 | #endif |
| 132 | |
| 133 | #define BCM_INT_COAL 1 |
| 134 | #define BCM_NIC_SEND_BD 1 |
| 135 | #define BCM_ASF 1 |
| 136 | #define BCM_WOL 1 |
| 137 | #define BCM_TASKLET 1 |
| 138 | |
| 139 | #if HAVE_NETIF_RECEIVE_SKB |
| 140 | #define BCM_NAPI_RXPOLL 1 |
| 141 | #undef BCM_TASKLET |
| 142 | #endif |
| 143 | |
| 144 | #if defined(CONFIG_PPC64) |
| 145 | #define BCM_DISCONNECT_AT_CACHELINE 1 |
| 146 | #endif |
| 147 | |
| 148 | #ifdef BCM_SMALL_DRV |
| 149 | #undef BCM_PROC_FS |
| 150 | #undef ETHTOOL_GEEPROM |
| 151 | #undef ETHTOOL_SEEPROM |
| 152 | #undef ETHTOOL_GREGS |
| 153 | #undef ETHTOOL_GPAUSEPARAM |
| 154 | #undef ETHTOOL_GRXCSUM |
| 155 | #undef ETHTOOL_TEST |
| 156 | #undef BCM_INT_COAL |
| 157 | #undef BCM_NIC_SEND_BD |
| 158 | #undef BCM_WOL |
| 159 | #undef BCM_TASKLET |
| 160 | #undef BCM_TSO |
| 161 | #endif |
| 162 | |
| 163 | #ifdef __BIG_ENDIAN |
| 164 | #define BIG_ENDIAN_HOST 1 |
| 165 | #endif |
| 166 | |
| 167 | #define MM_SWAP_LE32(x) cpu_to_le32(x) |
| 168 | #define MM_SWAP_BE32(x) cpu_to_be32(x) |
| 169 | |
| 170 | #if (LINUX_VERSION_CODE < 0x020327) |
| 171 | #define __raw_readl readl |
| 172 | #define __raw_writel writel |
| 173 | #endif |
| 174 | |
| 175 | #define MM_MEMWRITEL(ptr, val) __raw_writel(val, ptr) |
| 176 | #define MM_MEMREADL(ptr) __raw_readl(ptr) |
| 177 | |
| 178 | typedef atomic_t MM_ATOMIC_T; |
| 179 | |
| 180 | #define MM_ATOMIC_SET(ptr, val) atomic_set(ptr, val) |
| 181 | #define MM_ATOMIC_READ(ptr) atomic_read(ptr) |
| 182 | #define MM_ATOMIC_INC(ptr) atomic_inc(ptr) |
| 183 | #define MM_ATOMIC_ADD(ptr, val) atomic_add(val, ptr) |
| 184 | #define MM_ATOMIC_DEC(ptr) atomic_dec(ptr) |
| 185 | #define MM_ATOMIC_SUB(ptr, val) atomic_sub(val, ptr) |
| 186 | |
| 187 | |
| 188 | #ifndef mmiowb |
| 189 | #define mmiowb() |
| 190 | #endif |
| 191 | |
| 192 | |
| 193 | #define MM_MB() mb() |
| 194 | #define MM_WMB() wmb() |
| 195 | #define MM_RMB() rmb() |
| 196 | #define MM_MMIOWB() mmiowb() |
| 197 | |
| 198 | #include "lm.h" |
| 199 | #include "queue.h" |
| 200 | #include "tigon3.h" |
| 201 | |
| 202 | #if DBG |
| 203 | #define STATIC |
| 204 | #else |
| 205 | #define STATIC static |
| 206 | #endif |
| 207 | |
| 208 | extern int MM_Packet_Desc_Size; |
| 209 | |
| 210 | #define MM_PACKET_DESC_SIZE MM_Packet_Desc_Size |
| 211 | |
| 212 | DECLARE_QUEUE_TYPE(UM_RX_PACKET_Q, MAX_RX_PACKET_DESC_COUNT+1); |
| 213 | |
| 214 | #define MAX_MEM 16 |
| 215 | #define MAX_MEM2 4 |
| 216 | |
| 217 | #if (LINUX_VERSION_CODE < 0x020211) |
| 218 | typedef u32 dma_addr_t; |
| 219 | #endif |
| 220 | |
| 221 | #if (LINUX_VERSION_CODE < 0x02032a) |
| 222 | #define pci_map_single(dev, address, size, dir) virt_to_bus(address) |
| 223 | #define pci_unmap_single(dev, dma_addr, size, dir) |
| 224 | #endif |
| 225 | |
| 226 | #if MAX_SKB_FRAGS |
| 227 | #if (LINUX_VERSION_CODE >= 0x02040d) |
| 228 | |
| 229 | typedef dma_addr_t dmaaddr_high_t; |
| 230 | |
| 231 | #else |
| 232 | |
| 233 | #if defined(CONFIG_HIGHMEM) && defined(CONFIG_X86) && !defined(CONFIG_X86_64) |
| 234 | |
| 235 | #if defined(CONFIG_HIGHMEM64G) |
| 236 | typedef unsigned long long dmaaddr_high_t; |
| 237 | #else |
| 238 | typedef dma_addr_t dmaaddr_high_t; |
| 239 | #endif |
| 240 | |
| 241 | #ifndef pci_map_page |
| 242 | #define pci_map_page bcm_pci_map_page |
| 243 | #endif |
| 244 | |
| 245 | static inline dmaaddr_high_t |
| 246 | bcm_pci_map_page(struct pci_dev *dev, struct page *page, |
| 247 | int offset, size_t size, int dir) |
| 248 | { |
| 249 | dmaaddr_high_t phys; |
| 250 | |
| 251 | phys = (page-mem_map) * (dmaaddr_high_t) PAGE_SIZE + offset; |
| 252 | |
| 253 | return phys; |
| 254 | } |
| 255 | |
| 256 | #ifndef pci_unmap_page |
| 257 | #define pci_unmap_page(dev, map, size, dir) |
| 258 | #endif |
| 259 | |
| 260 | #else /* #if defined(CONFIG_HIGHMEM) && defined(CONFIG_X86) && ! defined(CONFIG_X86_64)*/ |
| 261 | |
| 262 | typedef dma_addr_t dmaaddr_high_t; |
| 263 | |
| 264 | /* Warning - This may not work for all architectures if HIGHMEM is defined */ |
| 265 | |
| 266 | #ifndef pci_map_page |
| 267 | #define pci_map_page(dev, page, offset, size, dir) \ |
| 268 | pci_map_single(dev, page_address(page) + (offset), size, dir) |
| 269 | #endif |
| 270 | #ifndef pci_unmap_page |
| 271 | #define pci_unmap_page(dev, map, size, dir) \ |
| 272 | pci_unmap_single(dev, map, size, dir) |
| 273 | #endif |
| 274 | |
| 275 | #endif /* #if defined(CONFIG_HIGHMEM) && defined(CONFIG_X86) && ! defined(CONFIG_X86_64)*/ |
| 276 | |
| 277 | #endif /* #if (LINUX_VERSION_CODE >= 0x02040d)*/ |
| 278 | #endif /* #if MAX_SKB_FRAGS*/ |
| 279 | |
| 280 | #if defined(CONFIG_X86) && !defined(CONFIG_X86_64) |
| 281 | #define NO_PCI_UNMAP 1 |
| 282 | #endif |
| 283 | |
| 284 | #if (LINUX_VERSION_CODE < 0x020412) |
| 285 | #if !defined(NO_PCI_UNMAP) |
| 286 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) dma_addr_t ADDR_NAME; |
| 287 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) __u32 LEN_NAME; |
| 288 | |
| 289 | #define pci_unmap_addr(PTR, ADDR_NAME) \ |
| 290 | ((PTR)->ADDR_NAME) |
| 291 | |
| 292 | #define pci_unmap_len(PTR, LEN_NAME) \ |
| 293 | ((PTR)->LEN_NAME) |
| 294 | |
| 295 | #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) \ |
| 296 | (((PTR)->ADDR_NAME) = (VAL)) |
| 297 | |
| 298 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ |
| 299 | (((PTR)->LEN_NAME) = (VAL)) |
| 300 | #else |
| 301 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) |
| 302 | #define DECLARE_PCI_UNMAP_LEN(ADDR_NAME) |
| 303 | |
| 304 | #define pci_unmap_addr(PTR, ADDR_NAME) 0 |
| 305 | #define pci_unmap_len(PTR, LEN_NAME) 0 |
| 306 | #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0) |
| 307 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0) |
| 308 | #endif |
| 309 | #endif |
| 310 | |
| 311 | #if (LINUX_VERSION_CODE < 0x02030e) |
| 312 | #define net_device device |
| 313 | #define netif_carrier_on(dev) |
| 314 | #define netif_carrier_off(dev) |
| 315 | #endif |
| 316 | |
| 317 | #if (LINUX_VERSION_CODE < 0x02032b) |
| 318 | #define tasklet_struct tq_struct |
| 319 | #endif |
| 320 | |
| 321 | typedef struct _UM_DEVICE_BLOCK { |
| 322 | LM_DEVICE_BLOCK lm_dev; |
| 323 | struct net_device *dev; |
| 324 | struct pci_dev *pdev; |
| 325 | struct net_device *next_module; |
| 326 | char *name; |
| 327 | #ifdef BCM_PROC_FS |
| 328 | struct proc_dir_entry *pfs_entry; |
| 329 | char pfs_name[32]; |
| 330 | #endif |
| 331 | void *mem_list[MAX_MEM]; |
| 332 | dma_addr_t dma_list[MAX_MEM]; |
| 333 | int mem_size_list[MAX_MEM]; |
| 334 | int mem_list_num; |
| 335 | |
| 336 | int index; |
| 337 | int opened; |
| 338 | int suspended; |
| 339 | int using_dac; /* dual address cycle */ |
| 340 | int delayed_link_ind; /* Delay link status during initial load */ |
| 341 | int adapter_just_inited; /* the first few seconds after init. */ |
| 342 | int timer_interval; |
| 343 | int statstimer_interval; |
| 344 | int adaptive_expiry; |
| 345 | int crc_counter_expiry; |
| 346 | int poll_tbi_interval; |
| 347 | int poll_tbi_expiry; |
| 348 | int asf_heartbeat; |
| 349 | int tx_full; |
| 350 | int tx_queued; |
| 351 | int line_speed; /* in Mbps, 0 if link is down */ |
| 352 | UM_RX_PACKET_Q rx_out_of_buf_q; |
| 353 | int rx_out_of_buf; |
| 354 | int rx_buf_repl_thresh; |
| 355 | int rx_buf_repl_panic_thresh; |
| 356 | int rx_buf_repl_isr_limit; |
| 357 | int rx_buf_align; |
| 358 | struct timer_list timer; |
| 359 | struct timer_list statstimer; |
| 360 | int do_global_lock; |
| 361 | spinlock_t global_lock; |
| 362 | spinlock_t undi_lock; |
| 363 | spinlock_t phy_lock; |
| 364 | unsigned long undi_flags; |
| 365 | volatile unsigned long interrupt; |
| 366 | atomic_t intr_sem; |
| 367 | int tasklet_pending; |
| 368 | volatile unsigned long tasklet_busy; |
| 369 | struct tasklet_struct tasklet; |
| 370 | struct net_device_stats stats; |
| 371 | int intr_test; |
| 372 | int intr_test_result; |
| 373 | #ifdef NETIF_F_HW_VLAN_TX |
| 374 | struct vlan_group *vlgrp; |
| 375 | #endif |
| 376 | int vlan_tag_mode; /* Setting to allow ASF to work properly with */ |
| 377 | /* VLANs */ |
| 378 | #define VLAN_TAG_MODE_AUTO_STRIP 0 |
| 379 | #define VLAN_TAG_MODE_NORMAL_STRIP 1 |
| 380 | #define VLAN_TAG_MODE_FORCED_STRIP 2 |
| 381 | |
| 382 | /* Auto mode - VLAN TAGs are always stripped if ASF is enabled, */ |
| 383 | /* If ASF is not enabled, it will be in normal mode. */ |
| 384 | /* Normal mode - VLAN TAGs are stripped when VLANs are registered */ |
| 385 | /* Forced mode - VLAN TAGs are always stripped. */ |
| 386 | |
| 387 | int adaptive_coalesce; |
| 388 | uint rx_last_cnt; |
| 389 | uint tx_last_cnt; |
| 390 | uint rx_curr_coalesce_frames; |
| 391 | uint rx_curr_coalesce_frames_intr; |
| 392 | uint rx_curr_coalesce_ticks; |
| 393 | uint tx_curr_coalesce_frames; |
| 394 | #if TIGON3_DEBUG |
| 395 | unsigned long tx_zc_count; |
| 396 | unsigned long tx_chksum_count; |
| 397 | unsigned long tx_himem_count; |
| 398 | unsigned long rx_good_chksum_count; |
| 399 | #endif |
| 400 | unsigned long rx_bad_chksum_count; |
| 401 | #ifdef BCM_TSO |
| 402 | unsigned long tso_pkt_count; |
| 403 | #endif |
| 404 | unsigned long rx_misc_errors; |
| 405 | uint64_t phy_crc_count; |
| 406 | unsigned int spurious_int; |
| 407 | |
| 408 | void *sbh; |
| 409 | unsigned long boardflags; |
| 410 | void *robo; |
| 411 | int qos; |
| 412 | } UM_DEVICE_BLOCK, *PUM_DEVICE_BLOCK; |
| 413 | |
| 414 | typedef struct _UM_PACKET { |
| 415 | LM_PACKET lm_packet; |
| 416 | struct sk_buff *skbuff; |
| 417 | #if MAX_SKB_FRAGS |
| 418 | DECLARE_PCI_UNMAP_ADDR(map[MAX_SKB_FRAGS + 1]) |
| 419 | DECLARE_PCI_UNMAP_LEN(map_len[MAX_SKB_FRAGS + 1]) |
| 420 | #else |
| 421 | DECLARE_PCI_UNMAP_ADDR(map[1]) |
| 422 | DECLARE_PCI_UNMAP_LEN(map_len[1]) |
| 423 | #endif |
| 424 | } UM_PACKET, *PUM_PACKET; |
| 425 | |
| 426 | static inline void MM_SetAddr(LM_PHYSICAL_ADDRESS *paddr, dma_addr_t addr) |
| 427 | { |
| 428 | #if BITS_PER_LONG == 64 |
| 429 | paddr->High = ((unsigned long) addr) >> 32; |
| 430 | paddr->Low = ((unsigned long) addr) & 0xffffffff; |
| 431 | #else |
| 432 | paddr->High = 0; |
| 433 | paddr->Low = (unsigned long) addr; |
| 434 | #endif |
| 435 | } |
| 436 | |
| 437 | static inline void MM_SetT3Addr(T3_64BIT_HOST_ADDR *paddr, dma_addr_t addr) |
| 438 | { |
| 439 | #if BITS_PER_LONG == 64 |
| 440 | paddr->High = ((unsigned long) addr) >> 32; |
| 441 | paddr->Low = ((unsigned long) addr) & 0xffffffff; |
| 442 | #else |
| 443 | paddr->High = 0; |
| 444 | paddr->Low = (unsigned long) addr; |
| 445 | #endif |
| 446 | } |
| 447 | |
| 448 | #if MAX_SKB_FRAGS |
| 449 | static inline void MM_SetT3AddrHigh(T3_64BIT_HOST_ADDR *paddr, |
| 450 | dmaaddr_high_t addr) |
| 451 | { |
| 452 | #if defined(CONFIG_HIGHMEM64G) && defined(CONFIG_X86) && !defined(CONFIG_X86_64) |
| 453 | paddr->High = (unsigned long) (addr >> 32); |
| 454 | paddr->Low = (unsigned long) (addr & 0xffffffff); |
| 455 | #else |
| 456 | MM_SetT3Addr(paddr, (dma_addr_t) addr); |
| 457 | #endif |
| 458 | } |
| 459 | #endif |
| 460 | |
| 461 | static inline void MM_MapRxDma(PLM_DEVICE_BLOCK pDevice, |
| 462 | struct _LM_PACKET *pPacket, |
| 463 | T3_64BIT_HOST_ADDR *paddr) |
| 464 | { |
| 465 | dma_addr_t map; |
| 466 | struct sk_buff *skb = ((struct _UM_PACKET *) pPacket)->skbuff; |
| 467 | |
| 468 | map = pci_map_single(((struct _UM_DEVICE_BLOCK *)pDevice)->pdev, |
| 469 | skb->tail, |
| 470 | pPacket->u.Rx.RxBufferSize, |
| 471 | PCI_DMA_FROMDEVICE); |
| 472 | pci_unmap_addr_set(((struct _UM_PACKET *) pPacket), map[0], map); |
| 473 | MM_SetT3Addr(paddr, map); |
| 474 | } |
| 475 | |
| 476 | static inline void MM_MapTxDma(PLM_DEVICE_BLOCK pDevice, |
| 477 | struct _LM_PACKET *pPacket, |
| 478 | T3_64BIT_HOST_ADDR *paddr, |
| 479 | LM_UINT32 *len, |
| 480 | int frag) |
| 481 | { |
| 482 | dma_addr_t map; |
| 483 | struct sk_buff *skb = ((struct _UM_PACKET *) pPacket)->skbuff; |
| 484 | unsigned int length; |
| 485 | |
| 486 | if (frag == 0) { |
| 487 | #if MAX_SKB_FRAGS |
| 488 | if (skb_shinfo(skb)->nr_frags) |
| 489 | length = skb->len - skb->data_len; |
| 490 | else |
| 491 | #endif |
| 492 | length = skb->len; |
| 493 | map = pci_map_single(((struct _UM_DEVICE_BLOCK *)pDevice)->pdev, |
| 494 | skb->data, length, PCI_DMA_TODEVICE); |
| 495 | MM_SetT3Addr(paddr, map); |
| 496 | pci_unmap_addr_set(((struct _UM_PACKET *)pPacket), map[0], map); |
| 497 | pci_unmap_len_set(((struct _UM_PACKET *) pPacket), map_len[0], |
| 498 | length); |
| 499 | *len = length; |
| 500 | } |
| 501 | #if MAX_SKB_FRAGS |
| 502 | else { |
| 503 | skb_frag_t *sk_frag; |
| 504 | dmaaddr_high_t hi_map; |
| 505 | |
| 506 | sk_frag = &skb_shinfo(skb)->frags[frag - 1]; |
| 507 | |
| 508 | hi_map = pci_map_page( |
| 509 | ((struct _UM_DEVICE_BLOCK *)pDevice)->pdev, |
| 510 | sk_frag->page, |
| 511 | sk_frag->page_offset, |
| 512 | sk_frag->size, PCI_DMA_TODEVICE); |
| 513 | |
| 514 | MM_SetT3AddrHigh(paddr, hi_map); |
| 515 | pci_unmap_addr_set(((struct _UM_PACKET *) pPacket), map[frag], |
| 516 | hi_map); |
| 517 | pci_unmap_len_set(((struct _UM_PACKET *) pPacket), |
| 518 | map_len[frag], sk_frag->size); |
| 519 | *len = sk_frag->size; |
| 520 | } |
| 521 | #endif |
| 522 | } |
| 523 | |
| 524 | #define BCM5700_PHY_LOCK(pUmDevice, flags) { \ |
| 525 | spinlock_t *lock; \ |
| 526 | if ((pUmDevice)->do_global_lock) { \ |
| 527 | lock = &(pUmDevice)->global_lock; \ |
| 528 | } \ |
| 529 | else { \ |
| 530 | lock = &(pUmDevice)->phy_lock; \ |
| 531 | } \ |
| 532 | spin_lock_irqsave(lock, flags); \ |
| 533 | } |
| 534 | |
| 535 | #define BCM5700_PHY_UNLOCK(pUmDevice, flags) { \ |
| 536 | spinlock_t *lock; \ |
| 537 | if ((pUmDevice)->do_global_lock) { \ |
| 538 | lock = &(pUmDevice)->global_lock; \ |
| 539 | } \ |
| 540 | else { \ |
| 541 | lock = &(pUmDevice)->phy_lock; \ |
| 542 | } \ |
| 543 | spin_unlock_irqrestore(lock, flags); \ |
| 544 | } |
| 545 | |
| 546 | |
| 547 | #define MM_ACQUIRE_UNDI_LOCK(_pDevice) \ |
| 548 | if (!(((PUM_DEVICE_BLOCK)(_pDevice))->do_global_lock)) { \ |
| 549 | unsigned long flags; \ |
| 550 | spin_lock_irqsave(&((PUM_DEVICE_BLOCK)(_pDevice))->undi_lock, flags); \ |
| 551 | ((PUM_DEVICE_BLOCK)(_pDevice))->undi_flags = flags; \ |
| 552 | } |
| 553 | |
| 554 | #define MM_RELEASE_UNDI_LOCK(_pDevice) \ |
| 555 | if (!(((PUM_DEVICE_BLOCK)(_pDevice))->do_global_lock)) { \ |
| 556 | unsigned long flags = ((PUM_DEVICE_BLOCK) (_pDevice))->undi_flags; \ |
| 557 | spin_unlock_irqrestore(&((PUM_DEVICE_BLOCK)(_pDevice))->undi_lock, flags); \ |
| 558 | } |
| 559 | |
| 560 | #define MM_ACQUIRE_PHY_LOCK_IN_IRQ(_pDevice) \ |
| 561 | if (!(((PUM_DEVICE_BLOCK)(_pDevice))->do_global_lock)) { \ |
| 562 | spin_lock(&((PUM_DEVICE_BLOCK)(_pDevice))->phy_lock); \ |
| 563 | } |
| 564 | |
| 565 | #define MM_RELEASE_PHY_LOCK_IN_IRQ(_pDevice) \ |
| 566 | if (!(((PUM_DEVICE_BLOCK)(_pDevice))->do_global_lock)) { \ |
| 567 | spin_unlock(&((PUM_DEVICE_BLOCK)(_pDevice))->phy_lock); \ |
| 568 | } |
| 569 | |
| 570 | #define MM_UINT_PTR(_ptr) ((unsigned long) (_ptr)) |
| 571 | |
| 572 | #define MM_GETSTATS64(_Ctr) \ |
| 573 | (uint64_t) (_Ctr).Low + ((uint64_t) (_Ctr).High << 32) |
| 574 | |
| 575 | #define MM_GETSTATS32(_Ctr) \ |
| 576 | (uint32_t) (_Ctr).Low |
| 577 | |
| 578 | #if BITS_PER_LONG == 64 |
| 579 | #define MM_GETSTATS(_Ctr) (unsigned long) MM_GETSTATS64(_Ctr) |
| 580 | #else |
| 581 | #define MM_GETSTATS(_Ctr) (unsigned long) MM_GETSTATS32(_Ctr) |
| 582 | #endif |
| 583 | |
| 584 | #if (LINUX_VERSION_CODE >= 0x020600) |
| 585 | #define mm_copy_to_user( to, from, size ) \ |
| 586 | (in_atomic() ? (memcpy((to),(from),(size)), 0) : copy_to_user((to),(from),(size))) |
| 587 | #define mm_copy_from_user( to, from, size ) \ |
| 588 | (in_atomic() ? (memcpy((to),(from),(size)), 0) : copy_from_user((to),(from),(size))) |
| 589 | #else |
| 590 | #define mm_copy_to_user( to, from, size ) \ |
| 591 | copy_to_user((to),(from),(size) ) |
| 592 | #define mm_copy_from_user( to, from, size ) \ |
| 593 | copy_from_user((to),(from),(size)) |
| 594 | #endif |
| 595 | |
| 596 | #ifndef printf |
| 597 | #define printf(fmt, args...) printk(KERN_WARNING fmt, ##args) |
| 598 | #endif |
| 599 | |
| 600 | #define DbgPrint(fmt, arg...) printk(KERN_DEBUG fmt, ##arg) |
| 601 | #if defined(CONFIG_X86) |
| 602 | #define DbgBreakPoint() __asm__("int $129") |
| 603 | #else |
| 604 | #define DbgBreakPoint() |
| 605 | #endif |
| 606 | #define MM_Wait(time) udelay(time) |
| 607 | |
| 608 | #endif |
| 609 | |