Error Trace
[Home]
Bug # 104
Show/hide error trace Error trace
{ 19 typedef signed char __s8; 20 typedef unsigned char __u8; 22 typedef short __s16; 23 typedef unsigned short __u16; 25 typedef int __s32; 26 typedef unsigned int __u32; 30 typedef unsigned long long __u64; 15 typedef signed char s8; 16 typedef unsigned char u8; 18 typedef short s16; 19 typedef unsigned short u16; 21 typedef int s32; 22 typedef unsigned int u32; 24 typedef long long s64; 25 typedef unsigned long long u64; 14 typedef long __kernel_long_t; 15 typedef unsigned long __kernel_ulong_t; 27 typedef int __kernel_pid_t; 48 typedef unsigned int __kernel_uid32_t; 49 typedef unsigned int __kernel_gid32_t; 71 typedef __kernel_ulong_t __kernel_size_t; 72 typedef __kernel_long_t __kernel_ssize_t; 87 typedef long long __kernel_loff_t; 88 typedef __kernel_long_t __kernel_time_t; 89 typedef __kernel_long_t __kernel_clock_t; 90 typedef int __kernel_timer_t; 91 typedef int __kernel_clockid_t; 32 typedef __u16 __le16; 33 typedef __u16 __be16; 34 typedef __u32 __le32; 35 typedef __u32 __be32; 40 typedef __u32 __wsum; 12 typedef __u32 __kernel_dev_t; 15 typedef __kernel_dev_t dev_t; 18 typedef unsigned short umode_t; 21 typedef __kernel_pid_t pid_t; 26 typedef __kernel_clockid_t clockid_t; 29 typedef _Bool bool; 31 typedef __kernel_uid32_t uid_t; 32 typedef __kernel_gid32_t gid_t; 45 typedef __kernel_loff_t loff_t; 54 typedef __kernel_size_t size_t; 59 typedef __kernel_ssize_t ssize_t; 69 typedef __kernel_time_t time_t; 83 typedef unsigned char u_char; 102 typedef __s32 int32_t; 106 typedef __u8 uint8_t; 108 typedef __u32 uint32_t; 111 typedef __u64 uint64_t; 133 typedef unsigned long sector_t; 134 typedef unsigned long blkcnt_t; 146 typedef u64 dma_addr_t; 157 typedef unsigned int gfp_t; 158 typedef unsigned int fmode_t; 159 typedef unsigned int oom_flags_t; 162 typedef u64 phys_addr_t; 167 typedef phys_addr_t resource_size_t; 177 struct __anonstruct_atomic_t_6 { int counter; } ; 177 typedef struct __anonstruct_atomic_t_6 atomic_t; 182 struct __anonstruct_atomic64_t_7 { long counter; } ; 182 typedef struct __anonstruct_atomic64_t_7 atomic64_t; 183 struct list_head { struct list_head *next; struct list_head *prev; } ; 188 struct hlist_node ; 188 struct hlist_head { struct hlist_node *first; } ; 192 struct hlist_node { struct hlist_node *next; struct hlist_node **pprev; } ; 203 struct callback_head { struct callback_head *next; void (*func)(struct callback_head *); } ; 213 enum dma_data_direction { DMA_BIDIRECTIONAL = 0, DMA_TO_DEVICE = 1, DMA_FROM_DEVICE = 2, DMA_NONE = 3 } ; 5 struct device ; 5 struct page ; 7 struct dma_attrs ; 99 struct kernel_symbol { unsigned long value; const char *name; } ; 33 struct module ; 65 struct pt_regs { unsigned long r15; unsigned long r14; unsigned long r13; unsigned long r12; unsigned long bp; unsigned long bx; unsigned long r11; unsigned long r10; unsigned long r9; unsigned long r8; unsigned long ax; unsigned long cx; unsigned long dx; unsigned long si; unsigned long di; unsigned long orig_ax; unsigned long ip; unsigned long cs; unsigned long flags; unsigned long sp; unsigned long ss; } ; 59 struct __anonstruct____missing_field_name_9 { unsigned int a; unsigned int b; } ; 59 struct __anonstruct____missing_field_name_10 { u16 limit0; u16 base0; unsigned char base1; unsigned char type; unsigned char s; unsigned char dpl; unsigned char p; unsigned char limit; unsigned char avl; unsigned char l; unsigned char d; unsigned char g; unsigned char base2; } ; 59 union __anonunion____missing_field_name_8 { struct __anonstruct____missing_field_name_9 __annonCompField4; struct __anonstruct____missing_field_name_10 __annonCompField5; } ; 59 struct desc_struct { union __anonunion____missing_field_name_8 __annonCompField6; } ; 15 typedef unsigned long pgdval_t; 16 typedef unsigned long pgprotval_t; 20 struct pgprot { pgprotval_t pgprot; } ; 243 typedef struct pgprot pgprot_t; 245 struct __anonstruct_pgd_t_12 { pgdval_t pgd; } ; 245 typedef struct __anonstruct_pgd_t_12 pgd_t; 333 typedef struct page *pgtable_t; 341 struct file ; 354 struct seq_file ; 389 struct thread_struct ; 391 struct mm_struct ; 392 struct task_struct ; 393 struct cpumask ; 394 struct paravirt_callee_save { void *func; } ; 196 struct pv_irq_ops { struct paravirt_callee_save save_fl; struct paravirt_callee_save restore_fl; struct paravirt_callee_save irq_disable; struct paravirt_callee_save irq_enable; void (*safe_halt)(); void (*halt)(); void (*adjust_exception_frame)(); } ; 327 struct arch_spinlock ; 18 typedef u16 __ticket_t; 19 typedef u32 __ticketpair_t; 20 struct __raw_tickets { __ticket_t head; __ticket_t tail; } ; 32 union __anonunion____missing_field_name_15 { __ticketpair_t head_tail; struct __raw_tickets tickets; } ; 32 struct arch_spinlock { union __anonunion____missing_field_name_15 __annonCompField7; } ; 33 typedef struct arch_spinlock arch_spinlock_t; 33 struct __anonstruct____missing_field_name_17 { u32 read; s32 write; } ; 33 union __anonunion_arch_rwlock_t_16 { s64 lock; struct __anonstruct____missing_field_name_17 __annonCompField8; } ; 33 typedef union __anonunion_arch_rwlock_t_16 arch_rwlock_t; 142 typedef void (*ctor_fn_t)(); 54 struct net_device ; 376 struct file_operations ; 388 struct completion ; 416 struct pid ; 527 struct bug_entry { int bug_addr_disp; int file_disp; unsigned short line; unsigned short flags; } ; 102 struct timespec ; 127 struct kernel_vm86_regs { struct pt_regs pt; unsigned short es; unsigned short __esh; unsigned short ds; unsigned short __dsh; unsigned short fs; unsigned short __fsh; unsigned short gs; unsigned short __gsh; } ; 79 union __anonunion____missing_field_name_22 { struct pt_regs *regs; struct kernel_vm86_regs *vm86; } ; 79 struct math_emu_info { long ___orig_eip; union __anonunion____missing_field_name_22 __annonCompField10; } ; 306 struct cpumask { unsigned long bits[128U]; } ; 14 typedef struct cpumask cpumask_t; 663 typedef struct cpumask *cpumask_var_t; 195 struct static_key ; 162 struct seq_operations ; 294 struct i387_fsave_struct { u32 cwd; u32 swd; u32 twd; u32 fip; u32 fcs; u32 foo; u32 fos; u32 st_space[20U]; u32 status; } ; 312 struct __anonstruct____missing_field_name_27 { u64 rip; u64 rdp; } ; 312 struct __anonstruct____missing_field_name_28 { u32 fip; u32 fcs; u32 foo; u32 fos; } ; 312 union __anonunion____missing_field_name_26 { struct __anonstruct____missing_field_name_27 __annonCompField14; struct __anonstruct____missing_field_name_28 __annonCompField15; } ; 312 union __anonunion____missing_field_name_29 { u32 padding1[12U]; u32 sw_reserved[12U]; } ; 312 struct i387_fxsave_struct { u16 cwd; u16 swd; u16 twd; u16 fop; union __anonunion____missing_field_name_26 __annonCompField16; u32 mxcsr; u32 mxcsr_mask; u32 st_space[32U]; u32 xmm_space[64U]; u32 padding[12U]; union __anonunion____missing_field_name_29 __annonCompField17; } ; 346 struct i387_soft_struct { u32 cwd; u32 swd; u32 twd; u32 fip; u32 fcs; u32 foo; u32 fos; u32 st_space[20U]; u8 ftop; u8 changed; u8 lookahead; u8 no_update; u8 rm; u8 alimit; struct math_emu_info *info; u32 entry_eip; } ; 367 struct ymmh_struct { u32 ymmh_space[64U]; } ; 372 struct lwp_struct { u8 reserved[128U]; } ; 377 struct bndregs_struct { u64 bndregs[8U]; } ; 381 struct bndcsr_struct { u64 cfg_reg_u; u64 status_reg; } ; 386 struct xsave_hdr_struct { u64 xstate_bv; u64 reserved1[2U]; u64 reserved2[5U]; } ; 392 struct xsave_struct { struct i387_fxsave_struct i387; struct xsave_hdr_struct xsave_hdr; struct ymmh_struct ymmh; struct lwp_struct lwp; struct bndregs_struct bndregs; struct bndcsr_struct bndcsr; } ; 401 union thread_xstate { struct i387_fsave_struct fsave; struct i387_fxsave_struct fxsave; struct i387_soft_struct soft; struct xsave_struct xsave; } ; 409 struct fpu { unsigned int last_cpu; unsigned int has_fpu; union thread_xstate *state; } ; 456 struct kmem_cache ; 457 struct perf_event ; 458 struct thread_struct { struct desc_struct tls_array[3U]; unsigned long sp0; unsigned long sp; unsigned long usersp; unsigned short es; unsigned short ds; unsigned short fsindex; unsigned short gsindex; unsigned long fs; unsigned long gs; struct perf_event *ptrace_bps[4U]; unsigned long debugreg6; unsigned long ptrace_dr7; unsigned long cr2; unsigned long trap_nr; unsigned long error_code; struct fpu fpu; unsigned long *io_bitmap_ptr; unsigned long iopl; unsigned int io_bitmap_max; unsigned char fpu_counter; } ; 23 typedef atomic64_t atomic_long_t; 152 struct lockdep_map ; 55 struct stack_trace { unsigned int nr_entries; unsigned int max_entries; unsigned long *entries; int skip; } ; 26 struct lockdep_subclass_key { char __one_byte; } ; 53 struct lock_class_key { struct lockdep_subclass_key subkeys[8U]; } ; 59 struct lock_class { struct list_head hash_entry; struct list_head lock_entry; struct lockdep_subclass_key *key; unsigned int subclass; unsigned int dep_gen_id; unsigned long usage_mask; struct stack_trace usage_traces[13U]; struct list_head locks_after; struct list_head locks_before; unsigned int version; unsigned long ops; const char *name; int name_version; unsigned long contention_point[4U]; unsigned long contending_point[4U]; } ; 144 struct lockdep_map { struct lock_class_key *key; struct lock_class *class_cache[2U]; const char *name; int cpu; unsigned long ip; } ; 205 struct held_lock { u64 prev_chain_key; unsigned long acquire_ip; struct lockdep_map *instance; struct lockdep_map *nest_lock; u64 waittime_stamp; u64 holdtime_stamp; unsigned short class_idx; unsigned char irq_context; unsigned char trylock; unsigned char read; unsigned char check; unsigned char hardirqs_off; unsigned short references; } ; 537 struct raw_spinlock { arch_spinlock_t raw_lock; unsigned int magic; unsigned int owner_cpu; void *owner; struct lockdep_map dep_map; } ; 32 typedef struct raw_spinlock raw_spinlock_t; 33 struct __anonstruct____missing_field_name_33 { u8 __padding[24U]; struct lockdep_map dep_map; } ; 33 union __anonunion____missing_field_name_32 { struct raw_spinlock rlock; struct __anonstruct____missing_field_name_33 __annonCompField19; } ; 33 struct spinlock { union __anonunion____missing_field_name_32 __annonCompField20; } ; 76 typedef struct spinlock spinlock_t; 23 struct __anonstruct_rwlock_t_34 { arch_rwlock_t raw_lock; unsigned int magic; unsigned int owner_cpu; void *owner; struct lockdep_map dep_map; } ; 23 typedef struct __anonstruct_rwlock_t_34 rwlock_t; 59 struct static_key { atomic_t enabled; } ; 412 struct rb_node { unsigned long __rb_parent_color; struct rb_node *rb_right; struct rb_node *rb_left; } ; 40 struct rb_root { struct rb_node *rb_node; } ; 87 struct rw_semaphore ; 88 struct rw_semaphore { long count; raw_spinlock_t wait_lock; struct list_head wait_list; struct lockdep_map dep_map; } ; 12 struct __wait_queue ; 12 typedef struct __wait_queue wait_queue_t; 15 struct __wait_queue { unsigned int flags; void *private; int (*func)(wait_queue_t *, unsigned int, int, void *); struct list_head task_list; } ; 34 struct __wait_queue_head { spinlock_t lock; struct list_head task_list; } ; 39 typedef struct __wait_queue_head wait_queue_head_t; 919 struct completion { unsigned int done; wait_queue_head_t wait; } ; 113 struct vm_area_struct ; 114 struct inode ; 115 struct notifier_block ; 58 struct mutex { atomic_t count; spinlock_t wait_lock; struct list_head wait_list; struct task_struct *owner; const char *name; void *magic; struct lockdep_map dep_map; } ; 67 struct mutex_waiter { struct list_head list; struct task_struct *task; void *magic; } ; 177 struct seqcount { unsigned int sequence; struct lockdep_map dep_map; } ; 51 typedef struct seqcount seqcount_t; 259 struct __anonstruct_seqlock_t_35 { struct seqcount seqcount; spinlock_t lock; } ; 259 typedef struct __anonstruct_seqlock_t_35 seqlock_t; 1039 struct timespec { __kernel_time_t tv_sec; long tv_nsec; } ; 323 union ktime { s64 tv64; } ; 59 typedef union ktime ktime_t; 388 struct tvec_base ; 389 struct timer_list { struct list_head entry; unsigned long expires; struct tvec_base *base; void (*function)(unsigned long); unsigned long data; int slack; int start_pid; void *start_site; char start_comm[16U]; struct lockdep_map lockdep_map; } ; 254 struct hrtimer ; 255 enum hrtimer_restart ; 266 struct workqueue_struct ; 267 struct work_struct ; 54 struct work_struct { atomic_long_t data; struct list_head entry; void (*func)(struct work_struct *); struct lockdep_map lockdep_map; } ; 107 struct delayed_work { struct work_struct work; struct timer_list timer; struct workqueue_struct *wq; int cpu; } ; 51 struct notifier_block { int (*notifier_call)(struct notifier_block *, unsigned long, void *); struct notifier_block *next; int priority; } ; 63 struct blocking_notifier_head { struct rw_semaphore rwsem; struct notifier_block *head; } ; 45 struct arch_uprobe_task { unsigned long saved_scratch_register; unsigned int saved_trap_nr; unsigned int saved_tf; } ; 54 enum uprobe_task_state { UTASK_RUNNING = 0, UTASK_SSTEP = 1, UTASK_SSTEP_ACK = 2, UTASK_SSTEP_TRAPPED = 3 } ; 61 struct __anonstruct____missing_field_name_38 { struct arch_uprobe_task autask; unsigned long vaddr; } ; 61 struct __anonstruct____missing_field_name_39 { struct callback_head dup_xol_work; unsigned long dup_xol_addr; } ; 61 union __anonunion____missing_field_name_37 { struct __anonstruct____missing_field_name_38 __annonCompField22; struct __anonstruct____missing_field_name_39 __annonCompField23; } ; 61 struct uprobe ; 61 struct return_instance ; 61 struct uprobe_task { enum uprobe_task_state state; union __anonunion____missing_field_name_37 __annonCompField24; struct uprobe *active_uprobe; unsigned long xol_vaddr; struct return_instance *return_instances; unsigned int depth; } ; 93 struct xol_area ; 94 struct uprobes_state { struct xol_area *xol_area; } ; 22 struct __anonstruct_mm_context_t_40 { void *ldt; int size; unsigned short ia32_compat; struct mutex lock; void *vdso; } ; 22 typedef struct __anonstruct_mm_context_t_40 mm_context_t; 26 struct address_space ; 27 union __anonunion____missing_field_name_41 { struct address_space *mapping; void *s_mem; } ; 27 union __anonunion____missing_field_name_43 { unsigned long index; void *freelist; bool pfmemalloc; } ; 27 struct __anonstruct____missing_field_name_47 { unsigned short inuse; unsigned short objects; unsigned char frozen; } ; 27 union __anonunion____missing_field_name_46 { atomic_t _mapcount; struct __anonstruct____missing_field_name_47 __annonCompField27; int units; } ; 27 struct __anonstruct____missing_field_name_45 { union __anonunion____missing_field_name_46 __annonCompField28; atomic_t _count; } ; 27 union __anonunion____missing_field_name_44 { unsigned long counters; struct __anonstruct____missing_field_name_45 __annonCompField29; unsigned int active; } ; 27 struct __anonstruct____missing_field_name_42 { union __anonunion____missing_field_name_43 __annonCompField26; union __anonunion____missing_field_name_44 __annonCompField30; } ; 27 struct __anonstruct____missing_field_name_49 { struct page *next; int pages; int pobjects; } ; 27 struct slab ; 27 union __anonunion____missing_field_name_48 { struct list_head lru; struct __anonstruct____missing_field_name_49 __annonCompField32; struct list_head list; struct slab *slab_page; struct callback_head callback_head; pgtable_t pmd_huge_pte; } ; 27 union __anonunion____missing_field_name_50 { unsigned long private; spinlock_t *ptl; struct kmem_cache *slab_cache; struct page *first_page; } ; 27 struct page { unsigned long flags; union __anonunion____missing_field_name_41 __annonCompField25; struct __anonstruct____missing_field_name_42 __annonCompField31; union __anonunion____missing_field_name_48 __annonCompField33; union __anonunion____missing_field_name_50 __annonCompField34; unsigned long debug_flags; } ; 186 struct page_frag { struct page *page; __u32 offset; __u32 size; } ; 238 struct __anonstruct_linear_52 { struct rb_node rb; unsigned long rb_subtree_last; } ; 238 union __anonunion_shared_51 { struct __anonstruct_linear_52 linear; struct list_head nonlinear; } ; 238 struct anon_vma ; 238 struct vm_operations_struct ; 238 struct mempolicy ; 238 struct vm_area_struct { unsigned long vm_start; unsigned long vm_end; struct vm_area_struct *vm_next; struct vm_area_struct *vm_prev; struct rb_node vm_rb; unsigned long rb_subtree_gap; struct mm_struct *vm_mm; pgprot_t vm_page_prot; unsigned long vm_flags; union __anonunion_shared_51 shared; struct list_head anon_vma_chain; struct anon_vma *anon_vma; const struct vm_operations_struct *vm_ops; unsigned long vm_pgoff; struct file *vm_file; void *vm_private_data; struct mempolicy *vm_policy; } ; 310 struct core_thread { struct task_struct *task; struct core_thread *next; } ; 316 struct core_state { atomic_t nr_threads; struct core_thread dumper; struct completion startup; } ; 329 struct task_rss_stat { int events; int count[3U]; } ; 337 struct mm_rss_stat { atomic_long_t count[3U]; } ; 342 struct kioctx_table ; 343 struct linux_binfmt ; 343 struct mmu_notifier_mm ; 343 struct mm_struct { struct vm_area_struct *mmap; struct rb_root mm_rb; struct vm_area_struct *mmap_cache; unsigned long int (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); unsigned long mmap_base; unsigned long mmap_legacy_base; unsigned long task_size; unsigned long highest_vm_end; pgd_t *pgd; atomic_t mm_users; atomic_t mm_count; atomic_long_t nr_ptes; int map_count; spinlock_t page_table_lock; struct rw_semaphore mmap_sem; struct list_head mmlist; unsigned long hiwater_rss; unsigned long hiwater_vm; unsigned long total_vm; unsigned long locked_vm; unsigned long pinned_vm; unsigned long shared_vm; unsigned long exec_vm; unsigned long stack_vm; unsigned long def_flags; unsigned long start_code; unsigned long end_code; unsigned long start_data; unsigned long end_data; unsigned long start_brk; unsigned long brk; unsigned long start_stack; unsigned long arg_start; unsigned long arg_end; unsigned long env_start; unsigned long env_end; unsigned long saved_auxv[46U]; struct mm_rss_stat rss_stat; struct linux_binfmt *binfmt; cpumask_var_t cpu_vm_mask_var; mm_context_t context; unsigned long flags; struct core_state *core_state; spinlock_t ioctx_lock; struct kioctx_table *ioctx_table; struct task_struct *owner; struct file *exe_file; struct mmu_notifier_mm *mmu_notifier_mm; struct cpumask cpumask_allocation; unsigned long numa_next_scan; unsigned long numa_scan_offset; int numa_scan_seq; bool tlb_flush_pending; struct uprobes_state uprobes_state; } ; 186 struct iovec { void *iov_base; __kernel_size_t iov_len; } ; 11 typedef unsigned short __kernel_sa_family_t; 18 struct cred ; 23 typedef __kernel_sa_family_t sa_family_t; 24 struct sockaddr { sa_family_t sa_family; char sa_data[14U]; } ; 38 struct msghdr { void *msg_name; int msg_namelen; struct iovec *msg_iov; __kernel_size_t msg_iovlen; void *msg_control; __kernel_size_t msg_controllen; unsigned int msg_flags; } ; 331 enum ldv_11030 { SS_FREE = 0, SS_UNCONNECTED = 1, SS_CONNECTING = 2, SS_CONNECTED = 3, SS_DISCONNECTING = 4 } ; 53 typedef enum ldv_11030 socket_state; 54 struct poll_table_struct ; 55 struct pipe_inode_info ; 56 struct net ; 73 struct fasync_struct ; 73 struct socket_wq { wait_queue_head_t wait; struct fasync_struct *fasync_list; struct callback_head rcu; } ; 94 struct sock ; 94 struct proto_ops ; 94 struct socket { socket_state state; short type; unsigned long flags; struct socket_wq *wq; struct file *file; struct sock *sk; const struct proto_ops *ops; } ; 120 struct kiocb ; 121 struct proto_ops { int family; struct module *owner; int (*release)(struct socket *); int (*bind)(struct socket *, struct sockaddr *, int); int (*connect)(struct socket *, struct sockaddr *, int, int); int (*socketpair)(struct socket *, struct socket *); int (*accept)(struct socket *, struct socket *, int); int (*getname)(struct socket *, struct sockaddr *, int *, int); unsigned int (*poll)(struct file *, struct socket *, struct poll_table_struct *); int (*ioctl)(struct socket *, unsigned int, unsigned long); int (*compat_ioctl)(struct socket *, unsigned int, unsigned long); int (*listen)(struct socket *, int); int (*shutdown)(struct socket *, int); int (*setsockopt)(struct socket *, int, int, char *, unsigned int); int (*getsockopt)(struct socket *, int, int, char *, int *); int (*compat_setsockopt)(struct socket *, int, int, char *, unsigned int); int (*compat_getsockopt)(struct socket *, int, int, char *, int *); int (*sendmsg)(struct kiocb *, struct socket *, struct msghdr *, size_t ); int (*recvmsg)(struct kiocb *, struct socket *, struct msghdr *, size_t , int); int (*mmap)(struct file *, struct socket *, struct vm_area_struct *); ssize_t (*sendpage)(struct socket *, struct page *, int, size_t , int); ssize_t (*splice_read)(struct socket *, loff_t *, struct pipe_inode_info *, size_t , unsigned int); int (*set_peek_off)(struct sock *, int); } ; 98 struct __anonstruct_nodemask_t_53 { unsigned long bits[16U]; } ; 98 typedef struct __anonstruct_nodemask_t_53 nodemask_t; 891 struct ctl_table ; 72 struct resource { resource_size_t start; resource_size_t end; const char *name; unsigned long flags; struct resource *parent; struct resource *sibling; struct resource *child; } ; 172 struct pci_dev ; 58 struct pm_message { int event; } ; 64 typedef struct pm_message pm_message_t; 65 struct dev_pm_ops { int (*prepare)(struct device *); void (*complete)(struct device *); int (*suspend)(struct device *); int (*resume)(struct device *); int (*freeze)(struct device *); int (*thaw)(struct device *); int (*poweroff)(struct device *); int (*restore)(struct device *); int (*suspend_late)(struct device *); int (*resume_early)(struct device *); int (*freeze_late)(struct device *); int (*thaw_early)(struct device *); int (*poweroff_late)(struct device *); int (*restore_early)(struct device *); int (*suspend_noirq)(struct device *); int (*resume_noirq)(struct device *); int (*freeze_noirq)(struct device *); int (*thaw_noirq)(struct device *); int (*poweroff_noirq)(struct device *); int (*restore_noirq)(struct device *); int (*runtime_suspend)(struct device *); int (*runtime_resume)(struct device *); int (*runtime_idle)(struct device *); } ; 301 enum rpm_status { RPM_ACTIVE = 0, RPM_RESUMING = 1, RPM_SUSPENDED = 2, RPM_SUSPENDING = 3 } ; 308 enum rpm_request { RPM_REQ_NONE = 0, RPM_REQ_IDLE = 1, RPM_REQ_SUSPEND = 2, RPM_REQ_AUTOSUSPEND = 3, RPM_REQ_RESUME = 4 } ; 316 struct wakeup_source ; 527 struct pm_subsys_data { spinlock_t lock; unsigned int refcount; struct list_head clock_list; } ; 534 struct dev_pm_qos ; 534 struct dev_pm_info { pm_message_t power_state; unsigned char can_wakeup; unsigned char async_suspend; bool is_prepared; bool is_suspended; bool ignore_children; bool early_init; spinlock_t lock; struct list_head entry; struct completion completion; struct wakeup_source *wakeup; bool wakeup_path; bool syscore; struct timer_list suspend_timer; unsigned long timer_expires; struct work_struct work; wait_queue_head_t wait_queue; atomic_t usage_count; atomic_t child_count; unsigned char disable_depth; unsigned char idle_notification; unsigned char request_pending; unsigned char deferred_resume; unsigned char run_wake; unsigned char runtime_auto; unsigned char no_callbacks; unsigned char irq_safe; unsigned char use_autosuspend; unsigned char timer_autosuspends; unsigned char memalloc_noio; enum rpm_request request; enum rpm_status runtime_status; int runtime_error; int autosuspend_delay; unsigned long last_busy; unsigned long active_jiffies; unsigned long suspended_jiffies; unsigned long accounting_timestamp; struct pm_subsys_data *subsys_data; struct dev_pm_qos *qos; } ; 591 struct dev_pm_domain { struct dev_pm_ops ops; } ; 133 struct pci_bus ; 341 struct device_node ; 1276 struct llist_node ; 64 struct llist_node { struct llist_node *next; } ; 58 struct mem_cgroup ; 325 struct idr_layer { int prefix; unsigned long bitmap[4U]; struct idr_layer *ary[256U]; int count; int layer; struct callback_head callback_head; } ; 38 struct idr { struct idr_layer *hint; struct idr_layer *top; struct idr_layer *id_free; int layers; int id_free_cnt; int cur; spinlock_t lock; } ; 197 struct ida_bitmap { long nr_busy; unsigned long bitmap[15U]; } ; 213 struct ida { struct idr idr; struct ida_bitmap *free_bitmap; } ; 245 struct dentry ; 246 struct iattr ; 247 struct super_block ; 248 struct file_system_type ; 249 struct kernfs_open_node ; 250 struct kernfs_iattrs ; 266 struct kernfs_root ; 266 struct kernfs_elem_dir { unsigned long subdirs; struct rb_root children; struct kernfs_root *root; } ; 62 struct kernfs_node ; 62 struct kernfs_elem_symlink { struct kernfs_node *target_kn; } ; 66 struct kernfs_ops ; 66 struct kernfs_elem_attr { const struct kernfs_ops *ops; struct kernfs_open_node *open; loff_t size; } ; 72 union __anonunion_u_145 { struct completion *completion; struct kernfs_node *removed_list; } ; 72 union __anonunion____missing_field_name_146 { struct kernfs_elem_dir dir; struct kernfs_elem_symlink symlink; struct kernfs_elem_attr attr; } ; 72 struct kernfs_node { atomic_t count; atomic_t active; struct lockdep_map dep_map; struct kernfs_node *parent; const char *name; struct rb_node rb; union __anonunion_u_145 u; const void *ns; unsigned int hash; union __anonunion____missing_field_name_146 __annonCompField46; void *priv; unsigned short flags; umode_t mode; unsigned int ino; struct kernfs_iattrs *iattr; } ; 114 struct kernfs_dir_ops { int (*mkdir)(struct kernfs_node *, const char *, umode_t ); int (*rmdir)(struct kernfs_node *); int (*rename)(struct kernfs_node *, struct kernfs_node *, const char *); } ; 127 struct kernfs_root { struct kernfs_node *kn; struct ida ino_ida; struct kernfs_dir_ops *dir_ops; } ; 137 struct kernfs_open_file { struct kernfs_node *kn; struct file *file; struct mutex mutex; int event; struct list_head list; bool mmapped; const struct vm_operations_struct *vm_ops; } ; 151 struct kernfs_ops { int (*seq_show)(struct seq_file *, void *); void * (*seq_start)(struct seq_file *, loff_t *); void * (*seq_next)(struct seq_file *, void *, loff_t *); void (*seq_stop)(struct seq_file *, void *); ssize_t (*read)(struct kernfs_open_file *, char *, size_t , loff_t ); ssize_t (*write)(struct kernfs_open_file *, char *, size_t , loff_t ); int (*mmap)(struct kernfs_open_file *, struct vm_area_struct *); struct lock_class_key lockdep_key; } ; 376 struct kobject ; 377 enum kobj_ns_type { KOBJ_NS_TYPE_NONE = 0, KOBJ_NS_TYPE_NET = 1, KOBJ_NS_TYPES = 2 } ; 383 struct kobj_ns_type_operations { enum kobj_ns_type type; bool (*current_may_mount)(); void * (*grab_current_ns)(); const void * (*netlink_ns)(struct sock *); const void * (*initial_ns)(); void (*drop_ns)(void *); } ; 83 struct user_namespace ; 22 struct __anonstruct_kuid_t_147 { uid_t val; } ; 22 typedef struct __anonstruct_kuid_t_147 kuid_t; 27 struct __anonstruct_kgid_t_148 { gid_t val; } ; 27 typedef struct __anonstruct_kgid_t_148 kgid_t; 127 struct kstat { u64 ino; dev_t dev; umode_t mode; unsigned int nlink; kuid_t uid; kgid_t gid; dev_t rdev; loff_t size; struct timespec atime; struct timespec mtime; struct timespec ctime; unsigned long blksize; unsigned long long blocks; } ; 36 struct bin_attribute ; 37 struct attribute { const char *name; umode_t mode; bool ignore_lockdep; struct lock_class_key *key; struct lock_class_key skey; } ; 37 struct attribute_group { const char *name; umode_t (*is_visible)(struct kobject *, struct attribute *, int); struct attribute **attrs; struct bin_attribute **bin_attrs; } ; 67 struct bin_attribute { struct attribute attr; size_t size; void *private; ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t , size_t ); ssize_t (*write)(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t , size_t ); int (*mmap)(struct file *, struct kobject *, struct bin_attribute *, struct vm_area_struct *); } ; 130 struct sysfs_ops { ssize_t (*show)(struct kobject *, struct attribute *, char *); ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t ); } ; 462 struct kref { atomic_t refcount; } ; 50 struct kset ; 50 struct kobj_type ; 50 struct kobject { const char *name; struct list_head entry; struct kobject *parent; struct kset *kset; struct kobj_type *ktype; struct kernfs_node *sd; struct kref kref; struct delayed_work release; unsigned char state_initialized; unsigned char state_in_sysfs; unsigned char state_add_uevent_sent; unsigned char state_remove_uevent_sent; unsigned char uevent_suppress; } ; 112 struct kobj_type { void (*release)(struct kobject *); const struct sysfs_ops *sysfs_ops; struct attribute **default_attrs; const struct kobj_ns_type_operations * (*child_ns_type)(struct kobject *); const void * (*namespace)(struct kobject *); } ; 120 struct kobj_uevent_env { char *envp[32U]; int envp_idx; char buf[2048U]; int buflen; } ; 127 struct kset_uevent_ops { const int (*filter)(struct kset *, struct kobject *); const const char * (*name)(struct kset *, struct kobject *); const int (*uevent)(struct kset *, struct kobject *, struct kobj_uevent_env *); } ; 144 struct kset { struct list_head list; spinlock_t list_lock; struct kobject kobj; const struct kset_uevent_ops *uevent_ops; } ; 249 struct kmem_cache_cpu { void **freelist; unsigned long tid; struct page *page; struct page *partial; unsigned int stat[26U]; } ; 48 struct kmem_cache_order_objects { unsigned long x; } ; 58 struct memcg_cache_params ; 58 struct kmem_cache_node ; 58 struct kmem_cache { struct kmem_cache_cpu *cpu_slab; unsigned long flags; unsigned long min_partial; int size; int object_size; int offset; int cpu_partial; struct kmem_cache_order_objects oo; struct kmem_cache_order_objects max; struct kmem_cache_order_objects min; gfp_t allocflags; int refcount; void (*ctor)(void *); int inuse; int align; int reserved; const char *name; struct list_head list; struct kobject kobj; struct memcg_cache_params *memcg_params; int max_attr_size; int remote_node_defrag_ratio; struct kmem_cache_node *node[1024U]; } ; 497 struct __anonstruct____missing_field_name_150 { struct callback_head callback_head; struct kmem_cache *memcg_caches[0U]; } ; 497 struct __anonstruct____missing_field_name_151 { struct mem_cgroup *memcg; struct list_head list; struct kmem_cache *root_cache; bool dead; atomic_t nr_pages; struct work_struct destroy; } ; 497 union __anonunion____missing_field_name_149 { struct __anonstruct____missing_field_name_150 __annonCompField47; struct __anonstruct____missing_field_name_151 __annonCompField48; } ; 497 struct memcg_cache_params { bool is_root_cache; union __anonunion____missing_field_name_149 __annonCompField49; } ; 62 struct exception_table_entry { int insn; int fixup; } ; 161 struct in6_addr ; 119 struct sk_buff ; 134 struct klist_node ; 37 struct klist_node { void *n_klist; struct list_head n_node; struct kref n_ref; } ; 67 struct path ; 68 struct seq_file { char *buf; size_t size; size_t from; size_t count; size_t pad_until; loff_t index; loff_t read_pos; u64 version; struct mutex lock; const struct seq_operations *op; int poll_event; struct user_namespace *user_ns; void *private; } ; 35 struct seq_operations { void * (*start)(struct seq_file *, loff_t *); void (*stop)(struct seq_file *, void *); void * (*next)(struct seq_file *, void *, loff_t *); int (*show)(struct seq_file *, void *); } ; 196 struct pinctrl ; 197 struct pinctrl_state ; 194 struct dev_pin_info { struct pinctrl *p; struct pinctrl_state *default_state; struct pinctrl_state *sleep_state; struct pinctrl_state *idle_state; } ; 42 struct dma_map_ops ; 42 struct dev_archdata { struct dma_map_ops *dma_ops; void *iommu; } ; 14 struct device_private ; 15 struct device_driver ; 16 struct driver_private ; 17 struct class ; 18 struct subsys_private ; 19 struct bus_type ; 20 struct iommu_ops ; 21 struct iommu_group ; 60 struct device_attribute ; 60 struct bus_type { const char *name; const char *dev_name; struct device *dev_root; struct device_attribute *dev_attrs; const struct attribute_group **bus_groups; const struct attribute_group **dev_groups; const struct attribute_group **drv_groups; int (*match)(struct device *, struct device_driver *); int (*uevent)(struct device *, struct kobj_uevent_env *); int (*probe)(struct device *); int (*remove)(struct device *); void (*shutdown)(struct device *); int (*online)(struct device *); int (*offline)(struct device *); int (*suspend)(struct device *, pm_message_t ); int (*resume)(struct device *); const struct dev_pm_ops *pm; struct iommu_ops *iommu_ops; struct subsys_private *p; struct lock_class_key lock_key; } ; 138 struct device_type ; 195 struct of_device_id ; 195 struct acpi_device_id ; 195 struct device_driver { const char *name; struct bus_type *bus; struct module *owner; const char *mod_name; bool suppress_bind_attrs; const struct of_device_id *of_match_table; const struct acpi_device_id *acpi_match_table; int (*probe)(struct device *); int (*remove)(struct device *); void (*shutdown)(struct device *); int (*suspend)(struct device *, pm_message_t ); int (*resume)(struct device *); const struct attribute_group **groups; const struct dev_pm_ops *pm; struct driver_private *p; } ; 260 struct driver_attribute { struct attribute attr; ssize_t (*show)(struct device_driver *, char *); ssize_t (*store)(struct device_driver *, const char *, size_t ); } ; 321 struct class_attribute ; 321 struct class { const char *name; struct module *owner; struct class_attribute *class_attrs; const struct attribute_group **dev_groups; struct kobject *dev_kobj; int (*dev_uevent)(struct device *, struct kobj_uevent_env *); char * (*devnode)(struct device *, umode_t *); void (*class_release)(struct class *); void (*dev_release)(struct device *); int (*suspend)(struct device *, pm_message_t ); int (*resume)(struct device *); const struct kobj_ns_type_operations *ns_type; const void * (*namespace)(struct device *); const struct dev_pm_ops *pm; struct subsys_private *p; } ; 414 struct class_attribute { struct attribute attr; ssize_t (*show)(struct class *, struct class_attribute *, char *); ssize_t (*store)(struct class *, struct class_attribute *, const char *, size_t ); } ; 482 struct device_type { const char *name; const struct attribute_group **groups; int (*uevent)(struct device *, struct kobj_uevent_env *); char * (*devnode)(struct device *, umode_t *, kuid_t *, kgid_t *); void (*release)(struct device *); const struct dev_pm_ops *pm; } ; 510 struct device_attribute { struct attribute attr; ssize_t (*show)(struct device *, struct device_attribute *, char *); ssize_t (*store)(struct device *, struct device_attribute *, const char *, size_t ); } ; 637 struct device_dma_parameters { unsigned int max_segment_size; unsigned long segment_boundary_mask; } ; 646 struct acpi_device ; 647 struct acpi_dev_node { struct acpi_device *companion; } ; 653 struct dma_coherent_mem ; 653 struct device { struct device *parent; struct device_private *p; struct kobject kobj; const char *init_name; const struct device_type *type; struct mutex mutex; struct bus_type *bus; struct device_driver *driver; void *platform_data; struct dev_pm_info power; struct dev_pm_domain *pm_domain; struct dev_pin_info *pins; int numa_node; u64 *dma_mask; u64 coherent_dma_mask; struct device_dma_parameters *dma_parms; struct list_head dma_pools; struct dma_coherent_mem *dma_mem; struct dev_archdata archdata; struct device_node *of_node; struct acpi_dev_node acpi_node; dev_t devt; u32 id; spinlock_t devres_lock; struct list_head devres_head; struct klist_node knode_class; struct class *class; const struct attribute_group **groups; void (*release)(struct device *); struct iommu_group *iommu_group; bool offline_disabled; bool offline; } ; 795 struct wakeup_source { const char *name; struct list_head entry; spinlock_t lock; struct timer_list timer; unsigned long timer_expires; ktime_t total_time; ktime_t max_time; ktime_t last_time; ktime_t start_prevent_time; ktime_t prevent_sleep_time; unsigned long event_count; unsigned long active_count; unsigned long relax_count; unsigned long expire_count; unsigned long wakeup_count; bool active; bool autosleep_enabled; } ; 93 struct shrink_control { gfp_t gfp_mask; unsigned long nr_to_scan; nodemask_t nodes_to_scan; int nid; } ; 26 struct shrinker { unsigned long int (*count_objects)(struct shrinker *, struct shrink_control *); unsigned long int (*scan_objects)(struct shrinker *, struct shrink_control *); int seeks; long batch; unsigned long flags; struct list_head list; atomic_long_t *nr_deferred; } ; 71 struct file_ra_state ; 72 struct user_struct ; 73 struct writeback_control ; 185 struct vm_fault { unsigned int flags; unsigned long pgoff; void *virtual_address; struct page *page; } ; 210 struct vm_operations_struct { void (*open)(struct vm_area_struct *); void (*close)(struct vm_area_struct *); int (*fault)(struct vm_area_struct *, struct vm_fault *); int (*page_mkwrite)(struct vm_area_struct *, struct vm_fault *); int (*access)(struct vm_area_struct *, unsigned long, void *, int, int); int (*set_policy)(struct vm_area_struct *, struct mempolicy *); struct mempolicy * (*get_policy)(struct vm_area_struct *, unsigned long); int (*migrate)(struct vm_area_struct *, const nodemask_t *, const nodemask_t *, unsigned long); int (*remap_pages)(struct vm_area_struct *, unsigned long, unsigned long, unsigned long); } ; 2071 struct scatterlist { unsigned long sg_magic; unsigned long page_link; unsigned int offset; unsigned int length; dma_addr_t dma_address; unsigned int dma_length; } ; 17 struct sg_table { struct scatterlist *sgl; unsigned int nents; unsigned int orig_nents; } ; 38 typedef s32 dma_cookie_t; 1156 struct timerqueue_node { struct rb_node node; ktime_t expires; } ; 12 struct timerqueue_head { struct rb_root head; struct timerqueue_node *next; } ; 50 struct hrtimer_clock_base ; 51 struct hrtimer_cpu_base ; 60 enum hrtimer_restart { HRTIMER_NORESTART = 0, HRTIMER_RESTART = 1 } ; 65 struct hrtimer { struct timerqueue_node node; ktime_t _softexpires; enum hrtimer_restart (*function)(struct hrtimer *); struct hrtimer_clock_base *base; unsigned long state; int start_pid; void *start_site; char start_comm[16U]; } ; 132 struct hrtimer_clock_base { struct hrtimer_cpu_base *cpu_base; int index; clockid_t clockid; struct timerqueue_head active; ktime_t resolution; ktime_t (*get_time)(); ktime_t softirq_time; ktime_t offset; } ; 163 struct hrtimer_cpu_base { raw_spinlock_t lock; unsigned int active_bases; unsigned int clock_was_set; ktime_t expires_next; int hres_active; int hang_detected; unsigned long nr_events; unsigned long nr_retries; unsigned long nr_hangs; ktime_t max_hang_time; struct hrtimer_clock_base clock_base[4U]; } ; 474 struct dma_attrs { unsigned long flags[1U]; } ; 70 struct dma_map_ops { void * (*alloc)(struct device *, size_t , dma_addr_t *, gfp_t , struct dma_attrs *); void (*free)(struct device *, size_t , void *, dma_addr_t , struct dma_attrs *); int (*mmap)(struct device *, struct vm_area_struct *, void *, dma_addr_t , size_t , struct dma_attrs *); int (*get_sgtable)(struct device *, struct sg_table *, void *, dma_addr_t , size_t , struct dma_attrs *); dma_addr_t (*map_page)(struct device *, struct page *, unsigned long, size_t , enum dma_data_direction , struct dma_attrs *); void (*unmap_page)(struct device *, dma_addr_t , size_t , enum dma_data_direction , struct dma_attrs *); int (*map_sg)(struct device *, struct scatterlist *, int, enum dma_data_direction , struct dma_attrs *); void (*unmap_sg)(struct device *, struct scatterlist *, int, enum dma_data_direction , struct dma_attrs *); void (*sync_single_for_cpu)(struct device *, dma_addr_t , size_t , enum dma_data_direction ); void (*sync_single_for_device)(struct device *, dma_addr_t , size_t , enum dma_data_direction ); void (*sync_sg_for_cpu)(struct device *, struct scatterlist *, int, enum dma_data_direction ); void (*sync_sg_for_device)(struct device *, struct scatterlist *, int, enum dma_data_direction ); int (*mapping_error)(struct device *, dma_addr_t ); int (*dma_supported)(struct device *, u64 ); int (*set_dma_mask)(struct device *, u64 ); int is_phys; } ; 15 typedef u64 netdev_features_t; 18 struct nf_conntrack { atomic_t use; } ; 136 struct nf_bridge_info { atomic_t use; unsigned int mask; struct net_device *physindev; struct net_device *physoutdev; unsigned long data[4U]; } ; 146 struct sk_buff_head { struct sk_buff *next; struct sk_buff *prev; __u32 qlen; spinlock_t lock; } ; 354 typedef unsigned int sk_buff_data_t; 355 struct sec_path ; 355 struct __anonstruct____missing_field_name_156 { __u16 csum_start; __u16 csum_offset; } ; 355 union __anonunion____missing_field_name_155 { __wsum csum; struct __anonstruct____missing_field_name_156 __annonCompField51; } ; 355 union __anonunion____missing_field_name_157 { unsigned int napi_id; dma_cookie_t dma_cookie; } ; 355 union __anonunion____missing_field_name_158 { __u32 mark; __u32 dropcount; __u32 reserved_tailroom; } ; 355 struct sk_buff { struct sk_buff *next; struct sk_buff *prev; ktime_t tstamp; struct sock *sk; struct net_device *dev; char cb[48U]; unsigned long _skb_refdst; struct sec_path *sp; unsigned int len; unsigned int data_len; __u16 mac_len; __u16 hdr_len; union __anonunion____missing_field_name_155 __annonCompField52; __u32 priority; unsigned char local_df; unsigned char cloned; unsigned char ip_summed; unsigned char nohdr; unsigned char nfctinfo; unsigned char pkt_type; unsigned char fclone; unsigned char ipvs_property; unsigned char peeked; unsigned char nf_trace; __be16 protocol; void (*destructor)(struct sk_buff *); struct nf_conntrack *nfct; struct nf_bridge_info *nf_bridge; int skb_iif; __u32 rxhash; __be16 vlan_proto; __u16 vlan_tci; __u16 tc_index; __u16 tc_verd; __u16 queue_mapping; unsigned char ndisc_nodetype; unsigned char pfmemalloc; unsigned char ooo_okay; unsigned char l4_rxhash; unsigned char wifi_acked_valid; unsigned char wifi_acked; unsigned char no_fcs; unsigned char head_frag; unsigned char encapsulation; union __anonunion____missing_field_name_157 __annonCompField53; __u32 secmark; union __anonunion____missing_field_name_158 __annonCompField54; __be16 inner_protocol; __u16 inner_transport_header; __u16 inner_network_header; __u16 inner_mac_header; __u16 transport_header; __u16 network_header; __u16 mac_header; sk_buff_data_t tail; sk_buff_data_t end; unsigned char *head; unsigned char *data; unsigned int truesize; atomic_t users; } ; 578 struct dst_entry ; 646 struct rtable ; 2939 struct plist_head { struct list_head node_list; } ; 84 struct plist_node { int prio; struct list_head prio_list; struct list_head node_list; } ; 83 struct pm_qos_request { struct plist_node node; int pm_qos_class; struct delayed_work work; } ; 45 struct pm_qos_flags_request { struct list_head node; s32 flags; } ; 50 enum dev_pm_qos_req_type { DEV_PM_QOS_LATENCY = 1, DEV_PM_QOS_FLAGS = 2 } ; 55 union __anonunion_data_159 { struct plist_node pnode; struct pm_qos_flags_request flr; } ; 55 struct dev_pm_qos_request { enum dev_pm_qos_req_type type; union __anonunion_data_159 data; struct device *dev; } ; 64 enum pm_qos_type { PM_QOS_UNITIALIZED = 0, PM_QOS_MAX = 1, PM_QOS_MIN = 2 } ; 70 struct pm_qos_constraints { struct plist_head list; s32 target_value; s32 default_value; enum pm_qos_type type; struct blocking_notifier_head *notifiers; } ; 83 struct pm_qos_flags { struct list_head list; s32 effective_flags; } ; 88 struct dev_pm_qos { struct pm_qos_constraints latency; struct pm_qos_flags flags; struct dev_pm_qos_request *latency_req; struct dev_pm_qos_request *flags_req; } ; 460 struct dql { unsigned int num_queued; unsigned int adj_limit; unsigned int last_obj_cnt; unsigned int limit; unsigned int num_completed; unsigned int prev_ovlimit; unsigned int prev_num_queued; unsigned int prev_last_obj_cnt; unsigned int lowest_slack; unsigned long slack_start_time; unsigned int max_limit; unsigned int min_limit; unsigned int slack_hold_time; } ; 25 struct sem_undo_list ; 25 struct sysv_sem { struct sem_undo_list *undo_list; } ; 43 struct __anonstruct_sync_serial_settings_160 { unsigned int clock_rate; unsigned int clock_type; unsigned short loopback; } ; 43 typedef struct __anonstruct_sync_serial_settings_160 sync_serial_settings; 50 struct __anonstruct_te1_settings_161 { unsigned int clock_rate; unsigned int clock_type; unsigned short loopback; unsigned int slot_map; } ; 50 typedef struct __anonstruct_te1_settings_161 te1_settings; 55 struct __anonstruct_raw_hdlc_proto_162 { unsigned short encoding; unsigned short parity; } ; 55 typedef struct __anonstruct_raw_hdlc_proto_162 raw_hdlc_proto; 65 struct __anonstruct_fr_proto_163 { unsigned int t391; unsigned int t392; unsigned int n391; unsigned int n392; unsigned int n393; unsigned short lmi; unsigned short dce; } ; 65 typedef struct __anonstruct_fr_proto_163 fr_proto; 69 struct __anonstruct_fr_proto_pvc_164 { unsigned int dlci; } ; 69 typedef struct __anonstruct_fr_proto_pvc_164 fr_proto_pvc; 74 struct __anonstruct_fr_proto_pvc_info_165 { unsigned int dlci; char master[16U]; } ; 74 typedef struct __anonstruct_fr_proto_pvc_info_165 fr_proto_pvc_info; 79 struct __anonstruct_cisco_proto_166 { unsigned int interval; unsigned int timeout; } ; 79 typedef struct __anonstruct_cisco_proto_166 cisco_proto; 95 struct ifmap { unsigned long mem_start; unsigned long mem_end; unsigned short base_addr; unsigned char irq; unsigned char dma; unsigned char port; } ; 151 union __anonunion_ifs_ifsu_167 { raw_hdlc_proto *raw_hdlc; cisco_proto *cisco; fr_proto *fr; fr_proto_pvc *fr_pvc; fr_proto_pvc_info *fr_pvc_info; sync_serial_settings *sync; te1_settings *te1; } ; 151 struct if_settings { unsigned int type; unsigned int size; union __anonunion_ifs_ifsu_167 ifs_ifsu; } ; 169 union __anonunion_ifr_ifrn_168 { char ifrn_name[16U]; } ; 169 union __anonunion_ifr_ifru_169 { struct sockaddr ifru_addr; struct sockaddr ifru_dstaddr; struct sockaddr ifru_broadaddr; struct sockaddr ifru_netmask; struct sockaddr ifru_hwaddr; short ifru_flags; int ifru_ivalue; int ifru_mtu; struct ifmap ifru_map; char ifru_slave[16U]; char ifru_newname[16U]; void *ifru_data; struct if_settings ifru_settings; } ; 169 struct ifreq { union __anonunion_ifr_ifrn_168 ifr_ifrn; union __anonunion_ifr_ifru_169 ifr_ifru; } ; 91 struct hlist_bl_node ; 91 struct hlist_bl_head { struct hlist_bl_node *first; } ; 36 struct hlist_bl_node { struct hlist_bl_node *next; struct hlist_bl_node **pprev; } ; 114 struct __anonstruct____missing_field_name_172 { spinlock_t lock; unsigned int count; } ; 114 union __anonunion____missing_field_name_171 { struct __anonstruct____missing_field_name_172 __annonCompField55; } ; 114 struct lockref { union __anonunion____missing_field_name_171 __annonCompField56; } ; 49 struct nameidata ; 50 struct vfsmount ; 51 struct __anonstruct____missing_field_name_174 { u32 hash; u32 len; } ; 51 union __anonunion____missing_field_name_173 { struct __anonstruct____missing_field_name_174 __annonCompField57; u64 hash_len; } ; 51 struct qstr { union __anonunion____missing_field_name_173 __annonCompField58; const unsigned char *name; } ; 90 struct dentry_operations ; 90 union __anonunion_d_u_175 { struct list_head d_child; struct callback_head d_rcu; } ; 90 struct dentry { unsigned int d_flags; seqcount_t d_seq; struct hlist_bl_node d_hash; struct dentry *d_parent; struct qstr d_name; struct inode *d_inode; unsigned char d_iname[32U]; struct lockref d_lockref; const struct dentry_operations *d_op; struct super_block *d_sb; unsigned long d_time; void *d_fsdata; struct list_head d_lru; union __anonunion_d_u_175 d_u; struct list_head d_subdirs; struct hlist_node d_alias; } ; 142 struct dentry_operations { int (*d_revalidate)(struct dentry *, unsigned int); int (*d_weak_revalidate)(struct dentry *, unsigned int); int (*d_hash)(const struct dentry *, struct qstr *); int (*d_compare)(const struct dentry *, const struct dentry *, unsigned int, const char *, const struct qstr *); int (*d_delete)(const struct dentry *); void (*d_release)(struct dentry *); void (*d_prune)(struct dentry *); void (*d_iput)(struct dentry *, struct inode *); char * (*d_dname)(struct dentry *, char *, int); struct vfsmount * (*d_automount)(struct path *); int (*d_manage)(struct dentry *, bool ); } ; 469 struct path { struct vfsmount *mnt; struct dentry *dentry; } ; 26 struct list_lru_node { spinlock_t lock; struct list_head list; long nr_items; } ; 28 struct list_lru { struct list_lru_node *node; nodemask_t active_nodes; } ; 58 struct radix_tree_node ; 58 struct radix_tree_root { unsigned int height; gfp_t gfp_mask; struct radix_tree_node *rnode; } ; 381 enum pid_type { PIDTYPE_PID = 0, PIDTYPE_PGID = 1, PIDTYPE_SID = 2, PIDTYPE_MAX = 3 } ; 388 struct pid_namespace ; 388 struct upid { int nr; struct pid_namespace *ns; struct hlist_node pid_chain; } ; 56 struct pid { atomic_t count; unsigned int level; struct hlist_head tasks[3U]; struct callback_head rcu; struct upid numbers[1U]; } ; 68 struct pid_link { struct hlist_node node; struct pid *pid; } ; 22 struct kernel_cap_struct { __u32 cap[2U]; } ; 25 typedef struct kernel_cap_struct kernel_cap_t; 45 struct fiemap_extent { __u64 fe_logical; __u64 fe_physical; __u64 fe_length; __u64 fe_reserved64[2U]; __u32 fe_flags; __u32 fe_reserved[3U]; } ; 38 enum migrate_mode { MIGRATE_ASYNC = 0, MIGRATE_SYNC_LIGHT = 1, MIGRATE_SYNC = 2 } ; 30 struct block_device ; 31 struct io_context ; 32 struct cgroup_subsys_state ; 56 struct export_operations ; 58 struct kstatfs ; 59 struct swap_info_struct ; 68 struct iattr { unsigned int ia_valid; umode_t ia_mode; kuid_t ia_uid; kgid_t ia_gid; loff_t ia_size; struct timespec ia_atime; struct timespec ia_mtime; struct timespec ia_ctime; struct file *ia_file; } ; 246 struct percpu_counter { raw_spinlock_t lock; s64 count; struct list_head list; s32 *counters; } ; 176 struct fs_disk_quota { __s8 d_version; __s8 d_flags; __u16 d_fieldmask; __u32 d_id; __u64 d_blk_hardlimit; __u64 d_blk_softlimit; __u64 d_ino_hardlimit; __u64 d_ino_softlimit; __u64 d_bcount; __u64 d_icount; __s32 d_itimer; __s32 d_btimer; __u16 d_iwarns; __u16 d_bwarns; __s32 d_padding2; __u64 d_rtb_hardlimit; __u64 d_rtb_softlimit; __u64 d_rtbcount; __s32 d_rtbtimer; __u16 d_rtbwarns; __s16 d_padding3; char d_padding4[8U]; } ; 76 struct fs_qfilestat { __u64 qfs_ino; __u64 qfs_nblks; __u32 qfs_nextents; } ; 151 typedef struct fs_qfilestat fs_qfilestat_t; 152 struct fs_quota_stat { __s8 qs_version; __u16 qs_flags; __s8 qs_pad; fs_qfilestat_t qs_uquota; fs_qfilestat_t qs_gquota; __u32 qs_incoredqs; __s32 qs_btimelimit; __s32 qs_itimelimit; __s32 qs_rtbtimelimit; __u16 qs_bwarnlimit; __u16 qs_iwarnlimit; } ; 166 struct fs_qfilestatv { __u64 qfs_ino; __u64 qfs_nblks; __u32 qfs_nextents; __u32 qfs_pad; } ; 196 struct fs_quota_statv { __s8 qs_version; __u8 qs_pad1; __u16 qs_flags; __u32 qs_incoredqs; struct fs_qfilestatv qs_uquota; struct fs_qfilestatv qs_gquota; struct fs_qfilestatv qs_pquota; __s32 qs_btimelimit; __s32 qs_itimelimit; __s32 qs_rtbtimelimit; __u16 qs_bwarnlimit; __u16 qs_iwarnlimit; __u64 qs_pad2[8U]; } ; 212 struct dquot ; 19 typedef __kernel_uid32_t projid_t; 23 struct __anonstruct_kprojid_t_177 { projid_t val; } ; 23 typedef struct __anonstruct_kprojid_t_177 kprojid_t; 119 struct if_dqinfo { __u64 dqi_bgrace; __u64 dqi_igrace; __u32 dqi_flags; __u32 dqi_valid; } ; 152 enum quota_type { USRQUOTA = 0, GRPQUOTA = 1, PRJQUOTA = 2 } ; 60 typedef long long qsize_t; 61 union __anonunion____missing_field_name_178 { kuid_t uid; kgid_t gid; kprojid_t projid; } ; 61 struct kqid { union __anonunion____missing_field_name_178 __annonCompField59; enum quota_type type; } ; 178 struct mem_dqblk { qsize_t dqb_bhardlimit; qsize_t dqb_bsoftlimit; qsize_t dqb_curspace; qsize_t dqb_rsvspace; qsize_t dqb_ihardlimit; qsize_t dqb_isoftlimit; qsize_t dqb_curinodes; time_t dqb_btime; time_t dqb_itime; } ; 200 struct quota_format_type ; 201 struct mem_dqinfo { struct quota_format_type *dqi_format; int dqi_fmt_id; struct list_head dqi_dirty_list; unsigned long dqi_flags; unsigned int dqi_bgrace; unsigned int dqi_igrace; qsize_t dqi_maxblimit; qsize_t dqi_maxilimit; void *dqi_priv; } ; 264 struct dquot { struct hlist_node dq_hash; struct list_head dq_inuse; struct list_head dq_free; struct list_head dq_dirty; struct mutex dq_lock; atomic_t dq_count; wait_queue_head_t dq_wait_unused; struct super_block *dq_sb; struct kqid dq_id; loff_t dq_off; unsigned long dq_flags; struct mem_dqblk dq_dqb; } ; 291 struct quota_format_ops { int (*check_quota_file)(struct super_block *, int); int (*read_file_info)(struct super_block *, int); int (*write_file_info)(struct super_block *, int); int (*free_file_info)(struct super_block *, int); int (*read_dqblk)(struct dquot *); int (*commit_dqblk)(struct dquot *); int (*release_dqblk)(struct dquot *); } ; 302 struct dquot_operations { int (*write_dquot)(struct dquot *); struct dquot * (*alloc_dquot)(struct super_block *, int); void (*destroy_dquot)(struct dquot *); int (*acquire_dquot)(struct dquot *); int (*release_dquot)(struct dquot *); int (*mark_dirty)(struct dquot *); int (*write_info)(struct super_block *, int); qsize_t * (*get_reserved_space)(struct inode *); } ; 316 struct quotactl_ops { int (*quota_on)(struct super_block *, int, int, struct path *); int (*quota_on_meta)(struct super_block *, int, int); int (*quota_off)(struct super_block *, int); int (*quota_sync)(struct super_block *, int); int (*get_info)(struct super_block *, int, struct if_dqinfo *); int (*set_info)(struct super_block *, int, struct if_dqinfo *); int (*get_dqblk)(struct super_block *, struct kqid , struct fs_disk_quota *); int (*set_dqblk)(struct super_block *, struct kqid , struct fs_disk_quota *); int (*get_xstate)(struct super_block *, struct fs_quota_stat *); int (*set_xstate)(struct super_block *, unsigned int, int); int (*get_xstatev)(struct super_block *, struct fs_quota_statv *); } ; 333 struct quota_format_type { int qf_fmt_id; const struct quota_format_ops *qf_ops; struct module *qf_owner; struct quota_format_type *qf_next; } ; 379 struct quota_info { unsigned int flags; struct mutex dqio_mutex; struct mutex dqonoff_mutex; struct rw_semaphore dqptr_sem; struct inode *files[2U]; struct mem_dqinfo info[2U]; const struct quota_format_ops *ops[2U]; } ; 345 union __anonunion_arg_180 { char *buf; void *data; } ; 345 struct __anonstruct_read_descriptor_t_179 { size_t written; size_t count; union __anonunion_arg_180 arg; int error; } ; 345 typedef struct __anonstruct_read_descriptor_t_179 read_descriptor_t; 348 struct address_space_operations { int (*writepage)(struct page *, struct writeback_control *); int (*readpage)(struct file *, struct page *); int (*writepages)(struct address_space *, struct writeback_control *); int (*set_page_dirty)(struct page *); int (*readpages)(struct file *, struct address_space *, struct list_head *, unsigned int); int (*write_begin)(struct file *, struct address_space *, loff_t , unsigned int, unsigned int, struct page **, void **); int (*write_end)(struct file *, struct address_space *, loff_t , unsigned int, unsigned int, struct page *, void *); sector_t (*bmap)(struct address_space *, sector_t ); void (*invalidatepage)(struct page *, unsigned int, unsigned int); int (*releasepage)(struct page *, gfp_t ); void (*freepage)(struct page *); ssize_t (*direct_IO)(int, struct kiocb *, const struct iovec *, loff_t , unsigned long); int (*get_xip_mem)(struct address_space *, unsigned long, int, void **, unsigned long *); int (*migratepage)(struct address_space *, struct page *, struct page *, enum migrate_mode ); int (*launder_page)(struct page *); int (*is_partially_uptodate)(struct page *, read_descriptor_t *, unsigned long); void (*is_dirty_writeback)(struct page *, bool *, bool *); int (*error_remove_page)(struct address_space *, struct page *); int (*swap_activate)(struct swap_info_struct *, struct file *, sector_t *); void (*swap_deactivate)(struct file *); } ; 408 struct backing_dev_info ; 409 struct address_space { struct inode *host; struct radix_tree_root page_tree; spinlock_t tree_lock; unsigned int i_mmap_writable; struct rb_root i_mmap; struct list_head i_mmap_nonlinear; struct mutex i_mmap_mutex; unsigned long nrpages; unsigned long writeback_index; const struct address_space_operations *a_ops; unsigned long flags; struct backing_dev_info *backing_dev_info; spinlock_t private_lock; struct list_head private_list; void *private_data; } ; 430 struct request_queue ; 431 struct hd_struct ; 431 struct gendisk ; 431 struct block_device { dev_t bd_dev; int bd_openers; struct inode *bd_inode; struct super_block *bd_super; struct mutex bd_mutex; struct list_head bd_inodes; void *bd_claiming; void *bd_holder; int bd_holders; bool bd_write_holder; struct list_head bd_holder_disks; struct block_device *bd_contains; unsigned int bd_block_size; struct hd_struct *bd_part; unsigned int bd_part_count; int bd_invalidated; struct gendisk *bd_disk; struct request_queue *bd_queue; struct list_head bd_list; unsigned long bd_private; int bd_fsfreeze_count; struct mutex bd_fsfreeze_mutex; } ; 503 struct posix_acl ; 504 struct inode_operations ; 504 union __anonunion____missing_field_name_181 { const unsigned int i_nlink; unsigned int __i_nlink; } ; 504 union __anonunion____missing_field_name_182 { struct hlist_head i_dentry; struct callback_head i_rcu; } ; 504 struct file_lock ; 504 struct cdev ; 504 union __anonunion____missing_field_name_183 { struct pipe_inode_info *i_pipe; struct block_device *i_bdev; struct cdev *i_cdev; } ; 504 struct inode { umode_t i_mode; unsigned short i_opflags; kuid_t i_uid; kgid_t i_gid; unsigned int i_flags; struct posix_acl *i_acl; struct posix_acl *i_default_acl; const struct inode_operations *i_op; struct super_block *i_sb; struct address_space *i_mapping; void *i_security; unsigned long i_ino; union __anonunion____missing_field_name_181 __annonCompField60; dev_t i_rdev; loff_t i_size; struct timespec i_atime; struct timespec i_mtime; struct timespec i_ctime; spinlock_t i_lock; unsigned short i_bytes; unsigned int i_blkbits; blkcnt_t i_blocks; unsigned long i_state; struct mutex i_mutex; unsigned long dirtied_when; struct hlist_node i_hash; struct list_head i_wb_list; struct list_head i_lru; struct list_head i_sb_list; union __anonunion____missing_field_name_182 __annonCompField61; u64 i_version; atomic_t i_count; atomic_t i_dio_count; atomic_t i_writecount; const struct file_operations *i_fop; struct file_lock *i_flock; struct address_space i_data; struct dquot *i_dquot[2U]; struct list_head i_devices; union __anonunion____missing_field_name_183 __annonCompField62; __u32 i_generation; __u32 i_fsnotify_mask; struct hlist_head i_fsnotify_marks; atomic_t i_readcount; void *i_private; } ; 740 struct fown_struct { rwlock_t lock; struct pid *pid; enum pid_type pid_type; kuid_t uid; kuid_t euid; int signum; } ; 748 struct file_ra_state { unsigned long start; unsigned int size; unsigned int async_size; unsigned int ra_pages; unsigned int mmap_miss; loff_t prev_pos; } ; 771 union __anonunion_f_u_184 { struct llist_node fu_llist; struct callback_head fu_rcuhead; } ; 771 struct file { union __anonunion_f_u_184 f_u; struct path f_path; struct inode *f_inode; const struct file_operations *f_op; spinlock_t f_lock; atomic_long_t f_count; unsigned int f_flags; fmode_t f_mode; struct mutex f_pos_lock; loff_t f_pos; struct fown_struct f_owner; const struct cred *f_cred; struct file_ra_state f_ra; u64 f_version; void *f_security; void *private_data; struct list_head f_ep_links; struct list_head f_tfile_llink; struct address_space *f_mapping; unsigned long f_mnt_write_state; } ; 909 struct files_struct ; 909 typedef struct files_struct *fl_owner_t; 910 struct file_lock_operations { void (*fl_copy_lock)(struct file_lock *, struct file_lock *); void (*fl_release_private)(struct file_lock *); } ; 915 struct lock_manager_operations { int (*lm_compare_owner)(struct file_lock *, struct file_lock *); unsigned long int (*lm_owner_key)(struct file_lock *); void (*lm_notify)(struct file_lock *); int (*lm_grant)(struct file_lock *, struct file_lock *, int); void (*lm_break)(struct file_lock *); int (*lm_change)(struct file_lock **, int); } ; 933 struct nlm_lockowner ; 934 struct nfs_lock_info { u32 state; struct nlm_lockowner *owner; struct list_head list; } ; 14 struct nfs4_lock_state ; 15 struct nfs4_lock_info { struct nfs4_lock_state *owner; } ; 19 struct __anonstruct_afs_186 { struct list_head link; int state; } ; 19 union __anonunion_fl_u_185 { struct nfs_lock_info nfs_fl; struct nfs4_lock_info nfs4_fl; struct __anonstruct_afs_186 afs; } ; 19 struct file_lock { struct file_lock *fl_next; struct hlist_node fl_link; struct list_head fl_block; fl_owner_t fl_owner; unsigned int fl_flags; unsigned char fl_type; unsigned int fl_pid; int fl_link_cpu; struct pid *fl_nspid; wait_queue_head_t fl_wait; struct file *fl_file; loff_t fl_start; loff_t fl_end; struct fasync_struct *fl_fasync; unsigned long fl_break_time; unsigned long fl_downgrade_time; const struct file_lock_operations *fl_ops; const struct lock_manager_operations *fl_lmops; union __anonunion_fl_u_185 fl_u; } ; 1036 struct fasync_struct { spinlock_t fa_lock; int magic; int fa_fd; struct fasync_struct *fa_next; struct file *fa_file; struct callback_head fa_rcu; } ; 1228 struct sb_writers { struct percpu_counter counter[3U]; wait_queue_head_t wait; int frozen; wait_queue_head_t wait_unfrozen; struct lockdep_map lock_map[3U]; } ; 1244 struct super_operations ; 1244 struct xattr_handler ; 1244 struct mtd_info ; 1244 struct super_block { struct list_head s_list; dev_t s_dev; unsigned char s_blocksize_bits; unsigned long s_blocksize; loff_t s_maxbytes; struct file_system_type *s_type; const struct super_operations *s_op; const struct dquot_operations *dq_op; const struct quotactl_ops *s_qcop; const struct export_operations *s_export_op; unsigned long s_flags; unsigned long s_magic; struct dentry *s_root; struct rw_semaphore s_umount; int s_count; atomic_t s_active; void *s_security; const struct xattr_handler **s_xattr; struct list_head s_inodes; struct hlist_bl_head s_anon; struct list_head s_mounts; struct block_device *s_bdev; struct backing_dev_info *s_bdi; struct mtd_info *s_mtd; struct hlist_node s_instances; struct quota_info s_dquot; struct sb_writers s_writers; char s_id[32U]; u8 s_uuid[16U]; void *s_fs_info; unsigned int s_max_links; fmode_t s_mode; u32 s_time_gran; struct mutex s_vfs_rename_mutex; char *s_subtype; char *s_options; const struct dentry_operations *s_d_op; int cleancache_poolid; struct shrinker s_shrink; atomic_long_t s_remove_count; int s_readonly_remount; struct workqueue_struct *s_dio_done_wq; struct list_lru s_dentry_lru; struct list_lru s_inode_lru; struct callback_head rcu; } ; 1474 struct fiemap_extent_info { unsigned int fi_flags; unsigned int fi_extents_mapped; unsigned int fi_extents_max; struct fiemap_extent *fi_extents_start; } ; 1512 struct dir_context { int (*actor)(void *, const char *, int, loff_t , u64 , unsigned int); loff_t pos; } ; 1517 struct file_operations { struct module *owner; loff_t (*llseek)(struct file *, loff_t , int); ssize_t (*read)(struct file *, char *, size_t , loff_t *); ssize_t (*write)(struct file *, const char *, size_t , loff_t *); ssize_t (*aio_read)(struct kiocb *, const struct iovec *, unsigned long, loff_t ); ssize_t (*aio_write)(struct kiocb *, const struct iovec *, unsigned long, loff_t ); int (*iterate)(struct file *, struct dir_context *); unsigned int (*poll)(struct file *, struct poll_table_struct *); long int (*unlocked_ioctl)(struct file *, unsigned int, unsigned long); long int (*compat_ioctl)(struct file *, unsigned int, unsigned long); int (*mmap)(struct file *, struct vm_area_struct *); int (*open)(struct inode *, struct file *); int (*flush)(struct file *, fl_owner_t ); int (*release)(struct inode *, struct file *); int (*fsync)(struct file *, loff_t , loff_t , int); int (*aio_fsync)(struct kiocb *, int); int (*fasync)(int, struct file *, int); int (*lock)(struct file *, int, struct file_lock *); ssize_t (*sendpage)(struct file *, struct page *, int, size_t , loff_t *, int); unsigned long int (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); int (*check_flags)(int); int (*flock)(struct file *, int, struct file_lock *); ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t , unsigned int); ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t , unsigned int); int (*setlease)(struct file *, long, struct file_lock **); long int (*fallocate)(struct file *, int, loff_t , loff_t ); int (*show_fdinfo)(struct seq_file *, struct file *); } ; 1555 struct inode_operations { struct dentry * (*lookup)(struct inode *, struct dentry *, unsigned int); void * (*follow_link)(struct dentry *, struct nameidata *); int (*permission)(struct inode *, int); struct posix_acl * (*get_acl)(struct inode *, int); int (*readlink)(struct dentry *, char *, int); void (*put_link)(struct dentry *, struct nameidata *, void *); int (*create)(struct inode *, struct dentry *, umode_t , bool ); int (*link)(struct dentry *, struct inode *, struct dentry *); int (*unlink)(struct inode *, struct dentry *); int (*symlink)(struct inode *, struct dentry *, const char *); int (*mkdir)(struct inode *, struct dentry *, umode_t ); int (*rmdir)(struct inode *, struct dentry *); int (*mknod)(struct inode *, struct dentry *, umode_t , dev_t ); int (*rename)(struct inode *, struct dentry *, struct inode *, struct dentry *); int (*setattr)(struct dentry *, struct iattr *); int (*getattr)(struct vfsmount *, struct dentry *, struct kstat *); int (*setxattr)(struct dentry *, const char *, const void *, size_t , int); ssize_t (*getxattr)(struct dentry *, const char *, void *, size_t ); ssize_t (*listxattr)(struct dentry *, char *, size_t ); int (*removexattr)(struct dentry *, const char *); int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 , u64 ); int (*update_time)(struct inode *, struct timespec *, int); int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned int, umode_t , int *); int (*tmpfile)(struct inode *, struct dentry *, umode_t ); int (*set_acl)(struct inode *, struct posix_acl *, int); } ; 1600 struct super_operations { struct inode * (*alloc_inode)(struct super_block *); void (*destroy_inode)(struct inode *); void (*dirty_inode)(struct inode *, int); int (*write_inode)(struct inode *, struct writeback_control *); int (*drop_inode)(struct inode *); void (*evict_inode)(struct inode *); void (*put_super)(struct super_block *); int (*sync_fs)(struct super_block *, int); int (*freeze_fs)(struct super_block *); int (*unfreeze_fs)(struct super_block *); int (*statfs)(struct dentry *, struct kstatfs *); int (*remount_fs)(struct super_block *, int *, char *); void (*umount_begin)(struct super_block *); int (*show_options)(struct seq_file *, struct dentry *); int (*show_devname)(struct seq_file *, struct dentry *); int (*show_path)(struct seq_file *, struct dentry *); int (*show_stats)(struct seq_file *, struct dentry *); ssize_t (*quota_read)(struct super_block *, int, char *, size_t , loff_t ); ssize_t (*quota_write)(struct super_block *, int, const char *, size_t , loff_t ); int (*bdev_try_to_free_page)(struct super_block *, struct page *, gfp_t ); long int (*nr_cached_objects)(struct super_block *, int); long int (*free_cached_objects)(struct super_block *, long, int); } ; 1814 struct file_system_type { const char *name; int fs_flags; struct dentry * (*mount)(struct file_system_type *, int, const char *, void *); void (*kill_sb)(struct super_block *); struct module *owner; struct file_system_type *next; struct hlist_head fs_supers; struct lock_class_key s_lock_key; struct lock_class_key s_umount_key; struct lock_class_key s_vfs_rename_key; struct lock_class_key s_writers_key[3U]; struct lock_class_key i_lock_key; struct lock_class_key i_mutex_key; struct lock_class_key i_mutex_dir_key; } ; 4 typedef unsigned long cputime_t; 24 struct __anonstruct_sigset_t_187 { unsigned long sig[1U]; } ; 24 typedef struct __anonstruct_sigset_t_187 sigset_t; 25 struct siginfo ; 17 typedef void __signalfn_t(int); 18 typedef __signalfn_t *__sighandler_t; 20 typedef void __restorefn_t(); 21 typedef __restorefn_t *__sigrestore_t; 34 union sigval { int sival_int; void *sival_ptr; } ; 10 typedef union sigval sigval_t; 11 struct __anonstruct__kill_189 { __kernel_pid_t _pid; __kernel_uid32_t _uid; } ; 11 struct __anonstruct__timer_190 { __kernel_timer_t _tid; int _overrun; char _pad[0U]; sigval_t _sigval; int _sys_private; } ; 11 struct __anonstruct__rt_191 { __kernel_pid_t _pid; __kernel_uid32_t _uid; sigval_t _sigval; } ; 11 struct __anonstruct__sigchld_192 { __kernel_pid_t _pid; __kernel_uid32_t _uid; int _status; __kernel_clock_t _utime; __kernel_clock_t _stime; } ; 11 struct __anonstruct__sigfault_193 { void *_addr; short _addr_lsb; } ; 11 struct __anonstruct__sigpoll_194 { long _band; int _fd; } ; 11 struct __anonstruct__sigsys_195 { void *_call_addr; int _syscall; unsigned int _arch; } ; 11 union __anonunion__sifields_188 { int _pad[28U]; struct __anonstruct__kill_189 _kill; struct __anonstruct__timer_190 _timer; struct __anonstruct__rt_191 _rt; struct __anonstruct__sigchld_192 _sigchld; struct __anonstruct__sigfault_193 _sigfault; struct __anonstruct__sigpoll_194 _sigpoll; struct __anonstruct__sigsys_195 _sigsys; } ; 11 struct siginfo { int si_signo; int si_errno; int si_code; union __anonunion__sifields_188 _sifields; } ; 109 typedef struct siginfo siginfo_t; 21 struct sigpending { struct list_head list; sigset_t signal; } ; 251 struct sigaction { __sighandler_t sa_handler; unsigned long sa_flags; __sigrestore_t sa_restorer; sigset_t sa_mask; } ; 265 struct k_sigaction { struct sigaction sa; } ; 46 struct seccomp_filter ; 47 struct seccomp { int mode; struct seccomp_filter *filter; } ; 40 struct rt_mutex_waiter ; 41 struct rlimit { __kernel_ulong_t rlim_cur; __kernel_ulong_t rlim_max; } ; 11 struct task_io_accounting { u64 rchar; u64 wchar; u64 syscr; u64 syscw; u64 read_bytes; u64 write_bytes; u64 cancelled_write_bytes; } ; 45 struct latency_record { unsigned long backtrace[12U]; unsigned int count; unsigned long time; unsigned long max; } ; 835 struct nsproxy ; 836 struct ctl_table_root ; 837 struct ctl_table_header ; 838 struct ctl_dir ; 39 typedef int proc_handler(struct ctl_table *, int, void *, size_t *, loff_t *); 59 struct ctl_table_poll { atomic_t event; wait_queue_head_t wait; } ; 98 struct ctl_table { const char *procname; void *data; int maxlen; umode_t mode; struct ctl_table *child; proc_handler *proc_handler; struct ctl_table_poll *poll; void *extra1; void *extra2; } ; 119 struct ctl_node { struct rb_node node; struct ctl_table_header *header; } ; 124 struct __anonstruct____missing_field_name_199 { struct ctl_table *ctl_table; int used; int count; int nreg; } ; 124 union __anonunion____missing_field_name_198 { struct __anonstruct____missing_field_name_199 __annonCompField63; struct callback_head rcu; } ; 124 struct ctl_table_set ; 124 struct ctl_table_header { union __anonunion____missing_field_name_198 __annonCompField64; struct completion *unregistering; struct ctl_table *ctl_table_arg; struct ctl_table_root *root; struct ctl_table_set *set; struct ctl_dir *parent; struct ctl_node *node; } ; 145 struct ctl_dir { struct ctl_table_header header; struct rb_root root; } ; 151 struct ctl_table_set { int (*is_seen)(struct ctl_table_set *); struct ctl_dir dir; } ; 156 struct ctl_table_root { struct ctl_table_set default_set; struct ctl_table_set * (*lookup)(struct ctl_table_root *, struct nsproxy *); int (*permissions)(struct ctl_table_header *, struct ctl_table *); } ; 193 struct assoc_array_ptr ; 193 struct assoc_array { struct assoc_array_ptr *root; unsigned long nr_leaves_on_tree; } ; 31 typedef int32_t key_serial_t; 34 typedef uint32_t key_perm_t; 35 struct key ; 36 struct signal_struct ; 37 struct key_type ; 41 struct keyring_index_key { struct key_type *type; const char *description; size_t desc_len; } ; 123 union __anonunion____missing_field_name_200 { struct list_head graveyard_link; struct rb_node serial_node; } ; 123 struct key_user ; 123 union __anonunion____missing_field_name_201 { time_t expiry; time_t revoked_at; } ; 123 struct __anonstruct____missing_field_name_203 { struct key_type *type; char *description; } ; 123 union __anonunion____missing_field_name_202 { struct keyring_index_key index_key; struct __anonstruct____missing_field_name_203 __annonCompField67; } ; 123 union __anonunion_type_data_204 { struct list_head link; unsigned long x[2U]; void *p[2U]; int reject_error; } ; 123 union __anonunion_payload_206 { unsigned long value; void *rcudata; void *data; void *data2[2U]; } ; 123 union __anonunion____missing_field_name_205 { union __anonunion_payload_206 payload; struct assoc_array keys; } ; 123 struct key { atomic_t usage; key_serial_t serial; union __anonunion____missing_field_name_200 __annonCompField65; struct rw_semaphore sem; struct key_user *user; void *security; union __anonunion____missing_field_name_201 __annonCompField66; time_t last_used_at; kuid_t uid; kgid_t gid; key_perm_t perm; unsigned short quotalen; unsigned short datalen; unsigned long flags; union __anonunion____missing_field_name_202 __annonCompField68; union __anonunion_type_data_204 type_data; union __anonunion____missing_field_name_205 __annonCompField69; } ; 345 struct audit_context ; 27 struct group_info { atomic_t usage; int ngroups; int nblocks; kgid_t small_block[32U]; kgid_t *blocks[0U]; } ; 78 struct cred { atomic_t usage; atomic_t subscribers; void *put_addr; unsigned int magic; kuid_t uid; kgid_t gid; kuid_t suid; kgid_t sgid; kuid_t euid; kgid_t egid; kuid_t fsuid; kgid_t fsgid; unsigned int securebits; kernel_cap_t cap_inheritable; kernel_cap_t cap_permitted; kernel_cap_t cap_effective; kernel_cap_t cap_bset; unsigned char jit_keyring; struct key *session_keyring; struct key *process_keyring; struct key *thread_keyring; struct key *request_key_auth; void *security; struct user_struct *user; struct user_namespace *user_ns; struct group_info *group_info; struct callback_head rcu; } ; 123 struct futex_pi_state ; 124 struct robust_list_head ; 125 struct bio_list ; 126 struct fs_struct ; 127 struct perf_event_context ; 128 struct blk_plug ; 180 struct cfs_rq ; 181 struct task_group ; 421 struct sighand_struct { atomic_t count; struct k_sigaction action[64U]; spinlock_t siglock; wait_queue_head_t signalfd_wqh; } ; 460 struct pacct_struct { int ac_flag; long ac_exitcode; unsigned long ac_mem; cputime_t ac_utime; cputime_t ac_stime; unsigned long ac_minflt; unsigned long ac_majflt; } ; 468 struct cpu_itimer { cputime_t expires; cputime_t incr; u32 error; u32 incr_error; } ; 475 struct cputime { cputime_t utime; cputime_t stime; } ; 487 struct task_cputime { cputime_t utime; cputime_t stime; unsigned long long sum_exec_runtime; } ; 507 struct thread_group_cputimer { struct task_cputime cputime; int running; raw_spinlock_t lock; } ; 549 struct autogroup ; 550 struct tty_struct ; 550 struct taskstats ; 550 struct tty_audit_buf ; 550 struct signal_struct { atomic_t sigcnt; atomic_t live; int nr_threads; struct list_head thread_head; wait_queue_head_t wait_chldexit; struct task_struct *curr_target; struct sigpending shared_pending; int group_exit_code; int notify_count; struct task_struct *group_exit_task; int group_stop_count; unsigned int flags; unsigned char is_child_subreaper; unsigned char has_child_subreaper; int posix_timer_id; struct list_head posix_timers; struct hrtimer real_timer; struct pid *leader_pid; ktime_t it_real_incr; struct cpu_itimer it[2U]; struct thread_group_cputimer cputimer; struct task_cputime cputime_expires; struct list_head cpu_timers[3U]; struct pid *tty_old_pgrp; int leader; struct tty_struct *tty; struct autogroup *autogroup; cputime_t utime; cputime_t stime; cputime_t cutime; cputime_t cstime; cputime_t gtime; cputime_t cgtime; struct cputime prev_cputime; unsigned long nvcsw; unsigned long nivcsw; unsigned long cnvcsw; unsigned long cnivcsw; unsigned long min_flt; unsigned long maj_flt; unsigned long cmin_flt; unsigned long cmaj_flt; unsigned long inblock; unsigned long oublock; unsigned long cinblock; unsigned long coublock; unsigned long maxrss; unsigned long cmaxrss; struct task_io_accounting ioac; unsigned long long sum_sched_runtime; struct rlimit rlim[16U]; struct pacct_struct pacct; struct taskstats *stats; unsigned int audit_tty; unsigned int audit_tty_log_passwd; struct tty_audit_buf *tty_audit_buf; struct rw_semaphore group_rwsem; oom_flags_t oom_flags; short oom_score_adj; short oom_score_adj_min; struct mutex cred_guard_mutex; } ; 730 struct user_struct { atomic_t __count; atomic_t processes; atomic_t files; atomic_t sigpending; atomic_t inotify_watches; atomic_t inotify_devs; atomic_t fanotify_listeners; atomic_long_t epoll_watches; unsigned long mq_bytes; unsigned long locked_shm; struct key *uid_keyring; struct key *session_keyring; struct hlist_node uidhash_node; kuid_t uid; atomic_long_t locked_vm; } ; 774 struct reclaim_state ; 775 struct sched_info { unsigned long pcount; unsigned long long run_delay; unsigned long long last_arrival; unsigned long long last_queued; } ; 790 struct task_delay_info { spinlock_t lock; unsigned int flags; struct timespec blkio_start; struct timespec blkio_end; u64 blkio_delay; u64 swapin_delay; u32 blkio_count; u32 swapin_count; struct timespec freepages_start; struct timespec freepages_end; u64 freepages_delay; u32 freepages_count; } ; 1004 struct uts_namespace ; 1005 struct load_weight { unsigned long weight; u32 inv_weight; } ; 1013 struct sched_avg { u32 runnable_avg_sum; u32 runnable_avg_period; u64 last_runnable_update; s64 decay_count; unsigned long load_avg_contrib; } ; 1025 struct sched_statistics { u64 wait_start; u64 wait_max; u64 wait_count; u64 wait_sum; u64 iowait_count; u64 iowait_sum; u64 sleep_start; u64 sleep_max; s64 sum_sleep_runtime; u64 block_start; u64 block_max; u64 exec_max; u64 slice_max; u64 nr_migrations_cold; u64 nr_failed_migrations_affine; u64 nr_failed_migrations_running; u64 nr_failed_migrations_hot; u64 nr_forced_migrations; u64 nr_wakeups; u64 nr_wakeups_sync; u64 nr_wakeups_migrate; u64 nr_wakeups_local; u64 nr_wakeups_remote; u64 nr_wakeups_affine; u64 nr_wakeups_affine_attempts; u64 nr_wakeups_passive; u64 nr_wakeups_idle; } ; 1060 struct sched_entity { struct load_weight load; struct rb_node run_node; struct list_head group_node; unsigned int on_rq; u64 exec_start; u64 sum_exec_runtime; u64 vruntime; u64 prev_sum_exec_runtime; u64 nr_migrations; struct sched_statistics statistics; struct sched_entity *parent; struct cfs_rq *cfs_rq; struct cfs_rq *my_q; struct sched_avg avg; } ; 1091 struct rt_rq ; 1091 struct sched_rt_entity { struct list_head run_list; unsigned long timeout; unsigned long watchdog_stamp; unsigned int time_slice; struct sched_rt_entity *back; struct sched_rt_entity *parent; struct rt_rq *rt_rq; struct rt_rq *my_q; } ; 1107 struct sched_dl_entity { struct rb_node rb_node; u64 dl_runtime; u64 dl_deadline; u64 dl_period; u64 dl_bw; s64 runtime; u64 deadline; unsigned int flags; int dl_throttled; int dl_new; int dl_boosted; struct hrtimer dl_timer; } ; 1162 struct memcg_batch_info { int do_batch; struct mem_cgroup *memcg; unsigned long nr_pages; unsigned long memsw_nr_pages; } ; 1569 struct memcg_oom_info { struct mem_cgroup *memcg; gfp_t gfp_mask; int order; unsigned char may_oom; } ; 1576 struct sched_class ; 1576 struct css_set ; 1576 struct compat_robust_list_head ; 1576 struct numa_group ; 1576 struct task_struct { volatile long state; void *stack; atomic_t usage; unsigned int flags; unsigned int ptrace; struct llist_node wake_entry; int on_cpu; struct task_struct *last_wakee; unsigned long wakee_flips; unsigned long wakee_flip_decay_ts; int wake_cpu; int on_rq; int prio; int static_prio; int normal_prio; unsigned int rt_priority; const struct sched_class *sched_class; struct sched_entity se; struct sched_rt_entity rt; struct task_group *sched_task_group; struct sched_dl_entity dl; struct hlist_head preempt_notifiers; unsigned int policy; int nr_cpus_allowed; cpumask_t cpus_allowed; struct sched_info sched_info; struct list_head tasks; struct plist_node pushable_tasks; struct rb_node pushable_dl_tasks; struct mm_struct *mm; struct mm_struct *active_mm; unsigned char brk_randomized; struct task_rss_stat rss_stat; int exit_state; int exit_code; int exit_signal; int pdeath_signal; unsigned int jobctl; unsigned int personality; unsigned char in_execve; unsigned char in_iowait; unsigned char no_new_privs; unsigned char sched_reset_on_fork; unsigned char sched_contributes_to_load; pid_t pid; pid_t tgid; struct task_struct *real_parent; struct task_struct *parent; struct list_head children; struct list_head sibling; struct task_struct *group_leader; struct list_head ptraced; struct list_head ptrace_entry; struct pid_link pids[3U]; struct list_head thread_group; struct list_head thread_node; struct completion *vfork_done; int *set_child_tid; int *clear_child_tid; cputime_t utime; cputime_t stime; cputime_t utimescaled; cputime_t stimescaled; cputime_t gtime; struct cputime prev_cputime; unsigned long nvcsw; unsigned long nivcsw; struct timespec start_time; struct timespec real_start_time; unsigned long min_flt; unsigned long maj_flt; struct task_cputime cputime_expires; struct list_head cpu_timers[3U]; const struct cred *real_cred; const struct cred *cred; char comm[16U]; int link_count; int total_link_count; struct sysv_sem sysvsem; unsigned long last_switch_count; struct thread_struct thread; struct fs_struct *fs; struct files_struct *files; struct nsproxy *nsproxy; struct signal_struct *signal; struct sighand_struct *sighand; sigset_t blocked; sigset_t real_blocked; sigset_t saved_sigmask; struct sigpending pending; unsigned long sas_ss_sp; size_t sas_ss_size; int (*notifier)(void *); void *notifier_data; sigset_t *notifier_mask; struct callback_head *task_works; struct audit_context *audit_context; kuid_t loginuid; unsigned int sessionid; struct seccomp seccomp; u32 parent_exec_id; u32 self_exec_id; spinlock_t alloc_lock; raw_spinlock_t pi_lock; struct rb_root pi_waiters; struct rb_node *pi_waiters_leftmost; struct rt_mutex_waiter *pi_blocked_on; struct task_struct *pi_top_task; struct mutex_waiter *blocked_on; unsigned int irq_events; unsigned long hardirq_enable_ip; unsigned long hardirq_disable_ip; unsigned int hardirq_enable_event; unsigned int hardirq_disable_event; int hardirqs_enabled; int hardirq_context; unsigned long softirq_disable_ip; unsigned long softirq_enable_ip; unsigned int softirq_disable_event; unsigned int softirq_enable_event; int softirqs_enabled; int softirq_context; u64 curr_chain_key; int lockdep_depth; unsigned int lockdep_recursion; struct held_lock held_locks[48U]; gfp_t lockdep_reclaim_gfp; void *journal_info; struct bio_list *bio_list; struct blk_plug *plug; struct reclaim_state *reclaim_state; struct backing_dev_info *backing_dev_info; struct io_context *io_context; unsigned long ptrace_message; siginfo_t *last_siginfo; struct task_io_accounting ioac; u64 acct_rss_mem1; u64 acct_vm_mem1; cputime_t acct_timexpd; nodemask_t mems_allowed; seqcount_t mems_allowed_seq; int cpuset_mem_spread_rotor; int cpuset_slab_spread_rotor; struct css_set *cgroups; struct list_head cg_list; struct robust_list_head *robust_list; struct compat_robust_list_head *compat_robust_list; struct list_head pi_state_list; struct futex_pi_state *pi_state_cache; struct perf_event_context *perf_event_ctxp[2U]; struct mutex perf_event_mutex; struct list_head perf_event_list; struct mempolicy *mempolicy; short il_next; short pref_node_fork; int numa_scan_seq; unsigned int numa_scan_period; unsigned int numa_scan_period_max; int numa_preferred_nid; int numa_migrate_deferred; unsigned long numa_migrate_retry; u64 node_stamp; struct callback_head numa_work; struct list_head numa_entry; struct numa_group *numa_group; unsigned long *numa_faults; unsigned long total_numa_faults; unsigned long *numa_faults_buffer; unsigned long numa_faults_locality[2U]; unsigned long numa_pages_migrated; struct callback_head rcu; struct pipe_inode_info *splice_pipe; struct page_frag task_frag; struct task_delay_info *delays; int make_it_fail; int nr_dirtied; int nr_dirtied_pause; unsigned long dirty_paused_when; int latency_record_count; struct latency_record latency_record[32U]; unsigned long timer_slack_ns; unsigned long default_timer_slack_ns; unsigned long trace; unsigned long trace_recursion; struct memcg_batch_info memcg_batch; unsigned int memcg_kmem_skip_account; struct memcg_oom_info memcg_oom; struct uprobe_task *utask; unsigned int sequential_io; unsigned int sequential_io_avg; } ; 39 typedef s32 compat_long_t; 44 typedef u32 compat_uptr_t; 273 struct compat_robust_list { compat_uptr_t next; } ; 277 struct compat_robust_list_head { struct compat_robust_list list; compat_long_t futex_offset; compat_uptr_t list_op_pending; } ; 685 struct ethhdr { unsigned char h_dest[6U]; unsigned char h_source[6U]; __be16 h_proto; } ; 34 struct ethtool_cmd { __u32 cmd; __u32 supported; __u32 advertising; __u16 speed; __u8 duplex; __u8 port; __u8 phy_address; __u8 transceiver; __u8 autoneg; __u8 mdio_support; __u32 maxtxpkt; __u32 maxrxpkt; __u16 speed_hi; __u8 eth_tp_mdix; __u8 eth_tp_mdix_ctrl; __u32 lp_advertising; __u32 reserved[2U]; } ; 65 struct ethtool_drvinfo { __u32 cmd; char driver[32U]; char version[32U]; char fw_version[32U]; char bus_info[32U]; char reserved1[32U]; char reserved2[12U]; __u32 n_priv_flags; __u32 n_stats; __u32 testinfo_len; __u32 eedump_len; __u32 regdump_len; } ; 105 struct ethtool_wolinfo { __u32 cmd; __u32 supported; __u32 wolopts; __u8 sopass[6U]; } ; 120 struct ethtool_regs { __u32 cmd; __u32 version; __u32 len; __u8 data[0U]; } ; 128 struct ethtool_eeprom { __u32 cmd; __u32 magic; __u32 offset; __u32 len; __u8 data[0U]; } ; 137 struct ethtool_eee { __u32 cmd; __u32 supported; __u32 advertised; __u32 lp_advertised; __u32 eee_active; __u32 eee_enabled; __u32 tx_lpi_enabled; __u32 tx_lpi_timer; __u32 reserved[2U]; } ; 166 struct ethtool_modinfo { __u32 cmd; __u32 type; __u32 eeprom_len; __u32 reserved[8U]; } ; 183 struct ethtool_coalesce { __u32 cmd; __u32 rx_coalesce_usecs; __u32 rx_max_coalesced_frames; __u32 rx_coalesce_usecs_irq; __u32 rx_max_coalesced_frames_irq; __u32 tx_coalesce_usecs; __u32 tx_max_coalesced_frames; __u32 tx_coalesce_usecs_irq; __u32 tx_max_coalesced_frames_irq; __u32 stats_block_coalesce_usecs; __u32 use_adaptive_rx_coalesce; __u32 use_adaptive_tx_coalesce; __u32 pkt_rate_low; __u32 rx_coalesce_usecs_low; __u32 rx_max_coalesced_frames_low; __u32 tx_coalesce_usecs_low; __u32 tx_max_coalesced_frames_low; __u32 pkt_rate_high; __u32 rx_coalesce_usecs_high; __u32 rx_max_coalesced_frames_high; __u32 tx_coalesce_usecs_high; __u32 tx_max_coalesced_frames_high; __u32 rate_sample_interval; } ; 281 struct ethtool_ringparam { __u32 cmd; __u32 rx_max_pending; __u32 rx_mini_max_pending; __u32 rx_jumbo_max_pending; __u32 tx_max_pending; __u32 rx_pending; __u32 rx_mini_pending; __u32 rx_jumbo_pending; __u32 tx_pending; } ; 303 struct ethtool_channels { __u32 cmd; __u32 max_rx; __u32 max_tx; __u32 max_other; __u32 max_combined; __u32 rx_count; __u32 tx_count; __u32 other_count; __u32 combined_count; } ; 331 struct ethtool_pauseparam { __u32 cmd; __u32 autoneg; __u32 rx_pause; __u32 tx_pause; } ; 382 struct ethtool_test { __u32 cmd; __u32 flags; __u32 reserved; __u32 len; __u64 data[0U]; } ; 404 struct ethtool_stats { __u32 cmd; __u32 n_stats; __u64 data[0U]; } ; 425 struct ethtool_tcpip4_spec { __be32 ip4src; __be32 ip4dst; __be16 psrc; __be16 pdst; __u8 tos; } ; 458 struct ethtool_ah_espip4_spec { __be32 ip4src; __be32 ip4dst; __be32 spi; __u8 tos; } ; 474 struct ethtool_usrip4_spec { __be32 ip4src; __be32 ip4dst; __be32 l4_4_bytes; __u8 tos; __u8 ip_ver; __u8 proto; } ; 494 union ethtool_flow_union { struct ethtool_tcpip4_spec tcp_ip4_spec; struct ethtool_tcpip4_spec udp_ip4_spec; struct ethtool_tcpip4_spec sctp_ip4_spec; struct ethtool_ah_espip4_spec ah_ip4_spec; struct ethtool_ah_espip4_spec esp_ip4_spec; struct ethtool_usrip4_spec usr_ip4_spec; struct ethhdr ether_spec; __u8 hdata[52U]; } ; 505 struct ethtool_flow_ext { __u8 padding[2U]; unsigned char h_dest[6U]; __be16 vlan_etype; __be16 vlan_tci; __be32 data[2U]; } ; 524 struct ethtool_rx_flow_spec { __u32 flow_type; union ethtool_flow_union h_u; struct ethtool_flow_ext h_ext; union ethtool_flow_union m_u; struct ethtool_flow_ext m_ext; __u64 ring_cookie; __u32 location; } ; 550 struct ethtool_rxnfc { __u32 cmd; __u32 flow_type; __u64 data; struct ethtool_rx_flow_spec fs; __u32 rule_cnt; __u32 rule_locs[0U]; } ; 684 struct ethtool_flash { __u32 cmd; __u32 region; char data[128U]; } ; 692 struct ethtool_dump { __u32 cmd; __u32 version; __u32 flag; __u32 len; __u8 data[0U]; } ; 768 struct ethtool_ts_info { __u32 cmd; __u32 so_timestamping; __s32 phc_index; __u32 tx_types; __u32 tx_reserved[3U]; __u32 rx_filters; __u32 rx_reserved[3U]; } ; 44 enum ethtool_phys_id_state { ETHTOOL_ID_INACTIVE = 0, ETHTOOL_ID_ACTIVE = 1, ETHTOOL_ID_ON = 2, ETHTOOL_ID_OFF = 3 } ; 79 struct ethtool_ops { int (*get_settings)(struct net_device *, struct ethtool_cmd *); int (*set_settings)(struct net_device *, struct ethtool_cmd *); void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *); int (*get_regs_len)(struct net_device *); void (*get_regs)(struct net_device *, struct ethtool_regs *, void *); void (*get_wol)(struct net_device *, struct ethtool_wolinfo *); int (*set_wol)(struct net_device *, struct ethtool_wolinfo *); u32 (*get_msglevel)(struct net_device *); void (*set_msglevel)(struct net_device *, u32 ); int (*nway_reset)(struct net_device *); u32 (*get_link)(struct net_device *); int (*get_eeprom_len)(struct net_device *); int (*get_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); int (*set_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); int (*get_coalesce)(struct net_device *, struct ethtool_coalesce *); int (*set_coalesce)(struct net_device *, struct ethtool_coalesce *); void (*get_ringparam)(struct net_device *, struct ethtool_ringparam *); int (*set_ringparam)(struct net_device *, struct ethtool_ringparam *); void (*get_pauseparam)(struct net_device *, struct ethtool_pauseparam *); int (*set_pauseparam)(struct net_device *, struct ethtool_pauseparam *); void (*self_test)(struct net_device *, struct ethtool_test *, u64 *); void (*get_strings)(struct net_device *, u32 , u8 *); int (*set_phys_id)(struct net_device *, enum ethtool_phys_id_state ); void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, u64 *); int (*begin)(struct net_device *); void (*complete)(struct net_device *); u32 (*get_priv_flags)(struct net_device *); int (*set_priv_flags)(struct net_device *, u32 ); int (*get_sset_count)(struct net_device *, int); int (*get_rxnfc)(struct net_device *, struct ethtool_rxnfc *, u32 *); int (*set_rxnfc)(struct net_device *, struct ethtool_rxnfc *); int (*flash_device)(struct net_device *, struct ethtool_flash *); int (*reset)(struct net_device *, u32 *); u32 (*get_rxfh_indir_size)(struct net_device *); int (*get_rxfh_indir)(struct net_device *, u32 *); int (*set_rxfh_indir)(struct net_device *, const u32 *); void (*get_channels)(struct net_device *, struct ethtool_channels *); int (*set_channels)(struct net_device *, struct ethtool_channels *); int (*get_dump_flag)(struct net_device *, struct ethtool_dump *); int (*get_dump_data)(struct net_device *, struct ethtool_dump *, void *); int (*set_dump)(struct net_device *, struct ethtool_dump *); int (*get_ts_info)(struct net_device *, struct ethtool_ts_info *); int (*get_module_info)(struct net_device *, struct ethtool_modinfo *); int (*get_module_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); int (*get_eee)(struct net_device *, struct ethtool_eee *); int (*set_eee)(struct net_device *, struct ethtool_eee *); } ; 249 struct prot_inuse ; 250 struct netns_core { struct ctl_table_header *sysctl_hdr; int sysctl_somaxconn; struct prot_inuse *inuse; } ; 38 struct u64_stats_sync { } ; 145 struct ipstats_mib { u64 mibs[36U]; struct u64_stats_sync syncp; } ; 61 struct icmp_mib { unsigned long mibs[28U]; } ; 67 struct icmpmsg_mib { atomic_long_t mibs[512U]; } ; 72 struct icmpv6_mib { unsigned long mibs[6U]; } ; 83 struct icmpv6msg_mib { atomic_long_t mibs[512U]; } ; 93 struct tcp_mib { unsigned long mibs[16U]; } ; 100 struct udp_mib { unsigned long mibs[8U]; } ; 106 struct linux_mib { unsigned long mibs[97U]; } ; 112 struct linux_xfrm_mib { unsigned long mibs[29U]; } ; 118 struct proc_dir_entry ; 118 struct netns_mib { struct tcp_mib *tcp_statistics[1U]; struct ipstats_mib *ip_statistics[1U]; struct linux_mib *net_statistics[1U]; struct udp_mib *udp_statistics[1U]; struct udp_mib *udplite_statistics[1U]; struct icmp_mib *icmp_statistics[1U]; struct icmpmsg_mib *icmpmsg_statistics; struct proc_dir_entry *proc_net_devsnmp6; struct udp_mib *udp_stats_in6[1U]; struct udp_mib *udplite_stats_in6[1U]; struct ipstats_mib *ipv6_statistics[1U]; struct icmpv6_mib *icmpv6_statistics[1U]; struct icmpv6msg_mib *icmpv6msg_statistics; struct linux_xfrm_mib *xfrm_statistics[1U]; } ; 26 struct netns_unix { int sysctl_max_dgram_qlen; struct ctl_table_header *ctl; } ; 12 struct netns_packet { struct mutex sklist_lock; struct hlist_head sklist; } ; 14 struct netns_frags { int nqueues; struct list_head lru_list; spinlock_t lru_lock; struct percpu_counter mem; int timeout; int high_thresh; int low_thresh; } ; 180 struct tcpm_hash_bucket ; 181 struct ipv4_devconf ; 182 struct fib_rules_ops ; 183 struct fib_table ; 184 struct local_ports { seqlock_t lock; int range[2U]; } ; 22 struct inet_peer_base ; 22 struct xt_table ; 22 struct netns_ipv4 { struct ctl_table_header *forw_hdr; struct ctl_table_header *frags_hdr; struct ctl_table_header *ipv4_hdr; struct ctl_table_header *route_hdr; struct ctl_table_header *xfrm4_hdr; struct ipv4_devconf *devconf_all; struct ipv4_devconf *devconf_dflt; struct fib_rules_ops *rules_ops; bool fib_has_custom_rules; struct fib_table *fib_local; struct fib_table *fib_main; struct fib_table *fib_default; int fib_num_tclassid_users; struct hlist_head *fib_table_hash; struct sock *fibnl; struct sock **icmp_sk; struct inet_peer_base *peers; struct tcpm_hash_bucket *tcp_metrics_hash; unsigned int tcp_metrics_hash_log; struct netns_frags frags; struct xt_table *iptable_filter; struct xt_table *iptable_mangle; struct xt_table *iptable_raw; struct xt_table *arptable_filter; struct xt_table *iptable_security; struct xt_table *nat_table; int sysctl_icmp_echo_ignore_all; int sysctl_icmp_echo_ignore_broadcasts; int sysctl_icmp_ignore_bogus_error_responses; int sysctl_icmp_ratelimit; int sysctl_icmp_ratemask; int sysctl_icmp_errors_use_inbound_ifaddr; struct local_ports sysctl_local_ports; int sysctl_tcp_ecn; int sysctl_ip_no_pmtu_disc; int sysctl_ip_fwd_use_pmtu; kgid_t sysctl_ping_group_range[2U]; atomic_t dev_addr_genid; struct list_head mr_tables; struct fib_rules_ops *mr_rules_ops; atomic_t rt_genid; } ; 90 struct neighbour ; 90 struct dst_ops { unsigned short family; __be16 protocol; unsigned int gc_thresh; int (*gc)(struct dst_ops *); struct dst_entry * (*check)(struct dst_entry *, __u32 ); unsigned int (*default_advmss)(const struct dst_entry *); unsigned int (*mtu)(const struct dst_entry *); u32 * (*cow_metrics)(struct dst_entry *, unsigned long); void (*destroy)(struct dst_entry *); void (*ifdown)(struct dst_entry *, struct net_device *, int); struct dst_entry * (*negative_advice)(struct dst_entry *); void (*link_failure)(struct sk_buff *); void (*update_pmtu)(struct dst_entry *, struct sock *, struct sk_buff *, u32 ); void (*redirect)(struct dst_entry *, struct sock *, struct sk_buff *); int (*local_out)(struct sk_buff *); struct neighbour * (*neigh_lookup)(const struct dst_entry *, struct sk_buff *, const void *); struct kmem_cache *kmem_cachep; struct percpu_counter pcpuc_entries; } ; 73 struct netns_sysctl_ipv6 { struct ctl_table_header *hdr; struct ctl_table_header *route_hdr; struct ctl_table_header *icmp_hdr; struct ctl_table_header *frags_hdr; struct ctl_table_header *xfrm6_hdr; int bindv6only; int flush_delay; int ip6_rt_max_size; int ip6_rt_gc_min_interval; int ip6_rt_gc_timeout; int ip6_rt_gc_interval; int ip6_rt_gc_elasticity; int ip6_rt_mtu_expires; int ip6_rt_min_advmss; int flowlabel_consistency; int icmpv6_time; int anycast_src_echo_reply; } ; 34 struct ipv6_devconf ; 34 struct rt6_info ; 34 struct rt6_statistics ; 34 struct fib6_table ; 34 struct netns_ipv6 { struct netns_sysctl_ipv6 sysctl; struct ipv6_devconf *devconf_all; struct ipv6_devconf *devconf_dflt; struct inet_peer_base *peers; struct netns_frags frags; struct xt_table *ip6table_filter; struct xt_table *ip6table_mangle; struct xt_table *ip6table_raw; struct xt_table *ip6table_security; struct xt_table *ip6table_nat; struct rt6_info *ip6_null_entry; struct rt6_statistics *rt6_stats; struct timer_list ip6_fib_timer; struct hlist_head *fib_table_hash; struct fib6_table *fib6_main_tbl; struct dst_ops ip6_dst_ops; unsigned int ip6_rt_gc_expire; unsigned long ip6_rt_last_gc; struct rt6_info *ip6_prohibit_entry; struct rt6_info *ip6_blk_hole_entry; struct fib6_table *fib6_local_tbl; struct fib_rules_ops *fib6_rules_ops; struct sock **icmp_sk; struct sock *ndisc_sk; struct sock *tcp_sk; struct sock *igmp_sk; struct list_head mr6_tables; struct fib_rules_ops *mr6_rules_ops; atomic_t dev_addr_genid; atomic_t rt_genid; } ; 79 struct netns_nf_frag { struct netns_sysctl_ipv6 sysctl; struct netns_frags frags; } ; 85 struct sctp_mib ; 86 struct netns_sctp { struct sctp_mib *sctp_statistics[1U]; struct proc_dir_entry *proc_net_sctp; struct ctl_table_header *sysctl_header; struct sock *ctl_sock; struct list_head local_addr_list; struct list_head addr_waitq; struct timer_list addr_wq_timer; struct list_head auto_asconf_splist; spinlock_t addr_wq_lock; spinlock_t local_addr_lock; unsigned int rto_initial; unsigned int rto_min; unsigned int rto_max; int rto_alpha; int rto_beta; int max_burst; int cookie_preserve_enable; char *sctp_hmac_alg; unsigned int valid_cookie_life; unsigned int sack_timeout; unsigned int hb_interval; int max_retrans_association; int max_retrans_path; int max_retrans_init; int pf_retrans; int sndbuf_policy; int rcvbuf_policy; int default_auto_asconf; int addip_enable; int addip_noauth; int prsctp_enable; int auth_enable; int scope_policy; int rwnd_upd_shift; unsigned long max_autoclose; } ; 133 struct netns_dccp { struct sock *v4_ctl_sk; struct sock *v6_ctl_sk; } ; 104 union __anonunion_in6_u_224 { __u8 u6_addr8[16U]; __be16 u6_addr16[8U]; __be32 u6_addr32[4U]; } ; 104 struct in6_addr { union __anonunion_in6_u_224 in6_u; } ; 324 struct nlattr ; 337 struct nf_logger ; 338 struct netns_nf { struct proc_dir_entry *proc_netfilter; const struct nf_logger *nf_loggers[13U]; struct ctl_table_header *nf_log_dir_header; } ; 17 struct ebt_table ; 18 struct netns_xt { struct list_head tables[13U]; bool notrack_deprecated_warning; struct ebt_table *broute_table; struct ebt_table *frame_filter; struct ebt_table *frame_nat; bool ulog_warn_deprecated; bool ebt_ulog_warn_deprecated; } ; 24 struct hlist_nulls_node ; 24 struct hlist_nulls_head { struct hlist_nulls_node *first; } ; 20 struct hlist_nulls_node { struct hlist_nulls_node *next; struct hlist_nulls_node **pprev; } ; 32 struct nf_proto_net { struct ctl_table_header *ctl_table_header; struct ctl_table *ctl_table; struct ctl_table_header *ctl_compat_header; struct ctl_table *ctl_compat_table; unsigned int users; } ; 23 struct nf_generic_net { struct nf_proto_net pn; unsigned int timeout; } ; 28 struct nf_tcp_net { struct nf_proto_net pn; unsigned int timeouts[14U]; unsigned int tcp_loose; unsigned int tcp_be_liberal; unsigned int tcp_max_retrans; } ; 42 struct nf_udp_net { struct nf_proto_net pn; unsigned int timeouts[2U]; } ; 47 struct nf_icmp_net { struct nf_proto_net pn; unsigned int timeout; } ; 52 struct nf_ip_net { struct nf_generic_net generic; struct nf_tcp_net tcp; struct nf_udp_net udp; struct nf_icmp_net icmp; struct nf_icmp_net icmpv6; struct ctl_table_header *ctl_table_header; struct ctl_table *ctl_table; } ; 63 struct ip_conntrack_stat ; 63 struct nf_ct_event_notifier ; 63 struct nf_exp_event_notifier ; 63 struct netns_ct { atomic_t count; unsigned int expect_count; struct ctl_table_header *sysctl_header; struct ctl_table_header *acct_sysctl_header; struct ctl_table_header *tstamp_sysctl_header; struct ctl_table_header *event_sysctl_header; struct ctl_table_header *helper_sysctl_header; char *slabname; unsigned int sysctl_log_invalid; unsigned int sysctl_events_retry_timeout; int sysctl_events; int sysctl_acct; int sysctl_auto_assign_helper; bool auto_assign_helper_warned; int sysctl_tstamp; int sysctl_checksum; unsigned int htable_size; struct kmem_cache *nf_conntrack_cachep; struct hlist_nulls_head *hash; struct hlist_head *expect_hash; struct hlist_nulls_head unconfirmed; struct hlist_nulls_head dying; struct hlist_nulls_head tmpl; struct ip_conntrack_stat *stat; struct nf_ct_event_notifier *nf_conntrack_event_cb; struct nf_exp_event_notifier *nf_expect_event_cb; struct nf_ip_net nf_ct_proto; unsigned int labels_used; u8 label_words; struct hlist_head *nat_bysource; unsigned int nat_htable_size; } ; 104 struct nft_af_info ; 105 struct netns_nftables { struct list_head af_info; struct list_head commit_list; struct nft_af_info *ipv4; struct nft_af_info *ipv6; struct nft_af_info *inet; struct nft_af_info *arp; struct nft_af_info *bridge; u8 gencursor; u8 genctr; } ; 489 struct xfrm_policy_hash { struct hlist_head *table; unsigned int hmask; } ; 16 struct netns_xfrm { struct list_head state_all; struct hlist_head *state_bydst; struct hlist_head *state_bysrc; struct hlist_head *state_byspi; unsigned int state_hmask; unsigned int state_num; struct work_struct state_hash_work; struct hlist_head state_gc_list; struct work_struct state_gc_work; struct list_head policy_all; struct hlist_head *policy_byidx; unsigned int policy_idx_hmask; struct hlist_head policy_inexact[6U]; struct xfrm_policy_hash policy_bydst[6U]; unsigned int policy_count[6U]; struct work_struct policy_hash_work; struct sock *nlsk; struct sock *nlsk_stash; u32 sysctl_aevent_etime; u32 sysctl_aevent_rseqth; int sysctl_larval_drop; u32 sysctl_acq_expires; struct ctl_table_header *sysctl_hdr; struct dst_ops xfrm4_dst_ops; struct dst_ops xfrm6_dst_ops; spinlock_t xfrm_state_lock; spinlock_t xfrm_policy_sk_bundle_lock; rwlock_t xfrm_policy_lock; struct mutex xfrm_cfg_mutex; } ; 65 struct net_generic ; 66 struct netns_ipvs ; 67 struct net { atomic_t passive; atomic_t count; spinlock_t rules_mod_lock; struct list_head list; struct list_head cleanup_list; struct list_head exit_list; struct user_namespace *user_ns; unsigned int proc_inum; struct proc_dir_entry *proc_net; struct proc_dir_entry *proc_net_stat; struct ctl_table_set sysctls; struct sock *rtnl; struct sock *genl_sock; struct list_head dev_base_head; struct hlist_head *dev_name_head; struct hlist_head *dev_index_head; unsigned int dev_base_seq; int ifindex; unsigned int dev_unreg_count; struct list_head rules_ops; struct net_device *loopback_dev; struct netns_core core; struct netns_mib mib; struct netns_packet packet; struct netns_unix unx; struct netns_ipv4 ipv4; struct netns_ipv6 ipv6; struct netns_sctp sctp; struct netns_dccp dccp; struct netns_nf nf; struct netns_xt xt; struct netns_ct ct; struct netns_nftables nft; struct netns_nf_frag nf_frag; struct sock *nfnl; struct sock *nfnl_stash; struct sk_buff_head wext_nlevents; struct net_generic *gen; struct netns_xfrm xfrm; struct netns_ipvs *ipvs; struct sock *diag_nlsk; atomic_t fnhe_genid; } ; 395 struct dsa_chip_data { struct device *mii_bus; int sw_addr; char *port_names[12U]; s8 *rtable; } ; 46 struct dsa_platform_data { struct device *netdev; int nr_chips; struct dsa_chip_data *chip; } ; 61 struct dsa_switch ; 61 struct dsa_switch_tree { struct dsa_platform_data *pd; struct net_device *master_netdev; __be16 tag_protocol; s8 cpu_switch; s8 cpu_port; int link_poll_needed; struct work_struct link_poll_work; struct timer_list link_poll_timer; struct dsa_switch *ds[4U]; } ; 94 struct dsa_switch_driver ; 94 struct mii_bus ; 94 struct dsa_switch { struct dsa_switch_tree *dst; int index; struct dsa_chip_data *pd; struct dsa_switch_driver *drv; struct mii_bus *master_mii_bus; u32 dsa_port_mask; u32 phys_port_mask; struct mii_bus *slave_mii_bus; struct net_device *ports[12U]; } ; 146 struct dsa_switch_driver { struct list_head list; __be16 tag_protocol; int priv_size; char * (*probe)(struct mii_bus *, int); int (*setup)(struct dsa_switch *); int (*set_addr)(struct dsa_switch *, u8 *); int (*phy_read)(struct dsa_switch *, int, int); int (*phy_write)(struct dsa_switch *, int, int, u16 ); void (*poll_link)(struct dsa_switch *); void (*get_strings)(struct dsa_switch *, int, uint8_t *); void (*get_ethtool_stats)(struct dsa_switch *, int, uint64_t *); int (*get_sset_count)(struct dsa_switch *); } ; 200 struct ieee_ets { __u8 willing; __u8 ets_cap; __u8 cbs; __u8 tc_tx_bw[8U]; __u8 tc_rx_bw[8U]; __u8 tc_tsa[8U]; __u8 prio_tc[8U]; __u8 tc_reco_bw[8U]; __u8 tc_reco_tsa[8U]; __u8 reco_prio_tc[8U]; } ; 69 struct ieee_maxrate { __u64 tc_maxrate[8U]; } ; 80 struct ieee_pfc { __u8 pfc_cap; __u8 pfc_en; __u8 mbc; __u16 delay; __u64 requests[8U]; __u64 indications[8U]; } ; 100 struct cee_pg { __u8 willing; __u8 error; __u8 pg_en; __u8 tcs_supported; __u8 pg_bw[8U]; __u8 prio_pg[8U]; } ; 123 struct cee_pfc { __u8 willing; __u8 error; __u8 pfc_en; __u8 tcs_supported; } ; 138 struct dcb_app { __u8 selector; __u8 priority; __u16 protocol; } ; 167 struct dcb_peer_app_info { __u8 willing; __u8 error; } ; 40 struct dcbnl_rtnl_ops { int (*ieee_getets)(struct net_device *, struct ieee_ets *); int (*ieee_setets)(struct net_device *, struct ieee_ets *); int (*ieee_getmaxrate)(struct net_device *, struct ieee_maxrate *); int (*ieee_setmaxrate)(struct net_device *, struct ieee_maxrate *); int (*ieee_getpfc)(struct net_device *, struct ieee_pfc *); int (*ieee_setpfc)(struct net_device *, struct ieee_pfc *); int (*ieee_getapp)(struct net_device *, struct dcb_app *); int (*ieee_setapp)(struct net_device *, struct dcb_app *); int (*ieee_delapp)(struct net_device *, struct dcb_app *); int (*ieee_peer_getets)(struct net_device *, struct ieee_ets *); int (*ieee_peer_getpfc)(struct net_device *, struct ieee_pfc *); u8 (*getstate)(struct net_device *); u8 (*setstate)(struct net_device *, u8 ); void (*getpermhwaddr)(struct net_device *, u8 *); void (*setpgtccfgtx)(struct net_device *, int, u8 , u8 , u8 , u8 ); void (*setpgbwgcfgtx)(struct net_device *, int, u8 ); void (*setpgtccfgrx)(struct net_device *, int, u8 , u8 , u8 , u8 ); void (*setpgbwgcfgrx)(struct net_device *, int, u8 ); void (*getpgtccfgtx)(struct net_device *, int, u8 *, u8 *, u8 *, u8 *); void (*getpgbwgcfgtx)(struct net_device *, int, u8 *); void (*getpgtccfgrx)(struct net_device *, int, u8 *, u8 *, u8 *, u8 *); void (*getpgbwgcfgrx)(struct net_device *, int, u8 *); void (*setpfccfg)(struct net_device *, int, u8 ); void (*getpfccfg)(struct net_device *, int, u8 *); u8 (*setall)(struct net_device *); u8 (*getcap)(struct net_device *, int, u8 *); int (*getnumtcs)(struct net_device *, int, u8 *); int (*setnumtcs)(struct net_device *, int, u8 ); u8 (*getpfcstate)(struct net_device *); void (*setpfcstate)(struct net_device *, u8 ); void (*getbcncfg)(struct net_device *, int, u32 *); void (*setbcncfg)(struct net_device *, int, u32 ); void (*getbcnrp)(struct net_device *, int, u8 *); void (*setbcnrp)(struct net_device *, int, u8 ); u8 (*setapp)(struct net_device *, u8 , u16 , u8 ); u8 (*getapp)(struct net_device *, u8 , u16 ); u8 (*getfeatcfg)(struct net_device *, int, u8 *); u8 (*setfeatcfg)(struct net_device *, int, u8 ); u8 (*getdcbx)(struct net_device *); u8 (*setdcbx)(struct net_device *, u8 ); int (*peer_getappinfo)(struct net_device *, struct dcb_peer_app_info *, u16 *); int (*peer_getapptable)(struct net_device *, struct dcb_app *); int (*cee_peer_getpg)(struct net_device *, struct cee_pg *); int (*cee_peer_getpfc)(struct net_device *, struct cee_pfc *); } ; 102 struct taskstats { __u16 version; __u32 ac_exitcode; __u8 ac_flag; __u8 ac_nice; __u64 cpu_count; __u64 cpu_delay_total; __u64 blkio_count; __u64 blkio_delay_total; __u64 swapin_count; __u64 swapin_delay_total; __u64 cpu_run_real_total; __u64 cpu_run_virtual_total; char ac_comm[32U]; __u8 ac_sched; __u8 ac_pad[3U]; __u32 ac_uid; __u32 ac_gid; __u32 ac_pid; __u32 ac_ppid; __u32 ac_btime; __u64 ac_etime; __u64 ac_utime; __u64 ac_stime; __u64 ac_minflt; __u64 ac_majflt; __u64 coremem; __u64 virtmem; __u64 hiwater_rss; __u64 hiwater_vm; __u64 read_char; __u64 write_char; __u64 read_syscalls; __u64 write_syscalls; __u64 read_bytes; __u64 write_bytes; __u64 cancelled_write_bytes; __u64 nvcsw; __u64 nivcsw; __u64 ac_utimescaled; __u64 ac_stimescaled; __u64 cpu_scaled_run_real_total; __u64 freepages_count; __u64 freepages_delay_total; } ; 55 struct xattr_handler { const char *prefix; int flags; size_t (*list)(struct dentry *, char *, size_t , const char *, size_t , int); int (*get)(struct dentry *, const char *, void *, size_t , int); int (*set)(struct dentry *, const char *, const void *, size_t , int, int); } ; 53 struct simple_xattrs { struct list_head head; spinlock_t lock; } ; 98 struct percpu_ref ; 54 typedef void percpu_ref_func_t(struct percpu_ref *); 55 struct percpu_ref { atomic_t count; unsigned int *pcpu_count; percpu_ref_func_t *release; percpu_ref_func_t *confirm_kill; struct callback_head rcu; } ; 173 struct cgroupfs_root ; 174 struct cgroup_subsys ; 175 struct cgroup ; 62 struct cgroup_subsys_state { struct cgroup *cgroup; struct cgroup_subsys *ss; struct percpu_ref refcnt; struct cgroup_subsys_state *parent; unsigned long flags; struct callback_head callback_head; struct work_struct destroy_work; } ; 142 struct cgroup_name { struct callback_head callback_head; char name[]; } ; 160 struct cgroup { unsigned long flags; int id; int nr_css; struct list_head sibling; struct list_head children; struct list_head files; struct cgroup *parent; struct dentry *dentry; u64 serial_nr; struct cgroup_name *name; struct cgroup_subsys_state *subsys[12U]; struct cgroupfs_root *root; struct list_head cset_links; struct list_head release_list; struct list_head pidlists; struct mutex pidlist_mutex; struct cgroup_subsys_state dummy_css; struct callback_head callback_head; struct work_struct destroy_work; struct simple_xattrs xattrs; } ; 252 struct cgroupfs_root { struct super_block *sb; unsigned long subsys_mask; int hierarchy_id; struct cgroup top_cgroup; int number_of_cgroups; struct list_head root_list; unsigned long flags; struct idr cgroup_idr; char release_agent_path[4096U]; char name[64U]; } ; 342 struct css_set { atomic_t refcount; struct hlist_node hlist; struct list_head tasks; struct list_head cgrp_links; struct cgroup_subsys_state *subsys[12U]; struct callback_head callback_head; } ; 392 struct cftype { char name[64U]; int private; umode_t mode; size_t max_write_len; unsigned int flags; struct cgroup_subsys *ss; u64 (*read_u64)(struct cgroup_subsys_state *, struct cftype *); s64 (*read_s64)(struct cgroup_subsys_state *, struct cftype *); int (*seq_show)(struct seq_file *, void *); void * (*seq_start)(struct seq_file *, loff_t *); void * (*seq_next)(struct seq_file *, void *, loff_t *); void (*seq_stop)(struct seq_file *, void *); int (*write_u64)(struct cgroup_subsys_state *, struct cftype *, u64 ); int (*write_s64)(struct cgroup_subsys_state *, struct cftype *, s64 ); int (*write_string)(struct cgroup_subsys_state *, struct cftype *, const char *); int (*trigger)(struct cgroup_subsys_state *, unsigned int); } ; 479 struct cftype_set { struct list_head node; struct cftype *cfts; } ; 546 struct cgroup_taskset ; 557 struct cgroup_subsys { struct cgroup_subsys_state * (*css_alloc)(struct cgroup_subsys_state *); int (*css_online)(struct cgroup_subsys_state *); void (*css_offline)(struct cgroup_subsys_state *); void (*css_free)(struct cgroup_subsys_state *); int (*can_attach)(struct cgroup_subsys_state *, struct cgroup_taskset *); void (*cancel_attach)(struct cgroup_subsys_state *, struct cgroup_taskset *); void (*attach)(struct cgroup_subsys_state *, struct cgroup_taskset *); void (*fork)(struct task_struct *); void (*exit)(struct cgroup_subsys_state *, struct cgroup_subsys_state *, struct task_struct *); void (*bind)(struct cgroup_subsys_state *); int subsys_id; int disabled; int early_init; bool broken_hierarchy; bool warned_broken_hierarchy; const char *name; struct cgroupfs_root *root; struct list_head cftsets; struct cftype *base_cftypes; struct cftype_set base_cftset; struct module *module; } ; 124 enum irqreturn { IRQ_NONE = 0, IRQ_HANDLED = 1, IRQ_WAKE_THREAD = 2 } ; 16 typedef enum irqreturn irqreturn_t; 60 struct netprio_map { struct callback_head rcu; u32 priomap_len; u32 priomap[]; } ; 103 struct xfrm_policy ; 104 struct xfrm_state ; 124 struct request_sock ; 3157 struct mnt_namespace ; 3158 struct ipc_namespace ; 3159 struct nsproxy { atomic_t count; struct uts_namespace *uts_ns; struct ipc_namespace *ipc_ns; struct mnt_namespace *mnt_ns; struct pid_namespace *pid_ns_for_children; struct net *net_ns; } ; 41 struct nlmsghdr { __u32 nlmsg_len; __u16 nlmsg_type; __u16 nlmsg_flags; __u32 nlmsg_seq; __u32 nlmsg_pid; } ; 145 struct nlattr { __u16 nla_len; __u16 nla_type; } ; 102 struct netlink_callback { struct sk_buff *skb; const struct nlmsghdr *nlh; int (*dump)(struct sk_buff *, struct netlink_callback *); int (*done)(struct netlink_callback *); void *data; struct module *module; u16 family; u16 min_dump_alloc; unsigned int prev_seq; unsigned int seq; long args[6U]; } ; 171 struct ndmsg { __u8 ndm_family; __u8 ndm_pad1; __u16 ndm_pad2; __s32 ndm_ifindex; __u16 ndm_state; __u8 ndm_flags; __u8 ndm_type; } ; 39 struct rtnl_link_stats64 { __u64 rx_packets; __u64 tx_packets; __u64 rx_bytes; __u64 tx_bytes; __u64 rx_errors; __u64 tx_errors; __u64 rx_dropped; __u64 tx_dropped; __u64 multicast; __u64 collisions; __u64 rx_length_errors; __u64 rx_over_errors; __u64 rx_crc_errors; __u64 rx_frame_errors; __u64 rx_fifo_errors; __u64 rx_missed_errors; __u64 tx_aborted_errors; __u64 tx_carrier_errors; __u64 tx_fifo_errors; __u64 tx_heartbeat_errors; __u64 tx_window_errors; __u64 rx_compressed; __u64 tx_compressed; } ; 536 struct ifla_vf_info { __u32 vf; __u8 mac[32U]; __u32 vlan; __u32 qos; __u32 tx_rate; __u32 spoofchk; __u32 linkstate; } ; 27 struct netpoll_info ; 28 struct phy_device ; 29 struct wireless_dev ; 64 enum netdev_tx { __NETDEV_TX_MIN = -2147483648, NETDEV_TX_OK = 0, NETDEV_TX_BUSY = 16, NETDEV_TX_LOCKED = 32 } ; 116 typedef enum netdev_tx netdev_tx_t; 135 struct net_device_stats { unsigned long rx_packets; unsigned long tx_packets; unsigned long rx_bytes; unsigned long tx_bytes; unsigned long rx_errors; unsigned long tx_errors; unsigned long rx_dropped; unsigned long tx_dropped; unsigned long multicast; unsigned long collisions; unsigned long rx_length_errors; unsigned long rx_over_errors; unsigned long rx_crc_errors; unsigned long rx_frame_errors; unsigned long rx_fifo_errors; unsigned long rx_missed_errors; unsigned long tx_aborted_errors; unsigned long tx_carrier_errors; unsigned long tx_fifo_errors; unsigned long tx_heartbeat_errors; unsigned long tx_window_errors; unsigned long rx_compressed; unsigned long tx_compressed; } ; 196 struct neigh_parms ; 217 struct netdev_hw_addr_list { struct list_head list; int count; } ; 222 struct hh_cache { u16 hh_len; u16 __pad; seqlock_t hh_lock; unsigned long hh_data[16U]; } ; 251 struct header_ops { int (*create)(struct sk_buff *, struct net_device *, unsigned short, const void *, const void *, unsigned int); int (*parse)(const struct sk_buff *, unsigned char *); int (*rebuild)(struct sk_buff *); int (*cache)(const struct neighbour *, struct hh_cache *, __be16 ); void (*cache_update)(struct hh_cache *, const struct net_device *, const unsigned char *); } ; 302 struct napi_struct { struct list_head poll_list; unsigned long state; int weight; unsigned int gro_count; int (*poll)(struct napi_struct *, int); spinlock_t poll_lock; int poll_owner; struct net_device *dev; struct sk_buff *gro_list; struct sk_buff *skb; struct list_head dev_list; struct hlist_node napi_hash_node; unsigned int napi_id; } ; 346 enum rx_handler_result { RX_HANDLER_CONSUMED = 0, RX_HANDLER_ANOTHER = 1, RX_HANDLER_EXACT = 2, RX_HANDLER_PASS = 3 } ; 394 typedef enum rx_handler_result rx_handler_result_t; 395 typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **); 532 struct Qdisc ; 532 struct netdev_queue { struct net_device *dev; struct Qdisc *qdisc; struct Qdisc *qdisc_sleeping; struct kobject kobj; int numa_node; spinlock_t _xmit_lock; int xmit_lock_owner; unsigned long trans_start; unsigned long trans_timeout; unsigned long state; struct dql dql; } ; 594 struct rps_map { unsigned int len; struct callback_head rcu; u16 cpus[0U]; } ; 606 struct rps_dev_flow { u16 cpu; u16 filter; unsigned int last_qtail; } ; 618 struct rps_dev_flow_table { unsigned int mask; struct callback_head rcu; struct rps_dev_flow flows[0U]; } ; 669 struct netdev_rx_queue { struct rps_map *rps_map; struct rps_dev_flow_table *rps_flow_table; struct kobject kobj; struct net_device *dev; } ; 692 struct xps_map { unsigned int len; unsigned int alloc_len; struct callback_head rcu; u16 queues[0U]; } ; 705 struct xps_dev_maps { struct callback_head rcu; struct xps_map *cpu_map[0U]; } ; 716 struct netdev_tc_txq { u16 count; u16 offset; } ; 727 struct netdev_fcoe_hbainfo { char manufacturer[64U]; char serial_number[64U]; char hardware_version[64U]; char driver_version[64U]; char optionrom_version[64U]; char firmware_version[64U]; char model[256U]; char model_description[256U]; } ; 743 struct netdev_phys_port_id { unsigned char id[32U]; unsigned char id_len; } ; 756 struct net_device_ops { int (*ndo_init)(struct net_device *); void (*ndo_uninit)(struct net_device *); int (*ndo_open)(struct net_device *); int (*ndo_stop)(struct net_device *); netdev_tx_t (*ndo_start_xmit)(struct sk_buff *, struct net_device *); u16 (*ndo_select_queue)(struct net_device *, struct sk_buff *, void *, u16 (*)(struct net_device *, struct sk_buff *)); void (*ndo_change_rx_flags)(struct net_device *, int); void (*ndo_set_rx_mode)(struct net_device *); int (*ndo_set_mac_address)(struct net_device *, void *); int (*ndo_validate_addr)(struct net_device *); int (*ndo_do_ioctl)(struct net_device *, struct ifreq *, int); int (*ndo_set_config)(struct net_device *, struct ifmap *); int (*ndo_change_mtu)(struct net_device *, int); int (*ndo_neigh_setup)(struct net_device *, struct neigh_parms *); void (*ndo_tx_timeout)(struct net_device *); struct rtnl_link_stats64 * (*ndo_get_stats64)(struct net_device *, struct rtnl_link_stats64 *); struct net_device_stats * (*ndo_get_stats)(struct net_device *); int (*ndo_vlan_rx_add_vid)(struct net_device *, __be16 , u16 ); int (*ndo_vlan_rx_kill_vid)(struct net_device *, __be16 , u16 ); void (*ndo_poll_controller)(struct net_device *); int (*ndo_netpoll_setup)(struct net_device *, struct netpoll_info *, gfp_t ); void (*ndo_netpoll_cleanup)(struct net_device *); int (*ndo_busy_poll)(struct napi_struct *); int (*ndo_set_vf_mac)(struct net_device *, int, u8 *); int (*ndo_set_vf_vlan)(struct net_device *, int, u16 , u8 ); int (*ndo_set_vf_tx_rate)(struct net_device *, int, int); int (*ndo_set_vf_spoofchk)(struct net_device *, int, bool ); int (*ndo_get_vf_config)(struct net_device *, int, struct ifla_vf_info *); int (*ndo_set_vf_link_state)(struct net_device *, int, int); int (*ndo_set_vf_port)(struct net_device *, int, struct nlattr **); int (*ndo_get_vf_port)(struct net_device *, int, struct sk_buff *); int (*ndo_setup_tc)(struct net_device *, u8 ); int (*ndo_fcoe_enable)(struct net_device *); int (*ndo_fcoe_disable)(struct net_device *); int (*ndo_fcoe_ddp_setup)(struct net_device *, u16 , struct scatterlist *, unsigned int); int (*ndo_fcoe_ddp_done)(struct net_device *, u16 ); int (*ndo_fcoe_ddp_target)(struct net_device *, u16 , struct scatterlist *, unsigned int); int (*ndo_fcoe_get_hbainfo)(struct net_device *, struct netdev_fcoe_hbainfo *); int (*ndo_fcoe_get_wwn)(struct net_device *, u64 *, int); int (*ndo_rx_flow_steer)(struct net_device *, const struct sk_buff *, u16 , u32 ); int (*ndo_add_slave)(struct net_device *, struct net_device *); int (*ndo_del_slave)(struct net_device *, struct net_device *); netdev_features_t (*ndo_fix_features)(struct net_device *, netdev_features_t ); int (*ndo_set_features)(struct net_device *, netdev_features_t ); int (*ndo_neigh_construct)(struct neighbour *); void (*ndo_neigh_destroy)(struct neighbour *); int (*ndo_fdb_add)(struct ndmsg *, struct nlattr **, struct net_device *, const unsigned char *, u16 ); int (*ndo_fdb_del)(struct ndmsg *, struct nlattr **, struct net_device *, const unsigned char *); int (*ndo_fdb_dump)(struct sk_buff *, struct netlink_callback *, struct net_device *, int); int (*ndo_bridge_setlink)(struct net_device *, struct nlmsghdr *); int (*ndo_bridge_getlink)(struct sk_buff *, u32 , u32 , struct net_device *, u32 ); int (*ndo_bridge_dellink)(struct net_device *, struct nlmsghdr *); int (*ndo_change_carrier)(struct net_device *, bool ); int (*ndo_get_phys_port_id)(struct net_device *, struct netdev_phys_port_id *); void (*ndo_add_vxlan_port)(struct net_device *, sa_family_t , __be16 ); void (*ndo_del_vxlan_port)(struct net_device *, sa_family_t , __be16 ); void * (*ndo_dfwd_add_station)(struct net_device *, struct net_device *); void (*ndo_dfwd_del_station)(struct net_device *, void *); netdev_tx_t (*ndo_dfwd_start_xmit)(struct sk_buff *, struct net_device *, void *); } ; 1161 struct __anonstruct_adj_list_235 { struct list_head upper; struct list_head lower; } ; 1161 struct __anonstruct_all_adj_list_236 { struct list_head upper; struct list_head lower; } ; 1161 struct iw_handler_def ; 1161 struct iw_public_data ; 1161 struct forwarding_accel_ops ; 1161 struct vlan_info ; 1161 struct tipc_bearer ; 1161 struct in_device ; 1161 struct dn_dev ; 1161 struct inet6_dev ; 1161 struct cpu_rmap ; 1161 struct pcpu_lstats ; 1161 struct pcpu_sw_netstats ; 1161 struct pcpu_dstats ; 1161 struct pcpu_vstats ; 1161 union __anonunion____missing_field_name_237 { void *ml_priv; struct pcpu_lstats *lstats; struct pcpu_sw_netstats *tstats; struct pcpu_dstats *dstats; struct pcpu_vstats *vstats; } ; 1161 struct garp_port ; 1161 struct mrp_port ; 1161 struct rtnl_link_ops ; 1161 struct net_device { char name[16U]; struct hlist_node name_hlist; char *ifalias; unsigned long mem_end; unsigned long mem_start; unsigned long base_addr; int irq; unsigned long state; struct list_head dev_list; struct list_head napi_list; struct list_head unreg_list; struct list_head close_list; struct __anonstruct_adj_list_235 adj_list; struct __anonstruct_all_adj_list_236 all_adj_list; netdev_features_t features; netdev_features_t hw_features; netdev_features_t wanted_features; netdev_features_t vlan_features; netdev_features_t hw_enc_features; netdev_features_t mpls_features; int ifindex; int iflink; struct net_device_stats stats; atomic_long_t rx_dropped; const struct iw_handler_def *wireless_handlers; struct iw_public_data *wireless_data; const struct net_device_ops *netdev_ops; const struct ethtool_ops *ethtool_ops; const struct forwarding_accel_ops *fwd_ops; const struct header_ops *header_ops; unsigned int flags; unsigned int priv_flags; unsigned short gflags; unsigned short padded; unsigned char operstate; unsigned char link_mode; unsigned char if_port; unsigned char dma; unsigned int mtu; unsigned short type; unsigned short hard_header_len; unsigned short needed_headroom; unsigned short needed_tailroom; unsigned char perm_addr[32U]; unsigned char addr_assign_type; unsigned char addr_len; unsigned short neigh_priv_len; unsigned short dev_id; spinlock_t addr_list_lock; struct netdev_hw_addr_list uc; struct netdev_hw_addr_list mc; struct netdev_hw_addr_list dev_addrs; struct kset *queues_kset; bool uc_promisc; unsigned int promiscuity; unsigned int allmulti; struct vlan_info *vlan_info; struct dsa_switch_tree *dsa_ptr; struct tipc_bearer *tipc_ptr; void *atalk_ptr; struct in_device *ip_ptr; struct dn_dev *dn_ptr; struct inet6_dev *ip6_ptr; void *ax25_ptr; struct wireless_dev *ieee80211_ptr; unsigned long last_rx; unsigned char *dev_addr; struct netdev_rx_queue *_rx; unsigned int num_rx_queues; unsigned int real_num_rx_queues; rx_handler_func_t *rx_handler; void *rx_handler_data; struct netdev_queue *ingress_queue; unsigned char broadcast[32U]; struct netdev_queue *_tx; unsigned int num_tx_queues; unsigned int real_num_tx_queues; struct Qdisc *qdisc; unsigned long tx_queue_len; spinlock_t tx_global_lock; struct xps_dev_maps *xps_maps; struct cpu_rmap *rx_cpu_rmap; unsigned long trans_start; int watchdog_timeo; struct timer_list watchdog_timer; int *pcpu_refcnt; struct list_head todo_list; struct hlist_node index_hlist; struct list_head link_watch_list; unsigned char reg_state; bool dismantle; unsigned short rtnl_link_state; void (*destructor)(struct net_device *); struct netpoll_info *npinfo; struct net *nd_net; union __anonunion____missing_field_name_237 __annonCompField74; struct garp_port *garp_port; struct mrp_port *mrp_port; struct device dev; const struct attribute_group *sysfs_groups[4U]; const struct attribute_group *sysfs_rx_queue_group; const struct rtnl_link_ops *rtnl_link_ops; unsigned int gso_max_size; u16 gso_max_segs; const struct dcbnl_rtnl_ops *dcbnl_ops; u8 num_tc; struct netdev_tc_txq tc_to_txq[16U]; u8 prio_tc_map[16U]; unsigned int fcoe_ddp_xid; struct netprio_map *priomap; struct phy_device *phydev; struct lock_class_key *qdisc_tx_busylock; int group; struct pm_qos_request pm_qos_req; } ; 1722 struct pcpu_sw_netstats { u64 rx_packets; u64 rx_bytes; u64 tx_packets; u64 tx_bytes; struct u64_stats_sync syncp; } ; 2465 enum skb_free_reason { SKB_REASON_CONSUMED = 0, SKB_REASON_DROPPED = 1 } ; 15 typedef __u64 Elf64_Addr; 16 typedef __u16 Elf64_Half; 20 typedef __u32 Elf64_Word; 21 typedef __u64 Elf64_Xword; 190 struct elf64_sym { Elf64_Word st_name; unsigned char st_info; unsigned char st_other; Elf64_Half st_shndx; Elf64_Addr st_value; Elf64_Xword st_size; } ; 198 typedef struct elf64_sym Elf64_Sym; 48 struct kernel_param ; 53 struct kernel_param_ops { unsigned int flags; int (*set)(const char *, const struct kernel_param *); int (*get)(char *, const struct kernel_param *); void (*free)(void *); } ; 58 struct kparam_string ; 58 struct kparam_array ; 58 union __anonunion____missing_field_name_242 { void *arg; const struct kparam_string *str; const struct kparam_array *arr; } ; 58 struct kernel_param { const char *name; const struct kernel_param_ops *ops; u16 perm; s16 level; union __anonunion____missing_field_name_242 __annonCompField75; } ; 70 struct kparam_string { unsigned int maxlen; char *string; } ; 76 struct kparam_array { unsigned int max; unsigned int elemsize; unsigned int *num; const struct kernel_param_ops *ops; void *elem; } ; 463 struct tracepoint ; 464 struct tracepoint_func { void *func; void *data; } ; 29 struct tracepoint { const char *name; struct static_key key; void (*regfunc)(); void (*unregfunc)(); struct tracepoint_func *funcs; } ; 92 struct mod_arch_specific { } ; 36 struct module_param_attrs ; 36 struct module_kobject { struct kobject kobj; struct module *mod; struct kobject *drivers_dir; struct module_param_attrs *mp; struct completion *kobj_completion; } ; 46 struct module_attribute { struct attribute attr; ssize_t (*show)(struct module_attribute *, struct module_kobject *, char *); ssize_t (*store)(struct module_attribute *, struct module_kobject *, const char *, size_t ); void (*setup)(struct module *, const char *); int (*test)(struct module *); void (*free)(struct module *); } ; 208 enum module_state { MODULE_STATE_LIVE = 0, MODULE_STATE_COMING = 1, MODULE_STATE_GOING = 2, MODULE_STATE_UNFORMED = 3 } ; 215 struct module_ref { unsigned long incs; unsigned long decs; } ; 229 struct module_sect_attrs ; 229 struct module_notes_attrs ; 229 struct ftrace_event_call ; 229 struct module { enum module_state state; struct list_head list; char name[56U]; struct module_kobject mkobj; struct module_attribute *modinfo_attrs; const char *version; const char *srcversion; struct kobject *holders_dir; const struct kernel_symbol *syms; const unsigned long *crcs; unsigned int num_syms; struct kernel_param *kp; unsigned int num_kp; unsigned int num_gpl_syms; const struct kernel_symbol *gpl_syms; const unsigned long *gpl_crcs; const struct kernel_symbol *unused_syms; const unsigned long *unused_crcs; unsigned int num_unused_syms; unsigned int num_unused_gpl_syms; const struct kernel_symbol *unused_gpl_syms; const unsigned long *unused_gpl_crcs; bool sig_ok; const struct kernel_symbol *gpl_future_syms; const unsigned long *gpl_future_crcs; unsigned int num_gpl_future_syms; unsigned int num_exentries; struct exception_table_entry *extable; int (*init)(); void *module_init; void *module_core; unsigned int init_size; unsigned int core_size; unsigned int init_text_size; unsigned int core_text_size; unsigned int init_ro_size; unsigned int core_ro_size; struct mod_arch_specific arch; unsigned int taints; unsigned int num_bugs; struct list_head bug_list; struct bug_entry *bug_table; Elf64_Sym *symtab; Elf64_Sym *core_symtab; unsigned int num_symtab; unsigned int core_num_syms; char *strtab; char *core_strtab; struct module_sect_attrs *sect_attrs; struct module_notes_attrs *notes_attrs; char *args; void *percpu; unsigned int percpu_size; unsigned int num_tracepoints; const struct tracepoint **tracepoints_ptrs; unsigned int num_trace_bprintk_fmt; const char **trace_bprintk_fmt_start; struct ftrace_event_call **trace_events; unsigned int num_trace_events; struct list_head source_list; struct list_head target_list; void (*exit)(); struct module_ref *refptr; ctor_fn_t (**ctors)(); unsigned int num_ctors; } ; 13 typedef unsigned long kernel_ulong_t; 14 struct pci_device_id { __u32 vendor; __u32 device; __u32 subvendor; __u32 subdevice; __u32 class; __u32 class_mask; kernel_ulong_t driver_data; } ; 186 struct acpi_device_id { __u8 id[9U]; kernel_ulong_t driver_data; } ; 219 struct of_device_id { char name[32U]; char type[32U]; char compatible[128U]; const void *data; } ; 69 struct hotplug_slot ; 69 struct pci_slot { struct pci_bus *bus; struct list_head list; struct hotplug_slot *hotplug; unsigned char number; struct kobject kobj; } ; 110 typedef int pci_power_t; 137 typedef unsigned int pci_channel_state_t; 138 enum pci_channel_state { pci_channel_io_normal = 1, pci_channel_io_frozen = 2, pci_channel_io_perm_failure = 3 } ; 163 typedef unsigned short pci_dev_flags_t; 180 typedef unsigned short pci_bus_flags_t; 237 struct pcie_link_state ; 238 struct pci_vpd ; 239 struct pci_sriov ; 240 struct pci_ats ; 241 struct pci_driver ; 241 union __anonunion____missing_field_name_246 { struct pci_sriov *sriov; struct pci_dev *physfn; } ; 241 struct pci_dev { struct list_head bus_list; struct pci_bus *bus; struct pci_bus *subordinate; void *sysdata; struct proc_dir_entry *procent; struct pci_slot *slot; unsigned int devfn; unsigned short vendor; unsigned short device; unsigned short subsystem_vendor; unsigned short subsystem_device; unsigned int class; u8 revision; u8 hdr_type; u8 pcie_cap; u8 msi_cap; u8 msix_cap; unsigned char pcie_mpss; u8 rom_base_reg; u8 pin; u16 pcie_flags_reg; struct pci_driver *driver; u64 dma_mask; struct device_dma_parameters dma_parms; pci_power_t current_state; u8 pm_cap; unsigned char pme_support; unsigned char pme_interrupt; unsigned char pme_poll; unsigned char d1_support; unsigned char d2_support; unsigned char no_d1d2; unsigned char no_d3cold; unsigned char d3cold_allowed; unsigned char mmio_always_on; unsigned char wakeup_prepared; unsigned char runtime_d3cold; unsigned int d3_delay; unsigned int d3cold_delay; struct pcie_link_state *link_state; pci_channel_state_t error_state; struct device dev; int cfg_size; unsigned int irq; struct resource resource[17U]; bool match_driver; unsigned char transparent; unsigned char multifunction; unsigned char is_added; unsigned char is_busmaster; unsigned char no_msi; unsigned char block_cfg_access; unsigned char broken_parity_status; unsigned char irq_reroute_variant; unsigned char msi_enabled; unsigned char msix_enabled; unsigned char ari_enabled; unsigned char is_managed; unsigned char needs_freset; unsigned char state_saved; unsigned char is_physfn; unsigned char is_virtfn; unsigned char reset_fn; unsigned char is_hotplug_bridge; unsigned char __aer_firmware_first_valid; unsigned char __aer_firmware_first; unsigned char broken_intx_masking; unsigned char io_window_1k; pci_dev_flags_t dev_flags; atomic_t enable_cnt; u32 saved_config_space[16U]; struct hlist_head saved_cap_space; struct bin_attribute *rom_attr; int rom_attr_enabled; struct bin_attribute *res_attr[17U]; struct bin_attribute *res_attr_wc[17U]; struct list_head msi_list; const struct attribute_group **msi_irq_groups; struct pci_vpd *vpd; union __anonunion____missing_field_name_246 __annonCompField76; struct pci_ats *ats; phys_addr_t rom; size_t romlen; } ; 429 struct pci_ops ; 429 struct msi_chip ; 429 struct pci_bus { struct list_head node; struct pci_bus *parent; struct list_head children; struct list_head devices; struct pci_dev *self; struct list_head slots; struct resource *resource[4U]; struct list_head resources; struct resource busn_res; struct pci_ops *ops; struct msi_chip *msi; void *sysdata; struct proc_dir_entry *procdir; unsigned char number; unsigned char primary; unsigned char max_bus_speed; unsigned char cur_bus_speed; char name[48U]; unsigned short bridge_ctl; pci_bus_flags_t bus_flags; struct device *bridge; struct device dev; struct bin_attribute *legacy_io; struct bin_attribute *legacy_mem; unsigned char is_added; } ; 534 struct pci_ops { int (*read)(struct pci_bus *, unsigned int, int, int, u32 *); int (*write)(struct pci_bus *, unsigned int, int, int, u32 ); } ; 555 struct pci_dynids { spinlock_t lock; struct list_head list; } ; 569 typedef unsigned int pci_ers_result_t; 579 struct pci_error_handlers { pci_ers_result_t (*error_detected)(struct pci_dev *, enum pci_channel_state ); pci_ers_result_t (*mmio_enabled)(struct pci_dev *); pci_ers_result_t (*link_reset)(struct pci_dev *); pci_ers_result_t (*slot_reset)(struct pci_dev *); void (*resume)(struct pci_dev *); } ; 609 struct pci_driver { struct list_head node; const char *name; const struct pci_device_id *id_table; int (*probe)(struct pci_dev *, const struct pci_device_id *); void (*remove)(struct pci_dev *); int (*suspend)(struct pci_dev *, pm_message_t ); int (*suspend_late)(struct pci_dev *, pm_message_t ); int (*resume_early)(struct pci_dev *); int (*resume)(struct pci_dev *); void (*shutdown)(struct pci_dev *); int (*sriov_configure)(struct pci_dev *, int); const struct pci_error_handlers *err_handler; struct device_driver driver; struct pci_dynids dynids; } ; 615 struct res_counter { unsigned long long usage; unsigned long long max_usage; unsigned long long limit; unsigned long long soft_limit; unsigned long long failcnt; spinlock_t lock; struct res_counter *parent; } ; 226 struct kioctx ; 30 typedef int kiocb_cancel_fn(struct kiocb *); 31 union __anonunion_ki_obj_247 { void *user; struct task_struct *tsk; } ; 31 struct eventfd_ctx ; 31 struct kiocb { struct file *ki_filp; struct kioctx *ki_ctx; kiocb_cancel_fn *ki_cancel; void *private; union __anonunion_ki_obj_247 ki_obj; __u64 ki_user_data; loff_t ki_pos; size_t ki_nbytes; struct list_head ki_list; struct eventfd_ctx *ki_eventfd; } ; 100 struct sock_filter { __u16 code; __u8 jt; __u8 jf; __u32 k; } ; 20 union __anonunion____missing_field_name_248 { struct sock_filter insns[0U]; struct work_struct work; } ; 20 struct sk_filter { atomic_t refcnt; unsigned int len; struct callback_head rcu; unsigned int (*bpf_func)(const struct sk_buff *, const struct sock_filter *); union __anonunion____missing_field_name_248 __annonCompField77; } ; 32 struct poll_table_struct { void (*_qproc)(struct file *, wait_queue_head_t *, struct poll_table_struct *); unsigned long _key; } ; 108 struct nla_policy { u16 type; u16 len; } ; 25 struct rtnl_link_ops { struct list_head list; const char *kind; size_t priv_size; void (*setup)(struct net_device *); int maxtype; const struct nla_policy *policy; int (*validate)(struct nlattr **, struct nlattr **); int (*newlink)(struct net *, struct net_device *, struct nlattr **, struct nlattr **); int (*changelink)(struct net_device *, struct nlattr **, struct nlattr **); void (*dellink)(struct net_device *, struct list_head *); size_t (*get_size)(const struct net_device *); int (*fill_info)(struct sk_buff *, const struct net_device *); size_t (*get_xstats_size)(const struct net_device *); int (*fill_xstats)(struct sk_buff *, const struct net_device *); unsigned int (*get_num_tx_queues)(); unsigned int (*get_num_rx_queues)(); int slave_maxtype; const struct nla_policy *slave_policy; int (*slave_validate)(struct nlattr **, struct nlattr **); int (*slave_changelink)(struct net_device *, struct net_device *, struct nlattr **, struct nlattr **); size_t (*get_slave_size)(const struct net_device *, const struct net_device *); int (*fill_slave_info)(struct sk_buff *, const struct net_device *, const struct net_device *); } ; 167 struct neigh_table ; 167 struct neigh_parms { struct net *net; struct net_device *dev; struct neigh_parms *next; int (*neigh_setup)(struct neighbour *); void (*neigh_cleanup)(struct neighbour *); struct neigh_table *tbl; void *sysctl_table; int dead; atomic_t refcnt; struct callback_head callback_head; int reachable_time; int data[12U]; unsigned long data_state[1U]; } ; 111 struct neigh_statistics { unsigned long allocs; unsigned long destroys; unsigned long hash_grows; unsigned long res_failed; unsigned long lookups; unsigned long hits; unsigned long rcv_probes_mcast; unsigned long rcv_probes_ucast; unsigned long periodic_gc_runs; unsigned long forced_gc_runs; unsigned long unres_discards; } ; 130 struct neigh_ops ; 130 struct neighbour { struct neighbour *next; struct neigh_table *tbl; struct neigh_parms *parms; unsigned long confirmed; unsigned long updated; rwlock_t lock; atomic_t refcnt; struct sk_buff_head arp_queue; unsigned int arp_queue_len_bytes; struct timer_list timer; unsigned long used; atomic_t probes; __u8 flags; __u8 nud_state; __u8 type; __u8 dead; seqlock_t ha_lock; unsigned char ha[32U]; struct hh_cache hh; int (*output)(struct neighbour *, struct sk_buff *); const struct neigh_ops *ops; struct callback_head rcu; struct net_device *dev; u8 primary_key[0U]; } ; 159 struct neigh_ops { int family; void (*solicit)(struct neighbour *, struct sk_buff *); void (*error_report)(struct neighbour *, struct sk_buff *); int (*output)(struct neighbour *, struct sk_buff *); int (*connected_output)(struct neighbour *, struct sk_buff *); } ; 167 struct pneigh_entry { struct pneigh_entry *next; struct net *net; struct net_device *dev; u8 flags; u8 key[0U]; } ; 177 struct neigh_hash_table { struct neighbour **hash_buckets; unsigned int hash_shift; __u32 hash_rnd[4U]; struct callback_head rcu; } ; 190 struct neigh_table { struct neigh_table *next; int family; int entry_size; int key_len; __u32 (*hash)(const void *, const struct net_device *, __u32 *); int (*constructor)(struct neighbour *); int (*pconstructor)(struct pneigh_entry *); void (*pdestructor)(struct pneigh_entry *); void (*proxy_redo)(struct sk_buff *); char *id; struct neigh_parms parms; int gc_interval; int gc_thresh1; int gc_thresh2; int gc_thresh3; unsigned long last_flush; struct delayed_work gc_work; struct timer_list proxy_timer; struct sk_buff_head proxy_queue; atomic_t entries; rwlock_t lock; unsigned long last_rand; struct neigh_statistics *stats; struct neigh_hash_table *nht; struct pneigh_entry **phash_buckets; } ; 462 struct dn_route ; 462 union __anonunion____missing_field_name_253 { struct dst_entry *next; struct rtable *rt_next; struct rt6_info *rt6_next; struct dn_route *dn_next; } ; 462 struct dst_entry { struct callback_head callback_head; struct dst_entry *child; struct net_device *dev; struct dst_ops *ops; unsigned long _metrics; unsigned long expires; struct dst_entry *path; struct dst_entry *from; struct xfrm_state *xfrm; int (*input)(struct sk_buff *); int (*output)(struct sk_buff *); unsigned short flags; unsigned short pending_confirm; short error; short obsolete; unsigned short header_len; unsigned short trailer_len; __u32 tclassid; long __pad_to_align_refcnt[2U]; atomic_t __refcnt; int __use; unsigned long lastuse; union __anonunion____missing_field_name_253 __annonCompField78; } ; 123 struct __anonstruct_socket_lock_t_254 { spinlock_t slock; int owned; wait_queue_head_t wq; struct lockdep_map dep_map; } ; 123 typedef struct __anonstruct_socket_lock_t_254 socket_lock_t; 123 struct proto ; 129 typedef __u32 __portpair; 130 typedef __u64 __addrpair; 131 struct __anonstruct____missing_field_name_256 { __be32 skc_daddr; __be32 skc_rcv_saddr; } ; 131 union __anonunion____missing_field_name_255 { __addrpair skc_addrpair; struct __anonstruct____missing_field_name_256 __annonCompField79; } ; 131 union __anonunion____missing_field_name_257 { unsigned int skc_hash; __u16 skc_u16hashes[2U]; } ; 131 struct __anonstruct____missing_field_name_259 { __be16 skc_dport; __u16 skc_num; } ; 131 union __anonunion____missing_field_name_258 { __portpair skc_portpair; struct __anonstruct____missing_field_name_259 __annonCompField82; } ; 131 union __anonunion____missing_field_name_260 { struct hlist_node skc_bind_node; struct hlist_nulls_node skc_portaddr_node; } ; 131 union __anonunion____missing_field_name_261 { struct hlist_node skc_node; struct hlist_nulls_node skc_nulls_node; } ; 131 struct sock_common { union __anonunion____missing_field_name_255 __annonCompField80; union __anonunion____missing_field_name_257 __annonCompField81; union __anonunion____missing_field_name_258 __annonCompField83; unsigned short skc_family; volatile unsigned char skc_state; unsigned char skc_reuse; unsigned char skc_reuseport; int skc_bound_dev_if; union __anonunion____missing_field_name_260 __annonCompField84; struct proto *skc_prot; struct net *skc_net; struct in6_addr skc_v6_daddr; struct in6_addr skc_v6_rcv_saddr; int skc_dontcopy_begin[0U]; union __anonunion____missing_field_name_261 __annonCompField85; int skc_tx_queue_mapping; atomic_t skc_refcnt; int skc_dontcopy_end[0U]; } ; 216 struct cg_proto ; 217 struct __anonstruct_sk_backlog_262 { atomic_t rmem_alloc; int len; struct sk_buff *head; struct sk_buff *tail; } ; 217 struct sock { struct sock_common __sk_common; socket_lock_t sk_lock; struct sk_buff_head sk_receive_queue; struct __anonstruct_sk_backlog_262 sk_backlog; int sk_forward_alloc; __u32 sk_rxhash; unsigned int sk_napi_id; unsigned int sk_ll_usec; atomic_t sk_drops; int sk_rcvbuf; struct sk_filter *sk_filter; struct socket_wq *sk_wq; struct xfrm_policy *sk_policy[2U]; unsigned long sk_flags; struct dst_entry *sk_rx_dst; struct dst_entry *sk_dst_cache; spinlock_t sk_dst_lock; atomic_t sk_wmem_alloc; atomic_t sk_omem_alloc; int sk_sndbuf; struct sk_buff_head sk_write_queue; unsigned char sk_shutdown; unsigned char sk_no_check; unsigned char sk_userlocks; unsigned char sk_protocol; unsigned short sk_type; int sk_wmem_queued; gfp_t sk_allocation; u32 sk_pacing_rate; u32 sk_max_pacing_rate; netdev_features_t sk_route_caps; netdev_features_t sk_route_nocaps; int sk_gso_type; unsigned int sk_gso_max_size; u16 sk_gso_max_segs; int sk_rcvlowat; unsigned long sk_lingertime; struct sk_buff_head sk_error_queue; struct proto *sk_prot_creator; rwlock_t sk_callback_lock; int sk_err; int sk_err_soft; unsigned short sk_ack_backlog; unsigned short sk_max_ack_backlog; __u32 sk_priority; __u32 sk_cgrp_prioidx; struct pid *sk_peer_pid; const struct cred *sk_peer_cred; long sk_rcvtimeo; long sk_sndtimeo; void *sk_protinfo; struct timer_list sk_timer; ktime_t sk_stamp; struct socket *sk_socket; void *sk_user_data; struct page_frag sk_frag; struct sk_buff *sk_send_head; __s32 sk_peek_off; int sk_write_pending; void *sk_security; __u32 sk_mark; u32 sk_classid; struct cg_proto *sk_cgrp; void (*sk_state_change)(struct sock *); void (*sk_data_ready)(struct sock *, int); void (*sk_write_space)(struct sock *); void (*sk_error_report)(struct sock *); int (*sk_backlog_rcv)(struct sock *, struct sk_buff *); void (*sk_destruct)(struct sock *); } ; 901 struct request_sock_ops ; 902 struct timewait_sock_ops ; 903 struct inet_hashinfo ; 904 struct raw_hashinfo ; 919 struct udp_table ; 919 union __anonunion_h_263 { struct inet_hashinfo *hashinfo; struct udp_table *udp_table; struct raw_hashinfo *raw_hash; } ; 919 struct proto { void (*close)(struct sock *, long); int (*connect)(struct sock *, struct sockaddr *, int); int (*disconnect)(struct sock *, int); struct sock * (*accept)(struct sock *, int, int *); int (*ioctl)(struct sock *, int, unsigned long); int (*init)(struct sock *); void (*destroy)(struct sock *); void (*shutdown)(struct sock *, int); int (*setsockopt)(struct sock *, int, int, char *, unsigned int); int (*getsockopt)(struct sock *, int, int, char *, int *); int (*compat_setsockopt)(struct sock *, int, int, char *, unsigned int); int (*compat_getsockopt)(struct sock *, int, int, char *, int *); int (*compat_ioctl)(struct sock *, unsigned int, unsigned long); int (*sendmsg)(struct kiocb *, struct sock *, struct msghdr *, size_t ); int (*recvmsg)(struct kiocb *, struct sock *, struct msghdr *, size_t , int, int, int *); int (*sendpage)(struct sock *, struct page *, int, size_t , int); int (*bind)(struct sock *, struct sockaddr *, int); int (*backlog_rcv)(struct sock *, struct sk_buff *); void (*release_cb)(struct sock *); void (*mtu_reduced)(struct sock *); void (*hash)(struct sock *); void (*unhash)(struct sock *); void (*rehash)(struct sock *); int (*get_port)(struct sock *, unsigned short); void (*clear_sk)(struct sock *, int); unsigned int inuse_idx; bool (*stream_memory_free)(const struct sock *); void (*enter_memory_pressure)(struct sock *); atomic_long_t *memory_allocated; struct percpu_counter *sockets_allocated; int *memory_pressure; long *sysctl_mem; int *sysctl_wmem; int *sysctl_rmem; int max_header; bool no_autobind; struct kmem_cache *slab; unsigned int obj_size; int slab_flags; struct percpu_counter *orphan_count; struct request_sock_ops *rsk_prot; struct timewait_sock_ops *twsk_prot; union __anonunion_h_263 h; struct module *owner; char name[32U]; struct list_head node; int (*init_cgroup)(struct mem_cgroup *, struct cgroup_subsys *); void (*destroy_cgroup)(struct mem_cgroup *); struct cg_proto * (*proto_cgroup)(struct mem_cgroup *); } ; 1044 struct cg_proto { struct res_counter memory_allocated; struct percpu_counter sockets_allocated; int memory_pressure; long sysctl_mem[3U]; unsigned long flags; struct mem_cgroup *memcg; } ; 169 struct request_sock_ops { int family; int obj_size; struct kmem_cache *slab; char *slab_name; int (*rtx_syn_ack)(struct sock *, struct request_sock *); void (*send_ack)(struct sock *, struct sk_buff *, struct request_sock *); void (*send_reset)(struct sock *, struct sk_buff *); void (*destructor)(struct request_sock *); void (*syn_ack_timeout)(struct sock *, struct request_sock *); } ; 47 struct request_sock { struct sock_common __req_common; struct request_sock *dl_next; u16 mss; u8 num_retrans; unsigned char cookie_ts; unsigned char num_timeout; u32 window_clamp; u32 rcv_wnd; u32 ts_recent; unsigned long expires; const struct request_sock_ops *rsk_ops; struct sock *sk; u32 secid; u32 peer_secid; } ; 372 struct timewait_sock_ops { struct kmem_cache *twsk_slab; char *twsk_slab_name; unsigned int twsk_obj_size; int (*twsk_unique)(struct sock *, struct sock *, void *); void (*twsk_destructor)(struct sock *); } ; 393 struct firmware { size_t size; const u8 *data; struct page **pages; void *priv; } ; 162 typedef u64 acpi_io_address; 419 typedef void *acpi_handle; 615 typedef u32 acpi_object_type; 865 struct __anonstruct_integer_270 { acpi_object_type type; u64 value; } ; 865 struct __anonstruct_string_271 { acpi_object_type type; u32 length; char *pointer; } ; 865 struct __anonstruct_buffer_272 { acpi_object_type type; u32 length; u8 *pointer; } ; 865 struct __anonstruct_package_273 { acpi_object_type type; u32 count; union acpi_object *elements; } ; 865 struct __anonstruct_reference_274 { acpi_object_type type; acpi_object_type actual_type; acpi_handle handle; } ; 865 struct __anonstruct_processor_275 { acpi_object_type type; u32 proc_id; acpi_io_address pblk_address; u32 pblk_length; } ; 865 struct __anonstruct_power_resource_276 { acpi_object_type type; u32 system_level; u32 resource_order; } ; 865 union acpi_object { acpi_object_type type; struct __anonstruct_integer_270 integer; struct __anonstruct_string_271 string; struct __anonstruct_buffer_272 buffer; struct __anonstruct_package_273 package; struct __anonstruct_reference_274 reference; struct __anonstruct_processor_275 processor; struct __anonstruct_power_resource_276 power_resource; } ; 109 struct acpi_driver ; 110 struct acpi_hotplug_profile { struct kobject kobj; int (*scan_dependent)(struct acpi_device *); bool enabled; bool demand_offline; } ; 131 struct acpi_scan_handler { const struct acpi_device_id *ids; struct list_head list_node; int (*attach)(struct acpi_device *, const struct acpi_device_id *); void (*detach)(struct acpi_device *); struct acpi_hotplug_profile hotplug; } ; 147 struct acpi_device_ops { int (*add)(struct acpi_device *); int (*remove)(struct acpi_device *); void (*notify)(struct acpi_device *, u32 ); } ; 153 struct acpi_driver { char name[80U]; char class[80U]; const struct acpi_device_id *ids; unsigned int flags; struct acpi_device_ops ops; struct device_driver drv; struct module *owner; } ; 165 struct acpi_device_status { unsigned char present; unsigned char enabled; unsigned char show_in_ui; unsigned char functional; unsigned char battery_present; unsigned int reserved; } ; 181 struct acpi_device_flags { unsigned char dynamic_status; unsigned char removable; unsigned char ejectable; unsigned char power_manageable; unsigned char match_driver; unsigned char initialized; unsigned char visited; unsigned char no_hotplug; unsigned int reserved; } ; 195 struct acpi_device_dir { struct proc_dir_entry *entry; } ; 206 typedef char acpi_bus_id[8U]; 207 typedef unsigned long acpi_bus_address; 208 typedef char acpi_device_name[40U]; 209 typedef char acpi_device_class[20U]; 215 struct acpi_pnp_type { unsigned char hardware_id; unsigned char bus_address; unsigned int reserved; } ; 221 struct acpi_device_pnp { acpi_bus_id bus_id; struct acpi_pnp_type type; acpi_bus_address bus_address; char *unique_id; struct list_head ids; acpi_device_name device_name; acpi_device_class device_class; union acpi_object *str_obj; unsigned long sun; } ; 237 struct acpi_device_power_flags { unsigned char explicit_get; unsigned char power_resources; unsigned char inrush_current; unsigned char power_removed; unsigned char ignore_parent; unsigned int reserved; } ; 250 struct __anonstruct_flags_277 { unsigned char valid; unsigned char os_accessible; unsigned char explicit_set; unsigned char reserved; } ; 250 struct acpi_device_power_state { struct __anonstruct_flags_277 flags; int power; int latency; struct list_head resources; } ; 262 struct acpi_device_power { int state; struct acpi_device_power_flags flags; struct acpi_device_power_state states[5U]; } ; 268 struct acpi_device_perf_flags { u8 reserved; } ; 274 struct __anonstruct_flags_278 { unsigned char valid; unsigned char reserved; } ; 274 struct acpi_device_perf_state { struct __anonstruct_flags_278 flags; u8 power; u8 performance; int latency; } ; 284 struct acpi_device_perf { int state; struct acpi_device_perf_flags flags; int state_count; struct acpi_device_perf_state *states; } ; 291 struct acpi_device_wakeup_flags { unsigned char valid; unsigned char run_wake; unsigned char notifier_present; } ; 298 struct acpi_device_wakeup { acpi_handle gpe_device; u64 gpe_number; u64 sleep_state; struct list_head resources; struct acpi_device_wakeup_flags flags; int prepare_count; } ; 314 struct acpi_device { int device_type; acpi_handle handle; struct acpi_device *parent; struct list_head children; struct list_head node; struct list_head wakeup_list; struct list_head del_list; struct acpi_device_status status; struct acpi_device_flags flags; struct acpi_device_pnp pnp; struct acpi_device_power power; struct acpi_device_wakeup wakeup; struct acpi_device_perf performance; struct acpi_device_dir dir; struct acpi_scan_handler *handler; struct acpi_driver *driver; void *driver_data; struct device dev; unsigned int physical_node_count; struct list_head physical_node_list; struct mutex physical_node_lock; void (*remove)(struct acpi_device *); } ; 1119 struct ieee80211_mcs_info { u8 rx_mask[10U]; __le16 rx_highest; u8 tx_params; u8 reserved[3U]; } ; 1144 struct ieee80211_ht_cap { __le16 cap_info; u8 ampdu_params_info; struct ieee80211_mcs_info mcs; __le16 extended_ht_cap_info; __le32 tx_BF_cap_info; u8 antenna_selection_info; } ; 1254 struct ieee80211_vht_mcs_info { __le16 rx_mcs_map; __le16 rx_highest; __le16 tx_mcs_map; __le16 tx_highest; } ; 1335 struct ieee80211_vht_cap { __le32 vht_cap_info; struct ieee80211_vht_mcs_info supp_mcs; } ; 42 struct lib80211_crypto_ops { const char *name; struct list_head list; void * (*init)(int); void (*deinit)(void *); int (*encrypt_mpdu)(struct sk_buff *, int, void *); int (*decrypt_mpdu)(struct sk_buff *, int, void *); int (*encrypt_msdu)(struct sk_buff *, int, void *); int (*decrypt_msdu)(struct sk_buff *, int, int, void *); int (*set_key)(void *, int, u8 *, void *); int (*get_key)(void *, int, u8 *, void *); void (*print_stats)(struct seq_file *, void *); unsigned long int (*get_flags)(void *); unsigned long int (*set_flags)(unsigned long, void *); int extra_mpdu_prefix_len; int extra_mpdu_postfix_len; int extra_msdu_prefix_len; int extra_msdu_postfix_len; struct module *owner; } ; 96 struct lib80211_crypt_data { struct list_head list; struct lib80211_crypto_ops *ops; void *priv; atomic_t refcnt; } ; 103 struct lib80211_crypt_info { char *name; spinlock_t *lock; struct lib80211_crypt_data *crypt[4U]; int tx_keyidx; struct list_head crypt_deinit_list; struct timer_list crypt_deinit_timer; int crypt_quiesced; } ; 405 struct tasklet_struct { struct tasklet_struct *next; unsigned long state; atomic_t count; void (*func)(unsigned long); unsigned long data; } ; 386 struct iw_param { __s32 value; __u8 fixed; __u8 disabled; __u16 flags; } ; 680 struct iw_point { void *pointer; __u16 length; __u16 flags; } ; 691 struct iw_freq { __s32 m; __s16 e; __u8 i; __u8 flags; } ; 708 struct iw_quality { __u8 qual; __u8 level; __u8 noise; __u8 updated; } ; 720 struct iw_discarded { __u32 nwid; __u32 code; __u32 fragment; __u32 retries; __u32 misc; } ; 736 struct iw_missed { __u32 beacon; } ; 842 struct iw_mlme { __u16 cmd; __u16 reason_code; struct sockaddr addr; } ; 882 struct iw_statistics { __u16 status; struct iw_quality qual; struct iw_discarded discard; struct iw_missed miss; } ; 897 union iwreq_data { char name[16U]; struct iw_point essid; struct iw_param nwid; struct iw_freq freq; struct iw_param sens; struct iw_param bitrate; struct iw_param txpower; struct iw_param rts; struct iw_param frag; __u32 mode; struct iw_param retry; struct iw_point encoding; struct iw_param power; struct iw_quality qual; struct sockaddr ap_addr; struct sockaddr addr; struct iw_param param; struct iw_point data; } ; 957 struct iw_range { __u32 throughput; __u32 min_nwid; __u32 max_nwid; __u16 old_num_channels; __u8 old_num_frequency; __u8 scan_capa; __u32 event_capa[6U]; __s32 sensitivity; struct iw_quality max_qual; struct iw_quality avg_qual; __u8 num_bitrates; __s32 bitrate[32U]; __s32 min_rts; __s32 max_rts; __s32 min_frag; __s32 max_frag; __s32 min_pmp; __s32 max_pmp; __s32 min_pmt; __s32 max_pmt; __u16 pmp_flags; __u16 pmt_flags; __u16 pm_capa; __u16 encoding_size[8U]; __u8 num_encoding_sizes; __u8 max_encoding_tokens; __u8 encoding_login_index; __u16 txpower_capa; __u8 num_txpower; __s32 txpower[8U]; __u8 we_version_compiled; __u8 we_version_source; __u16 retry_capa; __u16 retry_flags; __u16 r_time_flags; __s32 min_retry; __s32 max_retry; __s32 min_r_time; __s32 max_r_time; __u16 num_channels; __u8 num_frequency; struct iw_freq freq[32U]; __u32 enc_capa; } ; 1068 struct iw_priv_args { __u32 cmd; __u16 set_args; __u16 get_args; char name[16U]; } ; 30 struct iw_request_info { __u16 cmd; __u16 flags; } ; 314 typedef int (*iw_handler)(struct net_device *, struct iw_request_info *, union iwreq_data *, char *); 315 struct iw_handler_def { const iw_handler (**standard)(struct net_device *, struct iw_request_info *, union iwreq_data *, char *); __u16 num_standard; __u16 num_private; __u16 num_private_args; const iw_handler (**private)(struct net_device *, struct iw_request_info *, union iwreq_data *, char *); const struct iw_priv_args *private_args; struct iw_statistics * (*get_wireless_stats)(struct net_device *); } ; 381 struct iw_spy_data { int spy_number; u_char spy_address[8U][6U]; struct iw_quality spy_stat[8U]; struct iw_quality spy_thr_low; struct iw_quality spy_thr_high; u_char spy_thr_under[8U]; } ; 405 struct libipw_device ; 406 struct iw_public_data { struct iw_spy_data *spy_data; struct libipw_device *libipw; } ; 574 struct ieee80211_radiotap_header { u8 it_version; u8 it_pad; __le16 it_len; __le32 it_present; } ; 423 enum nl80211_iftype { NL80211_IFTYPE_UNSPECIFIED = 0, NL80211_IFTYPE_ADHOC = 1, NL80211_IFTYPE_STATION = 2, NL80211_IFTYPE_AP = 3, NL80211_IFTYPE_AP_VLAN = 4, NL80211_IFTYPE_WDS = 5, NL80211_IFTYPE_MONITOR = 6, NL80211_IFTYPE_MESH_POINT = 7, NL80211_IFTYPE_P2P_CLIENT = 8, NL80211_IFTYPE_P2P_GO = 9, NL80211_IFTYPE_P2P_DEVICE = 10, NUM_NL80211_IFTYPES = 11, NL80211_IFTYPE_MAX = 10 } ; 2157 enum nl80211_reg_initiator { NL80211_REGDOM_SET_BY_CORE = 0, NL80211_REGDOM_SET_BY_USER = 1, NL80211_REGDOM_SET_BY_DRIVER = 2, NL80211_REGDOM_SET_BY_COUNTRY_IE = 3 } ; 2203 enum nl80211_dfs_regions { NL80211_DFS_UNSET = 0, NL80211_DFS_FCC = 1, NL80211_DFS_ETSI = 2, NL80211_DFS_JP = 3 } ; 2210 enum nl80211_user_reg_hint_type { NL80211_USER_REG_HINT_USER = 0, NL80211_USER_REG_HINT_CELL_BASE = 1 } ; 2324 enum nl80211_chan_width { NL80211_CHAN_WIDTH_20_NOHT = 0, NL80211_CHAN_WIDTH_20 = 1, NL80211_CHAN_WIDTH_40 = 2, NL80211_CHAN_WIDTH_80 = 3, NL80211_CHAN_WIDTH_80P80 = 4, NL80211_CHAN_WIDTH_160 = 5, NL80211_CHAN_WIDTH_5 = 6, NL80211_CHAN_WIDTH_10 = 7 } ; 2365 enum nl80211_auth_type { NL80211_AUTHTYPE_OPEN_SYSTEM = 0, NL80211_AUTHTYPE_SHARED_KEY = 1, NL80211_AUTHTYPE_FT = 2, NL80211_AUTHTYPE_NETWORK_EAP = 3, NL80211_AUTHTYPE_SAE = 4, __NL80211_AUTHTYPE_NUM = 5, NL80211_AUTHTYPE_MAX = 4, NL80211_AUTHTYPE_AUTOMATIC = 5 } ; 2383 enum nl80211_mfp { NL80211_MFP_NO = 0, NL80211_MFP_REQUIRED = 1 } ; 3324 struct nl80211_wowlan_tcp_data_seq { __u32 start; __u32 offset; __u32 len; } ; 3437 struct nl80211_wowlan_tcp_data_token { __u32 offset; __u32 len; __u8 token_stream[]; } ; 3449 struct nl80211_wowlan_tcp_data_token_feature { __u32 min_len; __u32 max_len; __u32 bufsize; } ; 3667 enum nl80211_dfs_state { NL80211_DFS_USABLE = 0, NL80211_DFS_UNAVAILABLE = 1, NL80211_DFS_AVAILABLE = 2 } ; 3689 struct nl80211_vendor_cmd_info { __u32 vendor_id; __u32 subcmd; } ; 4039 enum environment_cap { ENVIRON_ANY = 0, ENVIRON_INDOOR = 1, ENVIRON_OUTDOOR = 2 } ; 4045 struct regulatory_request { struct callback_head callback_head; int wiphy_idx; enum nl80211_reg_initiator initiator; enum nl80211_user_reg_hint_type user_reg_hint_type; char alpha2[2U]; enum nl80211_dfs_regions dfs_region; bool intersect; bool processed; enum environment_cap country_ie_env; struct list_head list; } ; 96 struct ieee80211_freq_range { u32 start_freq_khz; u32 end_freq_khz; u32 max_bandwidth_khz; } ; 148 struct ieee80211_power_rule { u32 max_antenna_gain; u32 max_eirp; } ; 153 struct ieee80211_reg_rule { struct ieee80211_freq_range freq_range; struct ieee80211_power_rule power_rule; u32 flags; } ; 159 struct ieee80211_regdomain { struct callback_head callback_head; u32 n_reg_rules; char alpha2[2U]; enum nl80211_dfs_regions dfs_region; struct ieee80211_reg_rule reg_rules[]; } ; 167 struct wiphy ; 168 enum ieee80211_band { IEEE80211_BAND_2GHZ = 0, IEEE80211_BAND_5GHZ = 1, IEEE80211_BAND_60GHZ = 2, IEEE80211_NUM_BANDS = 3 } ; 186 struct ieee80211_channel { enum ieee80211_band band; u16 center_freq; u16 hw_value; u32 flags; int max_antenna_gain; int max_power; int max_reg_power; bool beacon_found; u32 orig_flags; int orig_mag; int orig_mpwr; enum nl80211_dfs_state dfs_state; unsigned long dfs_state_entered; } ; 179 struct ieee80211_rate { u32 flags; u16 bitrate; u16 hw_value; u16 hw_value_short; } ; 222 struct ieee80211_sta_ht_cap { u16 cap; bool ht_supported; u8 ampdu_factor; u8 ampdu_density; struct ieee80211_mcs_info mcs; } ; 242 struct ieee80211_sta_vht_cap { bool vht_supported; u32 cap; struct ieee80211_vht_mcs_info vht_mcs; } ; 258 struct ieee80211_supported_band { struct ieee80211_channel *channels; struct ieee80211_rate *bitrates; enum ieee80211_band band; int n_channels; int n_bitrates; struct ieee80211_sta_ht_cap ht_cap; struct ieee80211_sta_vht_cap vht_cap; } ; 337 struct cfg80211_chan_def { struct ieee80211_channel *chan; enum nl80211_chan_width width; u32 center_freq1; u32 center_freq2; } ; 550 struct cfg80211_crypto_settings { u32 wpa_versions; u32 cipher_group; int n_ciphers_pairwise; u32 ciphers_pairwise[5U]; int n_akm_suites; u32 akm_suites[2U]; bool control_port; __be16 control_port_ethertype; bool control_port_no_encrypt; } ; 613 struct mac_address { u8 addr[6U]; } ; 1446 enum cfg80211_signal_type { CFG80211_SIGNAL_TYPE_NONE = 0, CFG80211_SIGNAL_TYPE_MBM = 1, CFG80211_SIGNAL_TYPE_UNSPEC = 2 } ; 1647 struct cfg80211_ibss_params { u8 *ssid; u8 *bssid; struct cfg80211_chan_def chandef; u8 *ie; u8 ssid_len; u8 ie_len; u16 beacon_interval; u32 basic_rates; bool channel_fixed; bool privacy; bool control_port; bool userspace_handles_dfs; int mcast_rate[3U]; struct ieee80211_ht_cap ht_capa; struct ieee80211_ht_cap ht_capa_mask; } ; 1695 struct cfg80211_connect_params { struct ieee80211_channel *channel; u8 *bssid; u8 *ssid; size_t ssid_len; enum nl80211_auth_type auth_type; u8 *ie; size_t ie_len; bool privacy; enum nl80211_mfp mfp; struct cfg80211_crypto_settings crypto; const u8 *key; u8 key_len; u8 key_idx; u32 flags; int bg_scan_period; struct ieee80211_ht_cap ht_capa; struct ieee80211_ht_cap ht_capa_mask; struct ieee80211_vht_cap vht_capa; struct ieee80211_vht_cap vht_capa_mask; } ; 1786 struct cfg80211_pkt_pattern { u8 *mask; u8 *pattern; int pattern_len; int pkt_offset; } ; 1803 struct cfg80211_wowlan_tcp { struct socket *sock; __be32 src; __be32 dst; u16 src_port; u16 dst_port; u8 dst_mac[6U]; int payload_len; const u8 *payload; struct nl80211_wowlan_tcp_data_seq payload_seq; u32 data_interval; u32 wake_len; const u8 *wake_data; const u8 *wake_mask; u32 tokens_size; struct nl80211_wowlan_tcp_data_token payload_tok; } ; 1838 struct cfg80211_wowlan { bool any; bool disconnect; bool magic_pkt; bool gtk_rekey_failure; bool eap_identity_req; bool four_way_handshake; bool rfkill_release; struct cfg80211_pkt_pattern *patterns; struct cfg80211_wowlan_tcp *tcp; int n_patterns; } ; 2527 struct ieee80211_iface_limit { u16 max; u16 types; } ; 2588 struct ieee80211_iface_combination { const struct ieee80211_iface_limit *limits; u32 num_different_channels; u16 max_interfaces; u8 n_limits; bool beacon_int_infra_match; u8 radar_detect_widths; } ; 2654 struct ieee80211_txrx_stypes { u16 tx; u16 rx; } ; 2669 struct wiphy_wowlan_tcp_support { const struct nl80211_wowlan_tcp_data_token_feature *tok; u32 data_payload_max; u32 data_interval_max; u32 wake_payload_max; bool seq; } ; 2693 struct wiphy_wowlan_support { u32 flags; int n_patterns; int pattern_max_len; int pattern_min_len; int max_pkt_offset; const struct wiphy_wowlan_tcp_support *tcp; } ; 2712 struct wiphy_coalesce_support { int n_rules; int max_delay; int n_patterns; int pattern_max_len; int pattern_min_len; int max_pkt_offset; } ; 2737 struct wiphy_vendor_command { struct nl80211_vendor_cmd_info info; u32 flags; int (*doit)(struct wiphy *, struct wireless_dev *, const void *, int); } ; 2758 struct wiphy { u8 perm_addr[6U]; u8 addr_mask[6U]; struct mac_address *addresses; const struct ieee80211_txrx_stypes *mgmt_stypes; const struct ieee80211_iface_combination *iface_combinations; int n_iface_combinations; u16 software_iftypes; u16 n_addresses; u16 interface_modes; u16 max_acl_mac_addrs; u32 flags; u32 regulatory_flags; u32 features; u32 ap_sme_capa; enum cfg80211_signal_type signal_type; int bss_priv_size; u8 max_scan_ssids; u8 max_sched_scan_ssids; u8 max_match_sets; u16 max_scan_ie_len; u16 max_sched_scan_ie_len; int n_cipher_suites; const u32 *cipher_suites; u8 retry_short; u8 retry_long; u32 frag_threshold; u32 rts_threshold; u8 coverage_class; char fw_version[32U]; u32 hw_version; const struct wiphy_wowlan_support *wowlan; struct cfg80211_wowlan *wowlan_config; u16 max_remain_on_channel_duration; u8 max_num_pmkids; u32 available_antennas_tx; u32 available_antennas_rx; u32 probe_resp_offload; const u8 *extended_capabilities; const u8 *extended_capabilities_mask; u8 extended_capabilities_len; const void *privid; struct ieee80211_supported_band *bands[3U]; void (*reg_notifier)(struct wiphy *, struct regulatory_request *); const struct ieee80211_regdomain *regd; struct device dev; bool registered; struct dentry *debugfsdir; const struct ieee80211_ht_cap *ht_capa_mod_mask; const struct ieee80211_vht_cap *vht_capa_mod_mask; struct net *_net; const struct iw_handler_def *wext; const struct wiphy_coalesce_support *coalesce; const struct wiphy_vendor_command *vendor_commands; const struct nl80211_vendor_cmd_info *vendor_events; int n_vendor_commands; int n_vendor_events; char priv[0U]; } ; 3103 struct cfg80211_conn ; 3104 struct cfg80211_internal_bss ; 3105 struct cfg80211_cached_keys ; 3106 struct __anonstruct_wext_317 { struct cfg80211_ibss_params ibss; struct cfg80211_connect_params connect; struct cfg80211_cached_keys *keys; u8 *ie; size_t ie_len; u8 bssid[6U]; u8 prev_bssid[6U]; u8 ssid[32U]; s8 default_key; s8 default_mgmt_key; bool prev_bssid_valid; } ; 3106 struct wireless_dev { struct wiphy *wiphy; enum nl80211_iftype iftype; struct list_head list; struct net_device *netdev; u32 identifier; struct list_head mgmt_registrations; spinlock_t mgmt_registrations_lock; struct mutex mtx; bool use_4addr; bool p2p_started; u8 address[6U]; u8 ssid[32U]; u8 ssid_len; u8 mesh_id_len; u8 mesh_id_up_len; struct cfg80211_conn *conn; struct cfg80211_cached_keys *connect_keys; struct list_head event_list; spinlock_t event_lock; struct cfg80211_internal_bss *current_bss; struct cfg80211_chan_def preset_chandef; struct ieee80211_channel *channel; bool ibss_fixed; bool ibss_dfs_possible; bool ps; int ps_timeout; int beacon_interval; u32 ap_unexpected_nlportid; bool cac_started; unsigned long cac_start_time; struct __anonstruct_wext_317 wext; } ; 149 struct libipw_rx_stats { u32 mac_time; s8 rssi; u8 signal; u8 noise; u16 rate; u8 received_channel; u8 control; u8 mask; u8 freq; u16 len; u64 tsf; u32 beacon_time; } ; 241 struct libipw_frag_entry { unsigned long first_frag_time; unsigned int seq; unsigned int last_frag; struct sk_buff *skb; u8 src_addr[6U]; u8 dst_addr[6U]; } ; 256 struct libipw_stats { unsigned int tx_unicast_frames; unsigned int tx_multicast_frames; unsigned int tx_fragments; unsigned int tx_unicast_octets; unsigned int tx_multicast_octets; unsigned int tx_deferred_transmissions; unsigned int tx_single_retry_frames; unsigned int tx_multiple_retry_frames; unsigned int tx_retry_limit_exceeded; unsigned int tx_discards; unsigned int rx_unicast_frames; unsigned int rx_multicast_frames; unsigned int rx_fragments; unsigned int rx_unicast_octets; unsigned int rx_multicast_octets; unsigned int rx_fcs_errors; unsigned int rx_discards_no_buffer; unsigned int tx_discards_wrong_sa; unsigned int rx_discards_undecryptable; unsigned int rx_message_in_msg_fragments; unsigned int rx_message_in_bad_msg_fragments; } ; 280 struct libipw_security { unsigned char active_key; unsigned char enabled; unsigned char unicast_uses_group; unsigned char encrypt; u8 auth_mode; u8 encode_alg[4U]; u8 key_sizes[4U]; u8 keys[4U][32U]; u8 level; u16 flags; } ; 351 struct libipw_hdr_3addr { __le16 frame_ctl; __le16 duration_id; u8 addr1[6U]; u8 addr2[6U]; u8 addr3[6U]; __le16 seq_ctl; u8 payload[0U]; } ; 361 struct libipw_hdr_4addr { __le16 frame_ctl; __le16 duration_id; u8 addr1[6U]; u8 addr2[6U]; u8 addr3[6U]; __le16 seq_ctl; u8 addr4[6U]; u8 payload[0U]; } ; 383 struct libipw_info_element { u8 id; u8 len; u8 data[0U]; } ; 389 struct libipw_auth { struct libipw_hdr_3addr header; __le16 algorithm; __le16 transaction; __le16 status; struct libipw_info_element info_element[0U]; } ; 415 struct libipw_channel_switch { u8 id; u8 len; u8 mode; u8 channel; u8 count; } ; 423 struct libipw_action_exchange { u8 token; struct libipw_info_element info_element[0U]; } ; 433 union __anonunion_format_318 { struct libipw_action_exchange exchange; struct libipw_channel_switch channel_switch; } ; 433 struct libipw_action { struct libipw_hdr_3addr header; u8 category; u8 action; union __anonunion_format_318 format; } ; 437 struct libipw_disassoc { struct libipw_hdr_3addr header; __le16 reason; } ; 442 struct libipw_probe_request { struct libipw_hdr_3addr header; struct libipw_info_element info_element[0U]; } ; 451 struct libipw_probe_response { struct libipw_hdr_3addr header; __le32 time_stamp[2U]; __le16 beacon_interval; __le16 capability; struct libipw_info_element info_element[0U]; } ; 472 struct libipw_reassoc_request { struct libipw_hdr_3addr header; __le16 capability; __le16 listen_interval; u8 current_ap[6U]; struct libipw_info_element info_element[0U]; } ; 480 struct libipw_assoc_response { struct libipw_hdr_3addr header; __le16 capability; __le16 status; __le16 aid; struct libipw_info_element info_element[0U]; } ; 489 struct libipw_txb { u8 nr_frags; u8 encrypted; u8 rts_included; u8 reserved; u16 frag_size; u16 payload_size; struct sk_buff *fragments[0U]; } ; 563 struct libipw_qos_parameters { __le16 cw_min[4U]; __le16 cw_max[4U]; u8 aifs[4U]; u8 flag[4U]; __le16 tx_op_limit[4U]; } ; 571 struct libipw_qos_data { struct libipw_qos_parameters parameters; int active; int supported; u8 param_count; u8 old_param_count; } ; 579 struct libipw_tim_parameters { u8 tim_count; u8 tim_period; } ; 584 struct libipw_tpc_report { u8 transmit_power; u8 link_margin; } ; 591 struct libipw_channel_map { u8 channel; u8 map; } ; 596 struct libipw_ibss_dfs { struct libipw_info_element ie; u8 owner[6U]; u8 recovery_interval; struct libipw_channel_map channel_map[0U]; } ; 603 struct libipw_csa { u8 mode; u8 channel; u8 count; } ; 609 struct libipw_quiet { u8 count; u8 period; u8 duration; u8 offset; } ; 616 struct libipw_network { u8 bssid[6U]; u8 channel; u8 ssid[33U]; u8 ssid_len; struct libipw_qos_data qos_data; struct libipw_rx_stats stats; u16 capability; u8 rates[12U]; u8 rates_len; u8 rates_ex[16U]; u8 rates_ex_len; unsigned long last_scanned; u8 mode; u32 flags; u32 last_associate; u32 time_stamp[2U]; u16 beacon_interval; u16 listen_interval; u16 atim_window; u8 erp_value; u8 wpa_ie[64U]; size_t wpa_ie_len; u8 rsn_ie[64U]; size_t rsn_ie_len; struct libipw_tim_parameters tim; u8 power_constraint; struct libipw_tpc_report tpc_report; struct libipw_ibss_dfs *ibss_dfs; struct libipw_csa csa; struct libipw_quiet quiet; struct list_head list; } ; 669 enum libipw_state { LIBIPW_UNINITIALIZED = 0, LIBIPW_INITIALIZED = 1, LIBIPW_ASSOCIATING = 2, LIBIPW_ASSOCIATED = 3, LIBIPW_AUTHENTICATING = 4, LIBIPW_AUTHENTICATED = 5, LIBIPW_SHUTDOWN = 6 } ; 689 struct libipw_channel { u32 freq; u8 channel; u8 flags; u8 max_power; } ; 713 struct libipw_geo { u8 name[4U]; u8 bg_channels; u8 a_channels; struct libipw_channel bg[14U]; struct libipw_channel a[132U]; } ; 721 struct libipw_device { struct net_device *dev; struct wireless_dev wdev; struct libipw_security sec; struct libipw_stats ieee_stats; struct libipw_geo geo; struct ieee80211_supported_band bg_band; struct ieee80211_supported_band a_band; struct list_head network_free_list; struct list_head network_list; struct libipw_network *networks[128U]; int scans; int scan_age; int iw_mode; struct iw_spy_data spy_data; spinlock_t lock; int tx_headroom; u32 config; int open_wep; int host_encrypt; int host_encrypt_msdu; int host_decrypt; int host_mc_decrypt; int host_strip_iv_icv; int host_open_frag; int ieee802_1x; int wpa_enabled; int drop_unencrypted; int privacy_invoked; size_t wpa_ie_len; u8 *wpa_ie; struct lib80211_crypt_info crypt_info; int bcrx_sta_key; struct libipw_frag_entry frag_cache[4U]; unsigned int frag_next_idx; u16 fts; u16 rts; u8 bssid[6U]; enum libipw_state state; int mode; int modulation; int freq_band; int abg_true; int perfect_rssi; int worst_rssi; u16 prev_seq_ctl; void (*set_security)(struct net_device *, struct libipw_security *); netdev_tx_t (*hard_start_xmit)(struct libipw_txb *, struct net_device *, int); int (*is_queue_full)(struct net_device *, int); int (*handle_management)(struct net_device *, struct libipw_network *, u16 ); int (*is_qos_active)(struct net_device *, struct sk_buff *); int (*handle_auth)(struct net_device *, struct libipw_auth *); int (*handle_deauth)(struct net_device *, struct libipw_disassoc *); int (*handle_action)(struct net_device *, struct libipw_action *, struct libipw_rx_stats *); int (*handle_disassoc)(struct net_device *, struct libipw_disassoc *); int (*handle_beacon)(struct net_device *, struct libipw_probe_response *, struct libipw_network *); int (*handle_probe_response)(struct net_device *, struct libipw_probe_response *, struct libipw_network *); int (*handle_probe_request)(struct net_device *, struct libipw_probe_request *, struct libipw_rx_stats *); int (*handle_assoc_response)(struct net_device *, struct libipw_assoc_response *, struct libipw_network *); int (*handle_assoc_request)(struct net_device *); int (*handle_reassoc_request)(struct net_device *, struct libipw_reassoc_request *); u8 priv[0U]; } ; 1012 struct ipw2100_priv ; 1013 struct ipw2100_tx_packet ; 1014 struct ipw2100_rx_packet ; 140 struct __anonstruct_fields_320 { unsigned char nlf; unsigned char txType; unsigned char intEnabled; unsigned char reserved; } ; 140 union __anonunion_info_319 { struct __anonstruct_fields_320 fields; u8 field; } ; 140 struct bd_status { union __anonunion_info_319 info; } ; 159 struct ipw2100_bd { u32 host_addr; u32 buf_length; struct bd_status status; u8 num_fragments; u8 reserved[6U]; } ; 169 struct ipw2100_bd_queue { struct ipw2100_bd *drv; dma_addr_t nic; u32 size; u32 entries; u32 available; u32 oldest; u32 next; } ; 202 struct ipw2100_status { u32 frame_size; u16 status_fields; u8 flags; u8 rssi; } ; 227 struct ipw2100_status_queue { struct ipw2100_status *drv; dma_addr_t nic; u32 size; } ; 238 struct __anonstruct_fixed_ies_321 { u16 capab_info; u16 listen_interval; u8 current_ap[6U]; } ; 238 struct ipw2100_wpa_assoc_frame { u16 fixed_ie_mask; struct __anonstruct_fixed_ies_321 fixed_ies; u32 var_ie_len; u8 var_ie[384U]; } ; 258 struct ipw2100_cmd_header { u32 host_command_reg; u32 host_command_reg1; u32 sequence; u32 host_command_len_reg; u32 host_command_params_reg[100U]; u32 cmd_status_reg; u32 cmd_status_params_reg[3U]; u32 rxq_base_ptr; u32 rxq_next_ptr; u32 rxq_host_ptr; u32 txq_base_ptr; u32 txq_next_ptr; u32 txq_host_ptr; u32 tx_status_reg; u32 reserved; u32 status_change_reg; u32 reserved1[3U]; u32 *ordinal1_ptr; u32 *ordinal2_ptr; } ; 288 struct ipw2100_data_header { u32 host_command_reg; u32 host_command_reg1; u8 encrypted; u8 needs_encryption; u8 wep_index; u8 key_size; u8 key[16U]; u8 reserved[10U]; u8 src_addr[6U]; u8 dst_addr[6U]; u16 fragment_size; } ; 302 struct host_command { u32 host_command; u32 host_command1; u32 host_command_sequence; u32 host_command_length; u32 host_command_parameters[100U]; } ; 325 struct __anonstruct_c_struct_323 { struct ipw2100_cmd_header *cmd; dma_addr_t cmd_phys; } ; 325 struct __anonstruct_d_struct_324 { struct ipw2100_data_header *data; dma_addr_t data_phys; struct libipw_txb *txb; } ; 325 union __anonunion_info_322 { struct __anonstruct_c_struct_323 c_struct; struct __anonstruct_d_struct_324 d_struct; } ; 325 struct ipw2100_tx_packet { int type; int index; union __anonunion_info_322 info; int jiffy_start; struct list_head list; } ; 344 struct ipw2100_rx ; 344 struct ipw2100_rx_packet { struct ipw2100_rx *rxp; dma_addr_t dma_addr; int jiffy_start; struct sk_buff *skb; struct list_head list; } ; 352 struct ipw2100_ordinals { u32 table1_addr; u32 table2_addr; u32 table1_size; u32 table2_size; } ; 369 struct ipw2100_notification { u32 hnhdr_subtype; u32 hnhdr_size; } ; 375 struct statistic { int value; int hi; int lo; } ; 406 struct ipw2100_priv { void *ioaddr; int stop_hang_check; int stop_rf_kill; struct libipw_device *ieee; unsigned long status; unsigned long config; unsigned long capability; int resets; int reset_backoff; u8 essid[32U]; u8 essid_len; u8 bssid[6U]; u8 channel; int last_mode; unsigned long connect_start; unsigned long last_reset; u32 channel_mask; u32 fatal_error; u32 fatal_errors[5U]; u32 fatal_index; int eeprom_version; int firmware_version; unsigned long hw_features; int hangs; u32 last_rtc; int dump_raw; u8 *snapshot[48U]; u8 mandatory_bssid_mac[6U]; u8 mac_addr[6U]; int power_mode; int messages_sent; int short_retry_limit; int long_retry_limit; u32 rts_threshold; u32 frag_threshold; int in_isr; u32 tx_rates; int tx_power; u32 beacon_interval; char nick[33U]; struct ipw2100_status_queue status_queue; struct statistic txq_stat; struct statistic rxq_stat; struct ipw2100_bd_queue rx_queue; struct ipw2100_bd_queue tx_queue; struct ipw2100_rx_packet *rx_buffers; struct statistic fw_pend_stat; struct list_head fw_pend_list; struct statistic msg_free_stat; struct statistic msg_pend_stat; struct list_head msg_free_list; struct list_head msg_pend_list; struct ipw2100_tx_packet *msg_buffers; struct statistic tx_free_stat; struct statistic tx_pend_stat; struct list_head tx_free_list; struct list_head tx_pend_list; struct ipw2100_tx_packet *tx_buffers; struct ipw2100_ordinals ordinals; struct pci_dev *pci_dev; struct proc_dir_entry *dir_dev; struct net_device *net_dev; struct iw_statistics wstats; struct iw_public_data wireless_data; struct tasklet_struct irq_tasklet; struct delayed_work reset_work; struct delayed_work security_work; struct delayed_work wx_event_work; struct delayed_work hang_check; struct delayed_work rf_kill; struct delayed_work scan_event; int user_requested_scan; unsigned long suspend_at; unsigned long suspend_time; u32 interrupts; int tx_interrupts; int rx_interrupts; int inta_other; spinlock_t low_lock; struct mutex action_mutex; struct mutex adapter_mutex; wait_queue_head_t wait_command_queue; } ; 599 union __anonunion_rx_data_325 { unsigned char payload[2340U]; struct libipw_hdr_4addr header; u32 status; struct ipw2100_notification notification; struct ipw2100_cmd_header command; } ; 599 struct ipw2100_rx { union __anonunion_rx_data_325 rx_data; } ; 1141 struct ipw2100_fw_chunk_set { const void *data; unsigned long size; } ; 1146 struct ipw2100_fw { int version; struct ipw2100_fw_chunk_set fw; struct ipw2100_fw_chunk_set uc; const struct firmware *fw_entry; } ; 2212 struct ipw2100_status_indicator { int status; void (*cb)(struct ipw2100_priv *, u32 ); char *name; } ; 2547 struct ipw_rt_hdr { struct ieee80211_radiotap_header rt_hdr; s8 rt_dbmsignal; } ; 3574 struct __anonstruct_hw_data_330 { u32 addr; const char *name; } ; 3584 struct __anonstruct_nic_data_331 { u32 addr; const char *name; size_t size; } ; 3592 struct __anonstruct_ord_data_332 { u8 index; const char *name; const char *desc; } ; 5173 struct security_info_params { u32 allowed_ciphers; u16 version; u8 auth_mode; u8 replay_counters_number; u8 unicast_using_group; } ; 5370 struct ipw2100_wep_key { u8 idx; u8 len; u8 key[13U]; } ; 8345 struct ipw2100_fw_header { short version; short mode; unsigned int fw_size; unsigned int uc_size; } ; 8529 struct symbol_alive_response { u8 cmd_id; u8 seq_num; u8 ucode_rev; u8 eeprom_valid; u16 valid_flags; u8 IEEE_addr[6U]; u16 flags; u16 pcb_rev; u16 clock_settle_time; u16 powerup_settle_time; u16 hop_settle_time; u8 date[3U]; u8 time[2U]; u8 ucode_valid; } ; 38 typedef int Set; 1 long int __builtin_expect(long, long); 1 void * __builtin_memcpy(void *, const void *, unsigned long); 7 dma_addr_t ldv_dma_map_single_attrs(struct device *dev, void *ptr, size_t size, enum dma_data_direction dir, struct dma_attrs *attrs); 33 extern struct module __this_module; 358 extern struct pv_irq_ops pv_irq_ops; 71 void set_bit(long nr, volatile unsigned long *addr); 109 void clear_bit(long nr, volatile unsigned long *addr); 206 int test_and_set_bit(long nr, volatile unsigned long *addr); 252 int test_and_clear_bit(long nr, volatile unsigned long *addr); 310 int constant_test_bit(long nr, const volatile unsigned long *addr); 132 int printk(const char *, ...); 253 int kstrtoull(const char *, unsigned int, unsigned long long *); 272 int kstrtoul(const char *s, unsigned int base, unsigned long *res); 314 int kstrtouint(const char *, unsigned int, unsigned int *); 327 int kstrtou32(const char *s, unsigned int base, u32 *res); 388 int sprintf(char *, const char *, ...); 391 int snprintf(char *, size_t , const char *, ...); 24 void INIT_LIST_HEAD(struct list_head *list); 47 void __list_add(struct list_head *, struct list_head *, struct list_head *); 74 void list_add_tail(struct list_head *new, struct list_head *head); 112 void list_del(struct list_head *); 186 int list_empty(const struct list_head *head); 88 void __bad_percpu_size(); 71 void warn_slowpath_null(const char *, const int); 34 void * __memcpy(void *, const void *, size_t ); 55 void * memset(void *, int, size_t ); 58 void * memmove(void *, const void *, size_t ); 60 int memcmp(const void *, const void *, size_t ); 61 size_t strlen(const char *); 62 char * strcpy(char *, const char *); 26 size_t strlcpy(char *, const char *, size_t ); 80 __kernel_size_t strnlen(const char *, __kernel_size_t ); 117 void * kmemdup(const void *, size_t , gfp_t ); 802 unsigned long int arch_local_save_flags(); 155 int arch_irqs_disabled_flags(unsigned long flags); 8 extern int __preempt_count; 20 int preempt_count(); 279 void lockdep_init_map(struct lockdep_map *, const char *, struct lock_class_key *, int); 93 void __raw_spin_lock_init(raw_spinlock_t *, const char *, struct lock_class_key *); 22 void _raw_spin_lock(raw_spinlock_t *); 32 unsigned long int _raw_spin_lock_irqsave(raw_spinlock_t *); 39 void _raw_spin_unlock(raw_spinlock_t *); 43 void _raw_spin_unlock_irqrestore(raw_spinlock_t *, unsigned long); 290 raw_spinlock_t * spinlock_check(spinlock_t *lock); 301 void spin_lock(spinlock_t *lock); 341 void spin_unlock(spinlock_t *lock); 356 void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags); 68 void __init_waitqueue_head(wait_queue_head_t *, const char *, struct lock_class_key *); 144 void __wake_up(wait_queue_head_t *, unsigned int, int, void *); 822 long int prepare_to_wait_event(wait_queue_head_t *, wait_queue_t *, int); 823 void finish_wait(wait_queue_head_t *, wait_queue_t *); 119 void __mutex_init(struct mutex *, const char *, struct lock_class_key *); 138 void mutex_lock_nested(struct mutex *, unsigned int); 174 void mutex_unlock(struct mutex *); 132 unsigned long int get_seconds(); 77 extern volatile unsigned long jiffies; 303 unsigned long int msecs_to_jiffies(const unsigned int); 94 void init_timer_key(struct timer_list *, unsigned int, const char *, struct lock_class_key *); 260 unsigned long int round_jiffies_relative(unsigned long); 20 void delayed_work_timer_fn(unsigned long); 192 void __init_work(struct work_struct *, int); 375 extern struct workqueue_struct *system_wq; 466 bool queue_delayed_work_on(int, struct workqueue_struct *, struct delayed_work *, unsigned long); 468 bool mod_delayed_work_on(int, struct workqueue_struct *, struct delayed_work *, unsigned long); 483 bool cancel_delayed_work(struct delayed_work *); 484 bool cancel_delayed_work_sync(struct delayed_work *); 518 bool queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *dwork, unsigned long delay); 533 bool mod_delayed_work(struct workqueue_struct *wq, struct delayed_work *dwork, unsigned long delay); 591 bool schedule_delayed_work(struct delayed_work *dwork, unsigned long delay); 55 unsigned int readl(const volatile void *addr); 28 unsigned int ioread8(void *); 29 unsigned int ioread16(void *); 31 unsigned int ioread32(void *); 34 void iowrite8(u8 , void *); 35 void iowrite16(u16 , void *); 37 void iowrite32(u32 , void *); 72 void pci_iounmap(struct pci_dev *, void *); 17 void * pci_iomap(struct pci_dev *, int, unsigned long); 142 void kfree(const void *); 302 void * __kmalloc(size_t , gfp_t ); 222 int sysfs_create_group(struct kobject *, const struct attribute_group *); 228 void sysfs_remove_group(struct kobject *, const struct attribute_group *); 84 const char * kobject_name(const struct kobject *kobj); 441 void * kmalloc(size_t size, gfp_t flags); 560 void * kmalloc_array(size_t n, size_t size, gfp_t flags); 573 void * kcalloc(size_t n, size_t size, gfp_t flags); 280 int driver_create_file(struct device_driver *, const struct driver_attribute *); 282 void driver_remove_file(struct device_driver *, const struct driver_attribute *); 798 const char * dev_name(const struct device *dev); 913 void * dev_get_drvdata(const struct device *); 914 int dev_set_drvdata(struct device *, void *); 63 int valid_dma_direction(int dma_direction); 70 int is_device_dma_capable(struct device *dev); 44 void debug_dma_unmap_page(struct device *, dma_addr_t , size_t , int, bool ); 53 void debug_dma_alloc_coherent(struct device *, size_t , dma_addr_t , void *); 56 void debug_dma_free_coherent(struct device *, size_t , void *, dma_addr_t ); 59 void debug_dma_sync_single_for_cpu(struct device *, dma_addr_t , size_t , int); 63 void debug_dma_sync_single_for_device(struct device *, dma_addr_t , size_t , int); 27 extern struct device x86_dma_fallback_dev; 30 extern struct dma_map_ops *dma_ops; 32 struct dma_map_ops * get_dma_ops(struct device *dev); 32 dma_addr_t ldv_dma_map_single_attrs_2(struct device *dev, void *ptr, size_t size, enum dma_data_direction dir, struct dma_attrs *attrs); 33 void dma_unmap_single_attrs(struct device *dev, dma_addr_t addr, size_t size, enum dma_data_direction dir, struct dma_attrs *attrs); 109 void dma_sync_single_for_cpu(struct device *dev, dma_addr_t addr, size_t size, enum dma_data_direction dir); 121 void dma_sync_single_for_device(struct device *dev, dma_addr_t addr, size_t size, enum dma_data_direction dir); 65 int dma_set_mask(struct device *, u64 ); 107 unsigned long int dma_alloc_coherent_mask(struct device *dev, gfp_t gfp); 119 gfp_t dma_alloc_coherent_gfp_flags(struct device *dev, gfp_t gfp); 135 void * dma_alloc_attrs(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t gfp, struct dma_attrs *attrs); 164 void dma_free_attrs(struct device *dev, size_t size, void *vaddr, dma_addr_t bus, struct dma_attrs *attrs); 654 void consume_skb(struct sk_buff *); 1369 bool skb_is_nonlinear(const struct sk_buff *skb); 1494 unsigned char * skb_put(struct sk_buff *, unsigned int); 1567 int skb_tailroom(const struct sk_buff *skb); 1933 struct sk_buff * __netdev_alloc_skb(struct net_device *, unsigned int, gfp_t ); 1949 struct sk_buff * netdev_alloc_skb(struct net_device *dev, unsigned int length); 1963 struct sk_buff * dev_alloc_skb(unsigned int length); 2504 void skb_copy_from_linear_data(const struct sk_buff *skb, void *to, const unsigned int len); 113 void pm_qos_add_request(struct pm_qos_request *, int, s32 ); 115 void pm_qos_update_request(struct pm_qos_request *, s32 ); 119 void pm_qos_remove_request(struct pm_qos_request *); 10 void __const_udelay(unsigned long); 372 long int schedule_timeout(long); 375 long int schedule_timeout_uninterruptible(long); 1537 struct netdev_queue * netdev_get_tx_queue(const struct net_device *dev, unsigned int index); 1603 void * netdev_priv(const struct net_device *dev); 1888 int netpoll_trap(); 2050 void __netif_schedule(struct Qdisc *); 2066 void netif_tx_start_queue(struct netdev_queue *dev_queue); 2077 void netif_start_queue(struct net_device *dev); 2092 void netif_tx_wake_queue(struct netdev_queue *dev_queue); 2111 void netif_wake_queue(struct net_device *dev); 2126 void netif_tx_stop_queue(struct netdev_queue *dev_queue); 2142 void netif_stop_queue(struct net_device *dev); 2307 bool netif_running(const struct net_device *dev); 2472 void __dev_kfree_skb_any(struct sk_buff *, enum skb_free_reason ); 2503 void dev_kfree_skb_any(struct sk_buff *skb); 2610 void netif_carrier_on(struct net_device *); 2612 void netif_carrier_off(struct net_device *); 2680 void netif_device_detach(struct net_device *); 2682 void netif_device_attach(struct net_device *); 2903 int register_netdev(struct net_device *); 2904 void unregister_netdev(struct net_device *); 824 int pci_bus_read_config_dword(struct pci_bus *, unsigned int, int, u32 *); 830 int pci_bus_write_config_dword(struct pci_bus *, unsigned int, int, u32 ); 842 int pci_read_config_dword(const struct pci_dev *dev, int where, u32 *val); 855 int pci_write_config_dword(const struct pci_dev *dev, int where, u32 val); 902 int pci_enable_device(struct pci_dev *); 919 void pci_disable_device(struct pci_dev *); 922 void pci_set_master(struct pci_dev *); 975 int pci_save_state(struct pci_dev *); 976 void pci_restore_state(struct pci_dev *); 987 int pci_set_power_state(struct pci_dev *, pci_power_t ); 1040 int pci_request_regions(struct pci_dev *, const char *); 1042 void pci_release_regions(struct pci_dev *); 1085 int __pci_register_driver(struct pci_driver *, struct module *, const char *); 1094 void pci_unregister_driver(struct pci_driver *); 16 void * pci_alloc_consistent(struct pci_dev *hwdev, size_t size, dma_addr_t *dma_handle); 23 void pci_free_consistent(struct pci_dev *hwdev, size_t size, void *vaddr, dma_addr_t dma_handle); 30 dma_addr_t pci_map_single(struct pci_dev *hwdev, void *ptr, size_t size, int direction); 36 void pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr, size_t size, int direction); 71 void pci_dma_sync_single_for_cpu(struct pci_dev *hwdev, dma_addr_t dma_handle, size_t size, int direction); 78 void pci_dma_sync_single_for_device(struct pci_dev *hwdev, dma_addr_t dma_handle, size_t size, int direction); 105 int pci_set_dma_mask(struct pci_dev *dev, u64 mask); 1407 void * pci_get_drvdata(struct pci_dev *pdev); 1412 void pci_set_drvdata(struct pci_dev *pdev, void *data); 1420 const char * pci_name(const struct pci_dev *pdev); 42 int request_firmware(const struct firmware **, const char *, struct device *); 49 void release_firmware(const struct firmware *); 18 extern const unsigned char _ctype[]; 38 unsigned char __tolower(unsigned char c); 37 const char * print_ssid(char *, const char *, u8 ); 123 int request_threaded_irq(unsigned int, irqreturn_t (*)(int, void *), irqreturn_t (*)(int, void *), unsigned long, const char *, void *); 128 int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *), unsigned long flags, const char *name, void *dev); 142 void free_irq(unsigned int, void *); 469 void __tasklet_schedule(struct tasklet_struct *); 471 void tasklet_schedule(struct tasklet_struct *t); 527 void tasklet_init(struct tasklet_struct *, void (*)(unsigned long), unsigned long); 47 int eth_validate_addr(struct net_device *); 89 bool is_zero_ether_addr(const u8 *addr); 107 bool is_multicast_ether_addr(const u8 *addr); 131 bool is_broadcast_ether_addr(const u8 *addr); 160 bool is_valid_ether_addr(const u8 *addr); 440 void wireless_send_event(struct net_device *, unsigned int, union iwreq_data *, const char *); 3036 void set_wiphy_dev(struct wiphy *wiphy, struct device *dev); 3084 int wiphy_register(struct wiphy *); 3095 void wiphy_unregister(struct wiphy *); 3925 void wiphy_rfkill_set_hw_state(struct wiphy *, bool ); 849 void * libipw_priv(struct net_device *dev); 953 void free_libipw(struct net_device *, int); 954 struct net_device * alloc_libipw(int, int); 955 int libipw_change_mtu(struct net_device *, int); 957 void libipw_networks_age(struct libipw_device *, unsigned long); 962 netdev_tx_t libipw_xmit(struct sk_buff *, struct net_device *); 963 void libipw_txb_free(struct libipw_txb *); 968 int libipw_rx(struct libipw_device *, struct sk_buff *, struct libipw_rx_stats *); 971 void libipw_rx_mgt(struct libipw_device *, struct libipw_hdr_4addr *, struct libipw_rx_stats *); 976 const struct libipw_geo * libipw_get_geo(struct libipw_device *); 977 void libipw_set_geo(struct libipw_device *, const struct libipw_geo *); 988 int libipw_wx_get_scan(struct libipw_device *, struct iw_request_info *, union iwreq_data *, char *); 990 int libipw_wx_set_encode(struct libipw_device *, struct iw_request_info *, union iwreq_data *, char *); 993 int libipw_wx_get_encode(struct libipw_device *, struct iw_request_info *, union iwreq_data *, char *); 996 int libipw_wx_set_encodeext(struct libipw_device *, struct iw_request_info *, union iwreq_data *, char *); 999 int libipw_wx_get_encodeext(struct libipw_device *, struct iw_request_info *, union iwreq_data *, char *); 16 const u32 ipw_cipher_suites[4U] = { 1027073U, 1027077U, 1027074U, 1027076U }; 179 struct pm_qos_request ipw2100_pm_qos_req = { }; 191 int debug = 0; 192 int network_mode = 0; 193 int channel = 0; 194 int associate = 0; 195 int disable = 0; 197 struct ipw2100_fw ipw2100_firmware = { }; 213 unsigned int ipw2100_debug_level = 0U; 229 const char *command_types[70U] = { "undefined", "unused", "HOST_COMPLETE", "unused", "unused", "unused", "SYSTEM_CONFIG", "unused", "SSID", "MANDATORY_BSSID", "AUTHENTICATION_TYPE", "ADAPTER_ADDRESS", "PORT_TYPE", "INTERNATIONAL_MODE", "CHANNEL", "RTS_THRESHOLD", "FRAG_THRESHOLD", "POWER_MODE", "TX_RATES", "BASIC_TX_RATES", "WEP_KEY_INFO", "unused", "unused", "unused", "unused", "WEP_KEY_INDEX", "WEP_FLAGS", "ADD_MULTICAST", "CLEAR_ALL_MULTICAST", "BEACON_INTERVAL", "ATIM_WINDOW", "CLEAR_STATISTICS", "undefined", "undefined", "undefined", "undefined", "TX_POWER_INDEX", "undefined", "undefined", "undefined", "undefined", "undefined", "undefined", "BROADCAST_SCAN", "CARD_DISABLE", "PREFERRED_BSSID", "SET_SCAN_OPTIONS", "SCAN_DWELL_TIME", "SWEEP_TABLE", "AP_OR_STATION_TABLE", "GROUP_ORDINALS", "SHORT_RETRY_LIMIT", "LONG_RETRY_LIMIT", "unused", "unused", "undefined", "undefined", "undefined", "HOST_PRE_POWER_DOWN", "unused", "undefined", "CARD_DISABLE_PHY_OFF", "MSDU_TX_RATES", "undefined", "SET_STATION_STAT_BITS", "CLEAR_STATIONS_STAT_BITS", "LEAP_ROGUE_MODE", "SET_SECURITY_INFORMATION", "DISASSOCIATION_BSSID", "SET_WPA_ASS_IE" }; 303 const long ipw2100_frequencies[14U] = { 2412L, 2417L, 2422L, 2427L, 2432L, 2437L, 2442L, 2447L, 2452L, 2457L, 2462L, 2467L, 2472L, 2484L }; 312 struct ieee80211_rate ipw2100_bg_rates[4U] = { { 0U, 10U, (unsigned short)0, (unsigned short)0 }, { 1U, 20U, (unsigned short)0, (unsigned short)0 }, { 1U, 55U, (unsigned short)0, (unsigned short)0 }, { 1U, 110U, (unsigned short)0, (unsigned short)0 } }; 322 void ipw2100_tx_send_commands(struct ipw2100_priv *priv); 323 void ipw2100_tx_send_data(struct ipw2100_priv *priv); 324 int ipw2100_adapter_setup(struct ipw2100_priv *priv); 326 void ipw2100_queues_initialize(struct ipw2100_priv *priv); 327 void ipw2100_queues_free(struct ipw2100_priv *priv); 328 int ipw2100_queues_allocate(struct ipw2100_priv *priv); 330 int ipw2100_fw_download(struct ipw2100_priv *priv, struct ipw2100_fw *fw); 332 int ipw2100_get_firmware(struct ipw2100_priv *priv, struct ipw2100_fw *fw); 334 int ipw2100_get_fwversion(struct ipw2100_priv *priv, char *buf, size_t max); 336 int ipw2100_get_ucodeversion(struct ipw2100_priv *priv, char *buf, size_t max); 338 void ipw2100_release_firmware(struct ipw2100_priv *priv, struct ipw2100_fw *fw); 340 int ipw2100_ucode_download(struct ipw2100_priv *priv, struct ipw2100_fw *fw); 342 void ipw2100_wx_event_work(struct work_struct *work); 343 struct iw_statistics * ipw2100_wx_wireless_stats(struct net_device *dev); 344 struct iw_handler_def ipw2100_wx_handler_def; 346 void read_register(struct net_device *dev, u32 reg, u32 *val); 354 void write_register(struct net_device *dev, u32 reg, u32 val); 362 void read_register_word(struct net_device *dev, u32 reg, u16 *val); 371 void read_register_byte(struct net_device *dev, u32 reg, u8 *val); 379 void write_register_word(struct net_device *dev, u32 reg, u16 val); 387 void write_register_byte(struct net_device *dev, u32 reg, u8 val); 395 void read_nic_dword(struct net_device *dev, u32 addr, u32 *val); 402 void write_nic_dword(struct net_device *dev, u32 addr, u32 val); 409 void read_nic_word(struct net_device *dev, u32 addr, u16 *val); 416 void write_nic_word(struct net_device *dev, u32 addr, u16 val); 423 void read_nic_byte(struct net_device *dev, u32 addr, u8 *val); 430 void write_nic_byte(struct net_device *dev, u32 addr, u8 val); 448 void write_nic_memory(struct net_device *dev, u32 addr, u32 len, const u8 *buf); 486 void read_nic_memory(struct net_device *dev, u32 addr, u32 len, u8 *buf); 523 bool ipw2100_hw_is_adapter_in_system(struct net_device *dev); 532 int ipw2100_get_ordinal(struct ipw2100_priv *priv, u32 ord, void *val, u32 *len); 611 int ipw2100_set_ordinal(struct ipw2100_priv *priv, u32 ord, u32 *val, u32 *len); 641 char * snprint_line(char *buf, size_t count, const u8 *data, u32 len, u32 ofs); 676 void printk_buf(int level, const u8 *data, u32 len); 694 void schedule_reset(struct ipw2100_priv *priv); 730 int ipw2100_hw_send_command(struct ipw2100_priv *priv, struct host_command *cmd); 848 int ipw2100_verify(struct ipw2100_priv *priv); 892 int ipw2100_wait_for_card_state(struct ipw2100_priv *priv, int state); 935 int sw_reset_and_clock(struct ipw2100_priv *priv); 994 int ipw2100_download_firmware(struct ipw2100_priv *priv); 1117 void ipw2100_enable_interrupts(struct ipw2100_priv *priv); 1125 void ipw2100_disable_interrupts(struct ipw2100_priv *priv); 1133 void ipw2100_initialize_ordinals(struct ipw2100_priv *priv); 1155 void ipw2100_hw_set_gpio(struct ipw2100_priv *priv); 1167 int rf_kill_active(struct ipw2100_priv *priv); 1199 int ipw2100_get_hw_features(struct ipw2100_priv *priv); 1247 int ipw2100_start_adapter(struct ipw2100_priv *priv); 1347 void ipw2100_reset_fatalerror(struct ipw2100_priv *priv); 1358 int ipw2100_power_cycle_adapter(struct ipw2100_priv *priv); 1411 int ipw2100_hw_phy_off(struct ipw2100_priv *priv); 1445 int ipw2100_enable_adapter(struct ipw2100_priv *priv); 1489 int ipw2100_hw_stop_adapter(struct ipw2100_priv *priv); 1595 int ipw2100_disable_adapter(struct ipw2100_priv *priv); 1640 int ipw2100_set_scan_options(struct ipw2100_priv *priv); 1672 int ipw2100_start_scan(struct ipw2100_priv *priv); 1713 const struct libipw_geo ipw_geos[1U] = { { { '-', '-', '-', '\x0' }, 14U, 0U, { { 2412U, 1U, 0U, 0U }, { 2417U, 2U, 0U, 0U }, { 2422U, 3U, 0U, 0U }, { 2427U, 4U, 0U, 0U }, { 2432U, 5U, 0U, 0U }, { 2437U, 6U, 0U, 0U }, { 2442U, 7U, 0U, 0U }, { 2447U, 8U, 0U, 0U }, { 2452U, 9U, 0U, 0U }, { 2457U, 10U, 0U, 0U }, { 2462U, 11U, 0U, 0U }, { 2467U, 12U, 0U, 0U }, { 2472U, 13U, 0U, 0U }, { 2484U, 14U, 0U, 0U } }, { { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U }, { 0U, 0U, 0U, 0U } } } }; 1725 int ipw2100_up(struct ipw2100_priv *priv, int deferred); 1851 void ipw2100_down(struct ipw2100_priv *priv); 1904 int ipw2100_wdev_init(struct net_device *dev); 1961 void ipw2100_reset_adapter(struct work_struct *work); 1998 void isr_indicate_associated(struct ipw2100_priv *priv, u32 status); 2089 int ipw2100_set_essid(struct ipw2100_priv *priv, char *essid, int length, int batch_mode); 2140 void isr_indicate_association_lost(struct ipw2100_priv *priv, u32 status); 2171 void isr_indicate_rf_kill(struct ipw2100_priv *priv, u32 status); 2185 void ipw2100_scan_event(struct work_struct *work); 2196 void isr_scan_complete(struct ipw2100_priv *priv, u32 status); 2228 void isr_indicate_scanning(struct ipw2100_priv *priv, u32 status); 2234 const struct ipw2100_status_indicator status_handlers[13U] = { { 1, (void (*)(struct ipw2100_priv *, u32 ))0, (char *)"IPW_STATE_INITIALIZED" }, { 2, (void (*)(struct ipw2100_priv *, u32 ))0, (char *)"IPW_STATE_COUNTRY_FOUND" }, { 4, &isr_indicate_associated, (char *)"IPW_STATE_ASSOCIATED" }, { 8, &isr_indicate_association_lost, (char *)"IPW_STATE_ASSN_LOST" }, { 16, (void (*)(struct ipw2100_priv *, u32 ))0, (char *)"IPW_STATE_ASSN_CHANGED" }, { 32, &isr_scan_complete, (char *)"IPW_STATE_SCAN_COMPLETE" }, { 64, (void (*)(struct ipw2100_priv *, u32 ))0, (char *)"IPW_STATE_ENTERED_PSP" }, { 128, (void (*)(struct ipw2100_priv *, u32 ))0, (char *)"IPW_STATE_LEFT_PSP" }, { 256, &isr_indicate_rf_kill, (char *)"IPW_STATE_RF_KILL" }, { 512, (void (*)(struct ipw2100_priv *, u32 ))0, (char *)"IPW_STATE_DISABLED" }, { 1024, (void (*)(struct ipw2100_priv *, u32 ))0, (char *)"IPW_STATE_POWER_DOWN" }, { 2048, &isr_indicate_scanning, (char *)"IPW_STATE_SCANNING" }, { -1, (void (*)(struct ipw2100_priv *, u32 ))0, (char *)"-1" } }; 2250 void isr_status_change(struct ipw2100_priv *priv, int status); 2278 void isr_rx_complete_command(struct ipw2100_priv *priv, struct ipw2100_cmd_header *cmd); 2300 const char *frame_types[5U] = { "COMMAND_STATUS_VAL", "STATUS_CHANGE_VAL", "P80211_DATA_VAL", "P8023_DATA_VAL", "HOST_NOTIFICATION_VAL" }; 2309 int ipw2100_alloc_skb(struct ipw2100_priv *priv, struct ipw2100_rx_packet *packet); 2333 void ipw2100_snapshot_free(struct ipw2100_priv *priv); 2419 u8 packet_data[2340U] = { }; 2422 void ipw2100_corruption_detected(struct ipw2100_priv *priv, int i); 2467 void isr_rx(struct ipw2100_priv *priv, int i, struct libipw_rx_stats *stats); 2541 void isr_rx_monitor(struct ipw2100_priv *priv, int i, struct libipw_rx_stats *stats); 2623 int ipw2100_corruption_check(struct ipw2100_priv *priv, int i); 2679 void __ipw2100_rx_process(struct ipw2100_priv *priv); 2824 int __ipw2100_tx_process(struct ipw2100_priv *priv); 3000 void __ipw2100_tx_complete(struct ipw2100_priv *priv); 3222 void ipw2100_irq_tasklet(struct ipw2100_priv *priv); 3343 irqreturn_t ipw2100_interrupt(int irq, void *data); 3393 netdev_tx_t ipw2100_tx(struct libipw_txb *txb, struct net_device *dev, int pri); 3440 int ipw2100_msg_allocate(struct ipw2100_priv *priv); 3488 int ipw2100_msg_initialize(struct ipw2100_priv *priv); 3502 void ipw2100_msg_free(struct ipw2100_priv *priv); 3521 ssize_t show_pci(struct device *d, struct device_attribute *attr, char *buf); 3541 struct device_attribute dev_attr_pci = { { "pci", 292U, (_Bool)0, 0, { { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 } } } }, &show_pci, (ssize_t (*)(struct device *, struct device_attribute *, const char *, size_t ))0 }; 3543 ssize_t show_cfg(struct device *d, struct device_attribute *attr, char *buf); 3550 struct device_attribute dev_attr_cfg = { { "cfg", 292U, (_Bool)0, 0, { { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 } } } }, &show_cfg, (ssize_t (*)(struct device *, struct device_attribute *, const char *, size_t ))0 }; 3552 ssize_t show_status(struct device *d, struct device_attribute *attr, char *buf); 3559 struct device_attribute dev_attr_status = { { "status", 292U, (_Bool)0, 0, { { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 } } } }, &show_status, (ssize_t (*)(struct device *, struct device_attribute *, const char *, size_t ))0 }; 3561 ssize_t show_capability(struct device *d, struct device_attribute *attr, char *buf); 3568 struct device_attribute dev_attr_capability = { { "capability", 292U, (_Bool)0, 0, { { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 } } } }, &show_capability, (ssize_t (*)(struct device *, struct device_attribute *, const char *, size_t ))0 }; 3574 const struct __anonstruct_hw_data_330 hw_data[5U] = { { 36U, "REG_GP_CNTRL" }, { 48U, "REG_GPIO" }, { 8U, "REG_INTA" }, { 12U, "REG_INTA_MASK" }, { 32U, "REG_RESET_REG" } }; 3584 const struct __anonstruct_nic_data_331 nic_data[3U] = { { 2228224U, "IPW2100_CONTROL_REG", 2UL }, { 2162708U, "0x210014", 1UL }, { 2162688U, "0x210000", 1UL } }; 3592 const struct __anonstruct_ord_data_332 ord_data[147U] = { { 1U, "STAT_TX_HOST_REQUESTS", "requested Host Tx\'s (MSDU)" }, { 2U, "STAT_TX_HOST_COMPLETE", "successful Host Tx\'s (MSDU)" }, { 3U, "STAT_TX_DIR_DATA", "successful Directed Tx\'s (MSDU)" }, { 4U, "STAT_TX_DIR_DATA1", "successful Directed Tx\'s (MSDU) @ 1MB" }, { 5U, "STAT_TX_DIR_DATA2", "successful Directed Tx\'s (MSDU) @ 2MB" }, { 6U, "STAT_TX_DIR_DATA5_5", "successful Directed Tx\'s (MSDU) @ 5_5MB" }, { 7U, "STAT_TX_DIR_DATA11", "successful Directed Tx\'s (MSDU) @ 11MB" }, { 13U, "STAT_TX_NODIR_DATA1", "successful Non_Directed Tx\'s (MSDU) @ 1MB" }, { 14U, "STAT_TX_NODIR_DATA2", "successful Non_Directed Tx\'s (MSDU) @ 2MB" }, { 15U, "STAT_TX_NODIR_DATA5_5", "successful Non_Directed Tx\'s (MSDU) @ 5.5MB" }, { 16U, "STAT_TX_NODIR_DATA11", "successful Non_Directed Tx\'s (MSDU) @ 11MB" }, { 21U, "STAT_NULL_DATA", "successful NULL data Tx\'s" }, { 22U, "STAT_TX_RTS", "successful Tx RTS" }, { 23U, "STAT_TX_CTS", "successful Tx CTS" }, { 24U, "STAT_TX_ACK", "successful Tx ACK" }, { 25U, "STAT_TX_ASSN", "successful Association Tx\'s" }, { 26U, "STAT_TX_ASSN_RESP", "successful Association response Tx\'s" }, { 27U, "STAT_TX_REASSN", "successful Reassociation Tx\'s" }, { 28U, "STAT_TX_REASSN_RESP", "successful Reassociation response Tx\'s" }, { 29U, "STAT_TX_PROBE", "probes successfully transmitted" }, { 30U, "STAT_TX_PROBE_RESP", "probe responses successfully transmitted" }, { 31U, "STAT_TX_BEACON", "tx beacon" }, { 32U, "STAT_TX_ATIM", "Tx ATIM" }, { 33U, "STAT_TX_DISASSN", "successful Disassociation TX" }, { 34U, "STAT_TX_AUTH", "successful Authentication Tx" }, { 35U, "STAT_TX_DEAUTH", "successful Deauthentication TX" }, { 41U, "STAT_TX_TOTAL_BYTES", "Total successful Tx data bytes" }, { 42U, "STAT_TX_RETRIES", "Tx retries" }, { 43U, "STAT_TX_RETRY1", "Tx retries at 1MBPS" }, { 44U, "STAT_TX_RETRY2", "Tx retries at 2MBPS" }, { 45U, "STAT_TX_RETRY5_5", "Tx retries at 5.5MBPS" }, { 46U, "STAT_TX_RETRY11", "Tx retries at 11MBPS" }, { 51U, "STAT_TX_FAILURES", "Tx Failures" }, { 53U, "STAT_TX_MAX_TRIES_IN_HOP", "times max tries in a hop failed" }, { 56U, "STAT_TX_DISASSN_FAIL", "times disassociation failed" }, { 57U, "STAT_TX_ERR_CTS", "missed/bad CTS frames" }, { 59U, "STAT_TX_ERR_ACK", "tx err due to acks" }, { 61U, "STAT_RX_HOST", "packets passed to host" }, { 62U, "STAT_RX_DIR_DATA", "directed packets" }, { 63U, "STAT_RX_DIR_DATA1", "directed packets at 1MB" }, { 64U, "STAT_RX_DIR_DATA2", "directed packets at 2MB" }, { 65U, "STAT_RX_DIR_DATA5_5", "directed packets at 5.5MB" }, { 66U, "STAT_RX_DIR_DATA11", "directed packets at 11MB" }, { 71U, "STAT_RX_NODIR_DATA", "nondirected packets" }, { 72U, "STAT_RX_NODIR_DATA1", "nondirected packets at 1MB" }, { 73U, "STAT_RX_NODIR_DATA2", "nondirected packets at 2MB" }, { 74U, "STAT_RX_NODIR_DATA5_5", "nondirected packets at 5.5MB" }, { 75U, "STAT_RX_NODIR_DATA11", "nondirected packets at 11MB" }, { 80U, "STAT_RX_NULL_DATA", "null data rx\'s" }, { 82U, "STAT_RX_RTS", "Rx RTS" }, { 83U, "STAT_RX_CTS", "Rx CTS" }, { 84U, "STAT_RX_ACK", "Rx ACK" }, { 85U, "STAT_RX_CFEND", "Rx CF End" }, { 86U, "STAT_RX_CFEND_ACK", "Rx CF End + CF Ack" }, { 87U, "STAT_RX_ASSN", "Association Rx\'s" }, { 88U, "STAT_RX_ASSN_RESP", "Association response Rx\'s" }, { 89U, "STAT_RX_REASSN", "Reassociation Rx\'s" }, { 90U, "STAT_RX_REASSN_RESP", "Reassociation response Rx\'s" }, { 91U, "STAT_RX_PROBE", "probe Rx\'s" }, { 92U, "STAT_RX_PROBE_RESP", "probe response Rx\'s" }, { 93U, "STAT_RX_BEACON", "Rx beacon" }, { 94U, "STAT_RX_ATIM", "Rx ATIM" }, { 95U, "STAT_RX_DISASSN", "disassociation Rx" }, { 96U, "STAT_RX_AUTH", "authentication Rx" }, { 97U, "STAT_RX_DEAUTH", "deauthentication Rx" }, { 101U, "STAT_RX_TOTAL_BYTES", "Total rx data bytes received" }, { 102U, "STAT_RX_ERR_CRC", "packets with Rx CRC error" }, { 103U, "STAT_RX_ERR_CRC1", "Rx CRC errors at 1MB" }, { 104U, "STAT_RX_ERR_CRC2", "Rx CRC errors at 2MB" }, { 105U, "STAT_RX_ERR_CRC5_5", "Rx CRC errors at 5.5MB" }, { 106U, "STAT_RX_ERR_CRC11", "Rx CRC errors at 11MB" }, { 112U, "STAT_RX_DUPLICATE1", "duplicate rx packets at 1MB" }, { 113U, "STAT_RX_DUPLICATE2", "duplicate rx packets at 2MB" }, { 114U, "STAT_RX_DUPLICATE5_5", "duplicate rx packets at 5.5MB" }, { 115U, "STAT_RX_DUPLICATE11", "duplicate rx packets at 11MB" }, { 119U, "STAT_RX_DUPLICATE", "duplicate rx packets" }, { 120U, "PERS_DB_LOCK", "locking fw permanent db" }, { 121U, "PERS_DB_SIZE", "size of fw permanent db" }, { 122U, "PERS_DB_ADDR", "address of fw permanent db" }, { 123U, "STAT_RX_INVALID_PROTOCOL", "rx frames with invalid protocol" }, { 124U, "SYS_BOOT_TIME", "Boot time" }, { 125U, "STAT_RX_NO_BUFFER", "rx frames rejected due to no buffer" }, { 128U, "STAT_RX_MISSING_FRAG", "rx frames dropped due to missing fragment" }, { 129U, "STAT_RX_ORPHAN_FRAG", "rx frames dropped due to non-sequential fragment" }, { 130U, "STAT_RX_ORPHAN_FRAME", "rx frames dropped due to unmatched 1st frame" }, { 131U, "STAT_RX_FRAG_AGEOUT", "rx frames dropped due to uncompleted frame" }, { 133U, "STAT_RX_ICV_ERRORS", "ICV errors during decryption" }, { 137U, "STAT_PSP_SUSPENSION", "times adapter suspended" }, { 138U, "STAT_PSP_BCN_TIMEOUT", "beacon timeout" }, { 139U, "STAT_PSP_POLL_TIMEOUT", "poll response timeouts" }, { 140U, "STAT_PSP_NONDIR_TIMEOUT", "timeouts waiting for last {broad,multi}cast pkt" }, { 141U, "STAT_PSP_RX_DTIMS", "PSP DTIMs received" }, { 142U, "STAT_PSP_RX_TIMS", "PSP TIMs received" }, { 143U, "STAT_PSP_STATION_ID", "PSP Station ID" }, { 147U, "LAST_ASSN_TIME", "RTC time of last association" }, { 148U, "STAT_PERCENT_MISSED_BCNS", "current calculation of % missed beacons" }, { 149U, "STAT_PERCENT_RETRIES", "current calculation of % missed tx retries" }, { 150U, "ASSOCIATED_AP_PTR", "0 if not associated, else pointer to AP table entry" }, { 151U, "AVAILABLE_AP_CNT", "AP\'s decsribed in the AP table" }, { 152U, "AP_LIST_PTR", "Ptr to list of available APs" }, { 153U, "STAT_AP_ASSNS", "associations" }, { 154U, "STAT_ASSN_FAIL", "association failures" }, { 155U, "STAT_ASSN_RESP_FAIL", "failures due to response fail" }, { 156U, "STAT_FULL_SCANS", "full scans" }, { 157U, "CARD_DISABLED", "Card Disabled" }, { 158U, "STAT_ROAM_INHIBIT", "times roaming was inhibited due to activity" }, { 160U, "RSSI_AT_ASSN", "RSSI of associated AP at time of association" }, { 161U, "STAT_ASSN_CAUSE1", "reassociation: no probe response or TX on hop" }, { 162U, "STAT_ASSN_CAUSE2", "reassociation: poor tx/rx quality" }, { 163U, "STAT_ASSN_CAUSE3", "reassociation: tx/rx quality (excessive AP load" }, { 164U, "STAT_ASSN_CAUSE4", "reassociation: AP RSSI level" }, { 165U, "STAT_ASSN_CAUSE5", "reassociations due to load leveling" }, { 170U, "STAT_AUTH_FAIL", "times authentication failed" }, { 171U, "STAT_AUTH_RESP_FAIL", "times authentication response failed" }, { 172U, "STATION_TABLE_CNT", "entries in association table" }, { 173U, "RSSI_AVG_CURR", "Current avg RSSI" }, { 177U, "POWER_MGMT_MODE", "Power mode - 0=CAM, 1=PSP" }, { 179U, "COUNTRY_CODE", "IEEE country code as recv\'d from beacon" }, { 180U, "COUNTRY_CHANNELS", "channels supported by country" }, { 181U, "RESET_CNT", "adapter resets (warm)" }, { 182U, "BEACON_INTERVAL", "Beacon interval" }, { 185U, "ANTENNA_DIVERSITY", "TRUE if antenna diversity is disabled" }, { 188U, "DTIM_PERIOD", "beacon intervals between DTIMs" }, { 189U, "OUR_FREQ", "current radio freq lower digits - channel ID" }, { 190U, "RTC_TIME", "current RTC time" }, { 191U, "PORT_TYPE", "operating mode" }, { 192U, "CURRENT_TX_RATE", "current tx rate" }, { 193U, "SUPPORTED_RATES", "supported tx rates" }, { 194U, "ATIM_WINDOW", "current ATIM Window" }, { 195U, "BASIC_RATES", "basic tx rates" }, { 196U, "NIC_HIGHEST_RATE", "NIC highest tx rate" }, { 197U, "AP_HIGHEST_RATE", "AP highest tx rate" }, { 198U, "CAPABILITIES", "Management frame capability field" }, { 199U, "AUTH_TYPE", "Type of authentication" }, { 200U, "RADIO_TYPE", "Adapter card platform type" }, { 201U, "RTS_THRESHOLD", "Min packet length for RTS handshaking" }, { 202U, "INT_MODE", "International mode" }, { 203U, "FRAGMENTATION_THRESHOLD", "protocol frag threshold" }, { 204U, "EEPROM_SRAM_DB_BLOCK_START_ADDRESS", "EEPROM offset in SRAM" }, { 205U, "EEPROM_SRAM_DB_BLOCK_SIZE", "EEPROM size in SRAM" }, { 206U, "EEPROM_SKU_CAPABILITY", "EEPROM SKU Capability" }, { 207U, "EEPROM_IBSS_11B_CHANNELS", "EEPROM IBSS 11b channel set" }, { 209U, "MAC_VERSION", "MAC Version" }, { 210U, "MAC_REVISION", "MAC Revision" }, { 211U, "RADIO_VERSION", "Radio Version" }, { 212U, "NIC_MANF_DATE_TIME", "MANF Date/Time STAMP" }, { 213U, "UCODE_VERSION", "Ucode Version" } }; 3805 ssize_t show_registers(struct device *d, struct device_attribute *attr, char *buf); 3825 struct device_attribute dev_attr_registers = { { "registers", 292U, (_Bool)0, 0, { { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 } } } }, &show_registers, (ssize_t (*)(struct device *, struct device_attribute *, const char *, size_t ))0 }; 3827 ssize_t show_hardware(struct device *d, struct device_attribute *attr, char *buf); 3866 struct device_attribute dev_attr_hardware = { { "hardware", 292U, (_Bool)0, 0, { { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 } } } }, &show_hardware, (ssize_t (*)(struct device *, struct device_attribute *, const char *, size_t ))0 }; 3868 ssize_t show_memory(struct device *d, struct device_attribute *attr, char *buf); 3925 ssize_t store_memory(struct device *d, struct device_attribute *attr, const char *buf, size_t count); 3960 struct device_attribute dev_attr_memory = { { "memory", 420U, (_Bool)0, 0, { { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 } } } }, &show_memory, &store_memory }; 3962 ssize_t show_ordinals(struct device *d, struct device_attribute *attr, char *buf); 3996 struct device_attribute dev_attr_ordinals = { { "ordinals", 292U, (_Bool)0, 0, { { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 } } } }, &show_ordinals, (ssize_t (*)(struct device *, struct device_attribute *, const char *, size_t ))0 }; 3998 ssize_t show_stats(struct device *d, struct device_attribute *attr, char *buf); 4017 struct device_attribute dev_attr_stats = { { "stats", 292U, (_Bool)0, 0, { { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 } } } }, &show_stats, (ssize_t (*)(struct device *, struct device_attribute *, const char *, size_t ))0 }; 4019 int ipw2100_switch_mode(struct ipw2100_priv *priv, u32 mode); 4063 ssize_t show_internals(struct device *d, struct device_attribute *attr, char *buf); 4115 struct device_attribute dev_attr_internals = { { "internals", 292U, (_Bool)0, 0, { { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 } } } }, &show_internals, (ssize_t (*)(struct device *, struct device_attribute *, const char *, size_t ))0 }; 4117 ssize_t show_bssinfo(struct device *d, struct device_attribute *attr, char *buf); 4160 struct device_attribute dev_attr_bssinfo = { { "bssinfo", 292U, (_Bool)0, 0, { { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 } } } }, &show_bssinfo, (ssize_t (*)(struct device *, struct device_attribute *, const char *, size_t ))0 }; 4163 ssize_t show_debug_level(struct device_driver *d, char *buf); 4168 ssize_t store_debug_level(struct device_driver *d, const char *buf, size_t count); 4184 struct driver_attribute driver_attr_debug_level = { { "debug_level", 420U, (_Bool)0, 0, { { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 } } } }, &show_debug_level, &store_debug_level }; 4187 ssize_t show_fatal_error(struct device *d, struct device_attribute *attr, char *buf); 4212 ssize_t store_fatal_error(struct device *d, struct device_attribute *attr, const char *buf, size_t count); 4222 struct device_attribute dev_attr_fatal_error = { { "fatal_error", 420U, (_Bool)0, 0, { { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 } } } }, &show_fatal_error, &store_fatal_error }; 4224 ssize_t show_scan_age(struct device *d, struct device_attribute *attr, char *buf); 4231 ssize_t store_scan_age(struct device *d, struct device_attribute *attr, const char *buf, size_t count); 4255 struct device_attribute dev_attr_scan_age = { { "scan_age", 420U, (_Bool)0, 0, { { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 } } } }, &show_scan_age, &store_scan_age }; 4257 ssize_t show_rf_kill(struct device *d, struct device_attribute *attr, char *buf); 4270 int ipw_radio_kill_sw(struct ipw2100_priv *priv, int disable_radio); 4301 ssize_t store_rf_kill(struct device *d, struct device_attribute *attr, const char *buf, size_t count); 4309 struct device_attribute dev_attr_rf_kill = { { "rf_kill", 420U, (_Bool)0, 0, { { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 } } } }, &show_rf_kill, &store_rf_kill }; 4311 struct attribute *ipw2100_sysfs_entries[15U] = { &(dev_attr_hardware.attr), &(dev_attr_registers.attr), &(dev_attr_ordinals.attr), &(dev_attr_pci.attr), &(dev_attr_stats.attr), &(dev_attr_internals.attr), &(dev_attr_bssinfo.attr), &(dev_attr_memory.attr), &(dev_attr_scan_age.attr), &(dev_attr_fatal_error.attr), &(dev_attr_rf_kill.attr), &(dev_attr_cfg.attr), &(dev_attr_status.attr), &(dev_attr_capability.attr), (struct attribute *)0 }; 4329 struct attribute_group ipw2100_attribute_group = { 0, 0, (struct attribute **)(&ipw2100_sysfs_entries), 0 }; 4333 int status_queue_allocate(struct ipw2100_priv *priv, int entries); 4355 void status_queue_free(struct ipw2100_priv *priv); 4369 int bd_queue_allocate(struct ipw2100_priv *priv, struct ipw2100_bd_queue *q, int entries); 4391 void bd_queue_free(struct ipw2100_priv *priv, struct ipw2100_bd_queue *q); 4406 void bd_queue_initialize(struct ipw2100_priv *priv, struct ipw2100_bd_queue *q, u32 base, u32 size, u32 r, u32 w); 4423 void ipw2100_kill_works(struct ipw2100_priv *priv); 4435 int ipw2100_tx_allocate(struct ipw2100_priv *priv); 4494 void ipw2100_tx_initialize(struct ipw2100_priv *priv); 4544 void ipw2100_tx_free(struct ipw2100_priv *priv); 4576 int ipw2100_rx_allocate(struct ipw2100_priv *priv); 4646 void ipw2100_rx_initialize(struct ipw2100_priv *priv); 4670 void ipw2100_rx_free(struct ipw2100_priv *priv); 4698 int ipw2100_read_mac_address(struct ipw2100_priv *priv); 4723 int ipw2100_set_mac_address(struct ipw2100_priv *priv, int batch_mode); 4749 int ipw2100_set_port_type(struct ipw2100_priv *priv, u32 port_type, int batch_mode); 4790 int ipw2100_set_channel(struct ipw2100_priv *priv, u32 channel___0, int batch_mode); 4840 int ipw2100_system_config(struct ipw2100_priv *priv, int batch_mode); 4901 int ipw2100_set_tx_rates(struct ipw2100_priv *priv, u32 rate, int batch_mode); 4941 int ipw2100_set_power_mode(struct ipw2100_priv *priv, int power_level); 4976 int ipw2100_set_rts_threshold(struct ipw2100_priv *priv, u32 threshold); 5040 int ipw2100_set_short_retry(struct ipw2100_priv *priv, u32 retry); 5060 int ipw2100_set_long_retry(struct ipw2100_priv *priv, u32 retry); 5080 int ipw2100_set_mandatory_bssid(struct ipw2100_priv *priv, u8 *bssid, int batch_mode); 5114 int ipw2100_disassociate_bssid(struct ipw2100_priv *priv); 5138 int ipw2100_set_wpa_ie(struct ipw2100_priv *priv, struct ipw2100_wpa_assoc_frame *wpa_frame, int batch_mode); 5182 int ipw2100_set_security_information(struct ipw2100_priv *priv, int auth_mode, int security_level, int unicast_using_group, int batch_mode); 5248 int ipw2100_set_tx_power(struct ipw2100_priv *priv, u32 tx_power); 5272 int ipw2100_set_ibss_beacon_interval(struct ipw2100_priv *priv, u32 interval, int batch_mode); 5338 int ipw2100_set_wep_flags(struct ipw2100_priv *priv, u32 flags, int batch_mode); 5398 int ipw2100_set_key(struct ipw2100_priv *priv, int idx, char *key, int len, int batch_mode); 5461 int ipw2100_set_key_index(struct ipw2100_priv *priv, int idx, int batch_mode); 5496 int ipw2100_configure_security(struct ipw2100_priv *priv, int batch_mode); 5574 void ipw2100_security_work(struct work_struct *work); 5587 void shim__set_security(struct net_device *dev, struct libipw_security *sec); 5781 int ipw2100_set_address(struct net_device *dev, void *p); 5809 int ipw2100_open(struct net_device *dev); 5825 int ipw2100_close(struct net_device *dev); 5864 void ipw2100_tx_timeout(struct net_device *dev); 5880 int ipw2100_wpa_enable(struct ipw2100_priv *priv, int value); 5888 int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value); 5917 void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv, char *wpa_ie, int wpa_ie_len); 5934 void ipw_ethtool_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info); 5953 u32 ipw2100_ethtool_get_link(struct net_device *dev); 5959 const struct ethtool_ops ipw2100_ethtool_ops = { 0, 0, &ipw_ethtool_get_drvinfo, 0, 0, 0, 0, 0, 0, 0, &ipw2100_ethtool_get_link, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 5964 void ipw2100_hang_check(struct work_struct *work); 6007 void ipw2100_rf_kill(struct work_struct *work); 6039 const struct net_device_ops ipw2100_netdev_ops = { 0, 0, &ipw2100_open, &ipw2100_close, &libipw_xmit, 0, 0, 0, &ipw2100_set_address, ð_validate_addr, 0, 0, &libipw_change_mtu, 0, &ipw2100_tx_timeout, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 6051 struct net_device * ipw2100_alloc_device(struct pci_dev *pci_dev, void *ioaddr); 6176 int ipw2100_pci_init_one(struct pci_dev *pci_dev, const struct pci_device_id *ent); 6375 void ipw2100_pci_remove_one(struct pci_dev *pci_dev); 6426 int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state); 6453 int ipw2100_resume(struct pci_dev *pci_dev); 6503 void ipw2100_shutdown(struct pci_dev *pci_dev); 6515 const struct pci_device_id ipw2100_pci_id_table[41U] = { { 32902U, 4163U, 32902U, 9504U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9505U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9508U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9509U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9510U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9506U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9507U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9511U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9512U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9513U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9515U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9516U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9517U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9552U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9553U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9555U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9556U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9557U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9568U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9570U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9571U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9569U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9573U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9574U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9575U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9584U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9600U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9602U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9603U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9601U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9605U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9606U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9607U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9616U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9618U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9617U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9619U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9622U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9624U, 0U, 0U, 0UL }, { 32902U, 4163U, 32902U, 9632U, 0U, 0U, 0UL }, { 0U, 0U, 0U, 0U, 0U, 0U, 0UL } }; 6565 const struct pci_device_id __mod_pci_device_table = { }; 6567 struct pci_driver ipw2100_pci_driver = { { 0, 0 }, "ipw2100", (const struct pci_device_id *)(&ipw2100_pci_id_table), &ipw2100_pci_init_one, &ipw2100_pci_remove_one, &ipw2100_suspend, 0, 0, &ipw2100_resume, &ipw2100_shutdown, 0, 0, { 0, 0, 0, 0, (_Bool)0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { { { { { { 0U } }, 0U, 0U, 0, { 0, { 0, 0 }, 0, 0, 0UL } } } }, { 0, 0 } } }; 6588 int ipw2100_init(); 6615 void ipw2100_exit(); 6629 int ipw2100_wx_get_name(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 6647 int ipw2100_wx_set_freq(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 6693 int ipw2100_wx_get_freq(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 6718 int ipw2100_wx_set_mode(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 6757 int ipw2100_wx_get_mode(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 6776 const s32 timeout_duration[5U] = { 350000, 250000, 75000, 37000, 25000 }; 6784 const s32 period_duration[5U] = { 400000, 700000, 1000000, 1000000, 1000000 }; 6792 int ipw2100_wx_get_range(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 6917 int ipw2100_wx_set_wap(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 6955 int ipw2100_wx_get_wap(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 6977 int ipw2100_wx_set_essid(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7028 int ipw2100_wx_get_essid(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7056 int ipw2100_wx_set_nick(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7078 int ipw2100_wx_get_nick(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7097 int ipw2100_wx_set_rate(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7137 int ipw2100_wx_get_rate(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7189 int ipw2100_wx_set_rts(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7224 int ipw2100_wx_get_rts(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7245 int ipw2100_wx_set_txpow(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7286 int ipw2100_wx_get_txpow(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7313 int ipw2100_wx_set_frag(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7343 int ipw2100_wx_get_frag(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7361 int ipw2100_wx_set_retry(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7405 int ipw2100_wx_get_retry(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7437 int ipw2100_wx_set_scan(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7465 int ipw2100_wx_get_scan(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7480 int ipw2100_wx_set_encode(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *key); 7492 int ipw2100_wx_get_encode(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *key); 7504 int ipw2100_wx_set_power(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7549 int ipw2100_wx_get_power(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7576 int ipw2100_wx_set_genie(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7612 int ipw2100_wx_get_genie(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7634 int ipw2100_wx_set_auth(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7727 int ipw2100_wx_get_auth(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7789 int ipw2100_wx_set_encodeext(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7798 int ipw2100_wx_get_encodeext(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7807 int ipw2100_wx_set_mlme(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7838 int ipw2100_wx_set_promisc(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7869 int ipw2100_wx_reset(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7881 int ipw2100_wx_set_powermode(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7905 int ipw2100_wx_get_powermode(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7945 int ipw2100_wx_set_preamble(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7974 int ipw2100_wx_get_preamble(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 7993 int ipw2100_wx_set_crc_check(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 8021 int ipw2100_wx_get_crc_check(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); 8040 iw_handler ipw2100_wx_handlers[54U] = { 0, &ipw2100_wx_get_name, 0, 0, &ipw2100_wx_set_freq, &ipw2100_wx_get_freq, &ipw2100_wx_set_mode, &ipw2100_wx_get_mode, 0, 0, 0, &ipw2100_wx_get_range, 0, 0, 0, 0, 0, 0, 0, 0, &ipw2100_wx_set_wap, &ipw2100_wx_get_wap, &ipw2100_wx_set_mlme, 0, &ipw2100_wx_set_scan, &ipw2100_wx_get_scan, &ipw2100_wx_set_essid, &ipw2100_wx_get_essid, &ipw2100_wx_set_nick, &ipw2100_wx_get_nick, 0, 0, &ipw2100_wx_set_rate, &ipw2100_wx_get_rate, &ipw2100_wx_set_rts, &ipw2100_wx_get_rts, &ipw2100_wx_set_frag, &ipw2100_wx_get_frag, &ipw2100_wx_set_txpow, &ipw2100_wx_get_txpow, &ipw2100_wx_set_retry, &ipw2100_wx_get_retry, &ipw2100_wx_set_encode, &ipw2100_wx_get_encode, &ipw2100_wx_set_power, &ipw2100_wx_get_power, 0, 0, &ipw2100_wx_set_genie, &ipw2100_wx_get_genie, &ipw2100_wx_set_auth, &ipw2100_wx_get_auth, &ipw2100_wx_set_encodeext, &ipw2100_wx_get_encodeext }; 8087 const struct iw_priv_args ipw2100_private_args[8U] = { { 35808U, 18434U, 0U, { 'm', 'o', 'n', 'i', 't', 'o', 'r', '\x0' } }, { 35809U, 18432U, 0U, { 'r', 'e', 's', 'e', 't', '\x0' } }, { 35810U, 18433U, 0U, { 's', 'e', 't', '_', 'p', 'o', 'w', 'e', 'r', '\x0' } }, { 35811U, 0U, 10320U, { 'g', 'e', 't', '_', 'p', 'o', 'w', 'e', 'r', '\x0' } }, { 35812U, 18433U, 0U, { 's', 'e', 't', '_', 'p', 'r', 'e', 'a', 'm', 'b', 'l', 'e', '\x0' } }, { 35813U, 0U, 10256U, { 'g', 'e', 't', '_', 'p', 'r', 'e', 'a', 'm', 'b', 'l', 'e', '\x0' } }, { 35814U, 18433U, 0U, { 's', 'e', 't', '_', 'c', 'r', 'c', '_', 'c', 'h', 'e', 'c', 'k', '\x0' } }, { 35815U, 0U, 10256U, { 'g', 'e', 't', '_', 'c', 'r', 'c', '_', 'c', 'h', 'e', 'c', 'k', '\x0' } } }; 8121 iw_handler ipw2100_private_handler[8U] = { &ipw2100_wx_set_promisc, &ipw2100_wx_reset, &ipw2100_wx_set_powermode, &ipw2100_wx_get_powermode, &ipw2100_wx_set_preamble, &ipw2100_wx_get_preamble, &ipw2100_wx_set_crc_check, &ipw2100_wx_get_crc_check }; 8285 struct iw_handler_def ipw2100_wx_handler_def = { (const iw_handler (**)(struct net_device *, struct iw_request_info *, union iwreq_data *, char *))(&ipw2100_wx_handlers), 54U, 8U, 8U, (const iw_handler (**)(struct net_device *, struct iw_request_info *, union iwreq_data *, char *))(&ipw2100_private_handler), (const struct iw_priv_args *)(&ipw2100_private_args), &ipw2100_wx_wireless_stats }; 8381 int ipw2100_mod_firmware_load(struct ipw2100_fw *fw); 8672 void ldv_check_final_state(); 8675 void ldv_check_return_value(int); 8678 void ldv_check_return_value_probe(int); 8681 void ldv_initialize(); 8684 void ldv_handler_precall(); 8687 int nondet_int(); 8690 int LDV_IN_INTERRUPT = 0; 8693 void ldv_main0_sequence_infinite_withcheck_stateful(); 10 void ldv_error(); 25 int ldv_undef_int(); 26 void * ldv_undef_ptr(); 8 int LDV_DMA_MAP_CALLS = 0; 11 dma_addr_t ldv_dma_map_page(struct device *dev, struct page *page, size_t offset, size_t size, enum dma_data_direction dir); 25 int ldv_dma_mapping_error(struct device *dev, dma_addr_t dma_addr); 41 dma_addr_t ldv_dma_map_single(struct device *dev, void *cpu_addr, size_t size, enum dma_data_direction dir); return ; } { 8695 struct net_device *var_group1; 8696 struct ethtool_drvinfo *var_group2; 8697 int res_ipw2100_open_136; 8698 int res_ipw2100_close_137; 8699 void *var_ipw2100_set_address_135_p1; 8700 struct pci_dev *var_group3; 8701 const struct pci_device_id *var_ipw2100_pci_init_one_147_p1; 8702 int res_ipw2100_pci_init_one_147; 8703 struct pm_message var_ipw2100_suspend_149_p1; 8704 int var_ipw2100_interrupt_69_p0; 8705 void *var_ipw2100_interrupt_69_p1; 8706 int ldv_s_ipw2100_netdev_ops_net_device_ops; 8707 int ldv_s_ipw2100_pci_driver_pci_driver; 8708 int tmp; 8709 int tmp___0; 8710 int tmp___1; 11141 ldv_s_ipw2100_netdev_ops_net_device_ops = 0; 11144 ldv_s_ipw2100_pci_driver_pci_driver = 0; 10954 LDV_IN_INTERRUPT = 1; 11091 ldv_handler_precall() { /* Function call is skipped due to function is undefined */} { 6590 int ret; 6592 printk("\016ipw2100: %s, %s\n", (char *)"Intel(R) PRO/Wireless 2100 Network Driver", (char *)"git-1.2.2") { /* Function call is skipped due to function is undefined */} 6593 printk("\016ipw2100: %s\n", (char *)"Copyright(c) 2003-2006 Intel Corporation") { /* Function call is skipped due to function is undefined */} 6595 pm_qos_add_request(&ipw2100_pm_qos_req, 1, -1) { /* Function call is skipped due to function is undefined */} 6598 ret = __pci_register_driver(&ipw2100_pci_driver, &__this_module, "ipw2100") { /* Function call is skipped due to function is undefined */} 6603 ipw2100_debug_level = (u32 )debug; 6604 ret = driver_create_file(&(ipw2100_pci_driver.driver), (const struct driver_attribute *)(&driver_attr_debug_level)) { /* Function call is skipped due to function is undefined */} 6605 out:; }11152 goto ldv_57553; 11152 tmp___1 = nondet_int() { /* Function call is skipped due to function is undefined */} 11156 goto ldv_57552; 11153 ldv_57552:; 11157 tmp___0 = nondet_int() { /* Function call is skipped due to function is undefined */} 11157 switch (tmp___0)13151 ldv_handler_precall() { /* Function call is skipped due to function is undefined */} { } 6505 struct ipw2100_priv *priv; 6506 void *tmp; { 1409 void *tmp; 1409 tmp = dev_get_drvdata((const struct device *)(&(pdev->dev))) { /* Function call is skipped due to function is undefined */} } 6505 priv = (struct ipw2100_priv *)tmp; { } 1853 unsigned long flags; 1854 union iwreq_data wrqu; 1855 int associated; 1856 raw_spinlock_t *tmp; 1857 int tmp___0; 1858 raw_spinlock_t *tmp___1; 1854 wrqu.ap_addr.sa_family = 1U; 1854 (wrqu.ap_addr.sa_data)[0] = 0; 1854 (wrqu.ap_addr.sa_data)[1] = 0; 1854 (wrqu.ap_addr.sa_data)[2] = 0; 1854 (wrqu.ap_addr.sa_data)[3] = 0; 1854 (wrqu.ap_addr.sa_data)[4] = 0; 1854 (wrqu.ap_addr.sa_data)[5] = 0; 1854 (wrqu.ap_addr.sa_data)[6] = 0; 1854 (wrqu.ap_addr.sa_data)[7] = 0; 1854 (wrqu.ap_addr.sa_data)[8] = 0; 1854 (wrqu.ap_addr.sa_data)[9] = 0; 1854 (wrqu.ap_addr.sa_data)[10] = 0; 1854 (wrqu.ap_addr.sa_data)[11] = 0; 1854 (wrqu.ap_addr.sa_data)[12] = 0; 1854 (wrqu.ap_addr.sa_data)[13] = 0; 1858 int __CPAchecker_TMP_0 = (int)(priv->status); 1858 associated = __CPAchecker_TMP_0 & 1024; 1874 cancel_delayed_work(&(priv->reset_work)) { /* Function call is skipped due to function is undefined */} 1878 flags = _raw_spin_lock_irqsave(tmp) { /* Function call is skipped due to function is undefined */} { 1121 priv->status = (priv->status) | 2048UL; { } 356 struct ipw2100_priv *priv; 357 void *tmp; 358 int tmp___0; { 851 void *tmp; 851 return (void *)(&(((struct libipw_device *)tmp)->priv));; } 356 priv = (struct ipw2100_priv *)tmp; 358 iowrite32(val, (priv->ioaddr) + ((unsigned long)reg)) { /* Function call is skipped due to function is undefined */} } { 358 _raw_spin_unlock_irqrestore(&(lock->__annonCompField20.rlock), flags) { /* Function call is skipped due to function is undefined */} } { } 1491 struct host_command cmd; 1492 int err; 1493 int i; 1494 unsigned int reg; 1495 int tmp; 1496 unsigned long tmp___0; 1493 cmd.host_command = 58U; 1493 cmd.host_command1 = 0U; 1493 cmd.host_command_sequence = 0U; 1493 cmd.host_command_length = 0U; 1493 (cmd.host_command_parameters)[0] = 0U; 1493 (cmd.host_command_parameters)[1] = 0U; 1493 (cmd.host_command_parameters)[2] = 0U; 1493 (cmd.host_command_parameters)[3] = 0U; 1493 (cmd.host_command_parameters)[4] = 0U; 1493 (cmd.host_command_parameters)[5] = 0U; 1493 (cmd.host_command_parameters)[6] = 0U; 1493 (cmd.host_command_parameters)[7] = 0U; 1493 (cmd.host_command_parameters)[8] = 0U; 1493 (cmd.host_command_parameters)[9] = 0U; 1493 (cmd.host_command_parameters)[10] = 0U; 1493 (cmd.host_command_parameters)[11] = 0U; 1493 (cmd.host_command_parameters)[12] = 0U; 1493 (cmd.host_command_parameters)[13] = 0U; 1493 (cmd.host_command_parameters)[14] = 0U; 1493 (cmd.host_command_parameters)[15] = 0U; 1493 (cmd.host_command_parameters)[16] = 0U; 1493 (cmd.host_command_parameters)[17] = 0U; 1493 (cmd.host_command_parameters)[18] = 0U; 1493 (cmd.host_command_parameters)[19] = 0U; 1493 (cmd.host_command_parameters)[20] = 0U; 1493 (cmd.host_command_parameters)[21] = 0U; 1493 (cmd.host_command_parameters)[22] = 0U; 1493 (cmd.host_command_parameters)[23] = 0U; 1493 (cmd.host_command_parameters)[24] = 0U; 1493 (cmd.host_command_parameters)[25] = 0U; 1493 (cmd.host_command_parameters)[26] = 0U; 1493 (cmd.host_command_parameters)[27] = 0U; 1493 (cmd.host_command_parameters)[28] = 0U; 1493 (cmd.host_command_parameters)[29] = 0U; 1493 (cmd.host_command_parameters)[30] = 0U; 1493 (cmd.host_command_parameters)[31] = 0U; 1493 (cmd.host_command_parameters)[32] = 0U; 1493 (cmd.host_command_parameters)[33] = 0U; 1493 (cmd.host_command_parameters)[34] = 0U; 1493 (cmd.host_command_parameters)[35] = 0U; 1493 (cmd.host_command_parameters)[36] = 0U; 1493 (cmd.host_command_parameters)[37] = 0U; 1493 (cmd.host_command_parameters)[38] = 0U; 1493 (cmd.host_command_parameters)[39] = 0U; 1493 (cmd.host_command_parameters)[40] = 0U; 1493 (cmd.host_command_parameters)[41] = 0U; 1493 (cmd.host_command_parameters)[42] = 0U; 1493 (cmd.host_command_parameters)[43] = 0U; 1493 (cmd.host_command_parameters)[44] = 0U; 1493 (cmd.host_command_parameters)[45] = 0U; 1493 (cmd.host_command_parameters)[46] = 0U; 1493 (cmd.host_command_parameters)[47] = 0U; 1493 (cmd.host_command_parameters)[48] = 0U; 1493 (cmd.host_command_parameters)[49] = 0U; 1493 (cmd.host_command_parameters)[50] = 0U; 1493 (cmd.host_command_parameters)[51] = 0U; 1493 (cmd.host_command_parameters)[52] = 0U; 1493 (cmd.host_command_parameters)[53] = 0U; 1493 (cmd.host_command_parameters)[54] = 0U; 1493 (cmd.host_command_parameters)[55] = 0U; 1493 (cmd.host_command_parameters)[56] = 0U; 1493 (cmd.host_command_parameters)[57] = 0U; 1493 (cmd.host_command_parameters)[58] = 0U; 1493 (cmd.host_command_parameters)[59] = 0U; 1493 (cmd.host_command_parameters)[60] = 0U; 1493 (cmd.host_command_parameters)[61] = 0U; 1493 (cmd.host_command_parameters)[62] = 0U; 1493 (cmd.host_command_parameters)[63] = 0U; 1493 (cmd.host_command_parameters)[64] = 0U; 1493 (cmd.host_command_parameters)[65] = 0U; 1493 (cmd.host_command_parameters)[66] = 0U; 1493 (cmd.host_command_parameters)[67] = 0U; 1493 (cmd.host_command_parameters)[68] = 0U; 1493 (cmd.host_command_parameters)[69] = 0U; 1493 (cmd.host_command_parameters)[70] = 0U; 1493 (cmd.host_command_parameters)[71] = 0U; 1493 (cmd.host_command_parameters)[72] = 0U; 1493 (cmd.host_command_parameters)[73] = 0U; 1493 (cmd.host_command_parameters)[74] = 0U; 1493 (cmd.host_command_parameters)[75] = 0U; 1493 (cmd.host_command_parameters)[76] = 0U; 1493 (cmd.host_command_parameters)[77] = 0U; 1493 (cmd.host_command_parameters)[78] = 0U; 1493 (cmd.host_command_parameters)[79] = 0U; 1493 (cmd.host_command_parameters)[80] = 0U; 1493 (cmd.host_command_parameters)[81] = 0U; 1493 (cmd.host_command_parameters)[82] = 0U; 1493 (cmd.host_command_parameters)[83] = 0U; 1493 (cmd.host_command_parameters)[84] = 0U; 1493 (cmd.host_command_parameters)[85] = 0U; 1493 (cmd.host_command_parameters)[86] = 0U; 1493 (cmd.host_command_parameters)[87] = 0U; 1493 (cmd.host_command_parameters)[88] = 0U; 1493 (cmd.host_command_parameters)[89] = 0U; 1493 (cmd.host_command_parameters)[90] = 0U; 1493 (cmd.host_command_parameters)[91] = 0U; 1493 (cmd.host_command_parameters)[92] = 0U; 1493 (cmd.host_command_parameters)[93] = 0U; 1493 (cmd.host_command_parameters)[94] = 0U; 1493 (cmd.host_command_parameters)[95] = 0U; 1493 (cmd.host_command_parameters)[96] = 0U; 1493 (cmd.host_command_parameters)[97] = 0U; 1493 (cmd.host_command_parameters)[98] = 0U; 1493 (cmd.host_command_parameters)[99] = 0U; 1504 priv->status = (priv->status) | 16UL; { } 1447 struct host_command cmd; 1448 int err; 1449 int tmp; 1450 int tmp___0; 1451 int tmp___1; 1452 int tmp___2; 1453 int tmp___3; 1447 cmd.host_command = 2U; 1447 cmd.host_command1 = 0U; 1447 cmd.host_command_sequence = 0U; 1447 cmd.host_command_length = 0U; 1447 (cmd.host_command_parameters)[0] = 0U; 1447 (cmd.host_command_parameters)[1] = 0U; 1447 (cmd.host_command_parameters)[2] = 0U; 1447 (cmd.host_command_parameters)[3] = 0U; 1447 (cmd.host_command_parameters)[4] = 0U; 1447 (cmd.host_command_parameters)[5] = 0U; 1447 (cmd.host_command_parameters)[6] = 0U; 1447 (cmd.host_command_parameters)[7] = 0U; 1447 (cmd.host_command_parameters)[8] = 0U; 1447 (cmd.host_command_parameters)[9] = 0U; 1447 (cmd.host_command_parameters)[10] = 0U; 1447 (cmd.host_command_parameters)[11] = 0U; 1447 (cmd.host_command_parameters)[12] = 0U; 1447 (cmd.host_command_parameters)[13] = 0U; 1447 (cmd.host_command_parameters)[14] = 0U; 1447 (cmd.host_command_parameters)[15] = 0U; 1447 (cmd.host_command_parameters)[16] = 0U; 1447 (cmd.host_command_parameters)[17] = 0U; 1447 (cmd.host_command_parameters)[18] = 0U; 1447 (cmd.host_command_parameters)[19] = 0U; 1447 (cmd.host_command_parameters)[20] = 0U; 1447 (cmd.host_command_parameters)[21] = 0U; 1447 (cmd.host_command_parameters)[22] = 0U; 1447 (cmd.host_command_parameters)[23] = 0U; 1447 (cmd.host_command_parameters)[24] = 0U; 1447 (cmd.host_command_parameters)[25] = 0U; 1447 (cmd.host_command_parameters)[26] = 0U; 1447 (cmd.host_command_parameters)[27] = 0U; 1447 (cmd.host_command_parameters)[28] = 0U; 1447 (cmd.host_command_parameters)[29] = 0U; 1447 (cmd.host_command_parameters)[30] = 0U; 1447 (cmd.host_command_parameters)[31] = 0U; 1447 (cmd.host_command_parameters)[32] = 0U; 1447 (cmd.host_command_parameters)[33] = 0U; 1447 (cmd.host_command_parameters)[34] = 0U; 1447 (cmd.host_command_parameters)[35] = 0U; 1447 (cmd.host_command_parameters)[36] = 0U; 1447 (cmd.host_command_parameters)[37] = 0U; 1447 (cmd.host_command_parameters)[38] = 0U; 1447 (cmd.host_command_parameters)[39] = 0U; 1447 (cmd.host_command_parameters)[40] = 0U; 1447 (cmd.host_command_parameters)[41] = 0U; 1447 (cmd.host_command_parameters)[42] = 0U; 1447 (cmd.host_command_parameters)[43] = 0U; 1447 (cmd.host_command_parameters)[44] = 0U; 1447 (cmd.host_command_parameters)[45] = 0U; 1447 (cmd.host_command_parameters)[46] = 0U; 1447 (cmd.host_command_parameters)[47] = 0U; 1447 (cmd.host_command_parameters)[48] = 0U; 1447 (cmd.host_command_parameters)[49] = 0U; 1447 (cmd.host_command_parameters)[50] = 0U; 1447 (cmd.host_command_parameters)[51] = 0U; 1447 (cmd.host_command_parameters)[52] = 0U; 1447 (cmd.host_command_parameters)[53] = 0U; 1447 (cmd.host_command_parameters)[54] = 0U; 1447 (cmd.host_command_parameters)[55] = 0U; 1447 (cmd.host_command_parameters)[56] = 0U; 1447 (cmd.host_command_parameters)[57] = 0U; 1447 (cmd.host_command_parameters)[58] = 0U; 1447 (cmd.host_command_parameters)[59] = 0U; 1447 (cmd.host_command_parameters)[60] = 0U; 1447 (cmd.host_command_parameters)[61] = 0U; 1447 (cmd.host_command_parameters)[62] = 0U; 1447 (cmd.host_command_parameters)[63] = 0U; 1447 (cmd.host_command_parameters)[64] = 0U; 1447 (cmd.host_command_parameters)[65] = 0U; 1447 (cmd.host_command_parameters)[66] = 0U; 1447 (cmd.host_command_parameters)[67] = 0U; 1447 (cmd.host_command_parameters)[68] = 0U; 1447 (cmd.host_command_parameters)[69] = 0U; 1447 (cmd.host_command_parameters)[70] = 0U; 1447 (cmd.host_command_parameters)[71] = 0U; 1447 (cmd.host_command_parameters)[72] = 0U; 1447 (cmd.host_command_parameters)[73] = 0U; 1447 (cmd.host_command_parameters)[74] = 0U; 1447 (cmd.host_command_parameters)[75] = 0U; 1447 (cmd.host_command_parameters)[76] = 0U; 1447 (cmd.host_command_parameters)[77] = 0U; 1447 (cmd.host_command_parameters)[78] = 0U; 1447 (cmd.host_command_parameters)[79] = 0U; 1447 (cmd.host_command_parameters)[80] = 0U; 1447 (cmd.host_command_parameters)[81] = 0U; 1447 (cmd.host_command_parameters)[82] = 0U; 1447 (cmd.host_command_parameters)[83] = 0U; 1447 (cmd.host_command_parameters)[84] = 0U; 1447 (cmd.host_command_parameters)[85] = 0U; 1447 (cmd.host_command_parameters)[86] = 0U; 1447 (cmd.host_command_parameters)[87] = 0U; 1447 (cmd.host_command_parameters)[88] = 0U; 1447 (cmd.host_command_parameters)[89] = 0U; 1447 (cmd.host_command_parameters)[90] = 0U; 1447 (cmd.host_command_parameters)[91] = 0U; 1447 (cmd.host_command_parameters)[92] = 0U; 1447 (cmd.host_command_parameters)[93] = 0U; 1447 (cmd.host_command_parameters)[94] = 0U; 1447 (cmd.host_command_parameters)[95] = 0U; 1447 (cmd.host_command_parameters)[96] = 0U; 1447 (cmd.host_command_parameters)[97] = 0U; 1447 (cmd.host_command_parameters)[98] = 0U; 1447 (cmd.host_command_parameters)[99] = 0U; 1452 err = 0; 1459 mutex_lock_nested(&(priv->adapter_mutex), 0U) { /* Function call is skipped due to function is undefined */} { 1169 unsigned short value; 1170 unsigned int reg; 1171 int i; 1172 value = 0U; 1173 reg = 0U; 1177 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, 0) { /* Function call is skipped due to function is undefined */} 1178 priv->status = (priv->status) & 18446744073709547519UL; } { } 732 struct list_head *element; 733 struct ipw2100_tx_packet *packet; 734 unsigned long flags; 735 int err; 736 int tmp; 737 raw_spinlock_t *tmp___0; 738 int tmp___1; 739 int tmp___2; 740 int tmp___3; 741 int tmp___4; 742 int tmp___5; 743 const struct list_head *__mptr; 744 unsigned long __len; 745 void *__ret; 746 long __ret___0; 747 struct __wait_queue __wait; 748 long __ret___1; 749 long __int; 750 long tmp___6; 751 _Bool __cond; 752 _Bool __cond___0; 753 int tmp___7; 754 unsigned long tmp___8; 736 err = 0; { 678 char line[81U]; 679 unsigned int ofs; 680 unsigned int _min1; 681 unsigned int _min2; 682 char *tmp; 683 unsigned int _min1___0; 684 unsigned int _min2___0; 679 ofs = 0U; } 744 flags = _raw_spin_lock_irqsave(tmp___0) { /* Function call is skipped due to function is undefined */} 772 priv->status = (priv->status) | 2UL; 773 priv->messages_sent = (priv->messages_sent) + 1; 775 element = priv->msg_free_list.next; 777 __mptr = (const struct list_head *)element; 777 packet = ((struct ipw2100_tx_packet *)__mptr) + 18446744073709551576UL; 778 packet->jiffy_start = (int)jiffies; 781 packet->info.c_struct.cmd->host_command_reg = cmd->host_command; 782 packet->info.c_struct.cmd->host_command_reg1 = cmd->host_command1; 783 packet->info.c_struct.cmd->host_command_len_reg = cmd->host_command_length; 785 packet->info.c_struct.cmd->sequence = cmd->host_command_sequence; 787 __len = 400UL; 787 __ret = __memcpy((void *)(&(packet->info.c_struct.cmd->host_command_params_reg)), (const void *)(&(cmd->host_command_parameters)), __len) { /* Function call is skipped due to function is undefined */} 791 list_del(element) { /* Function call is skipped due to function is undefined */} 792 priv->msg_free_stat.value = (priv->msg_free_stat.value) - 1; 792 priv->msg_free_stat.lo = priv->msg_free_stat.value; { 76 __list_add(new, head->prev, head) { /* Function call is skipped due to function is undefined */} } 795 priv->msg_pend_stat.value = (priv->msg_pend_stat.value) + 1; { 3016 struct list_head *element; 3017 struct ipw2100_tx_packet *packet; 3018 struct ipw2100_bd_queue *txq; 3019 struct ipw2100_bd *tbd; 3020 int next; 3021 int tmp; 3022 const struct list_head *__mptr; 3023 int tmp___0; 3024 int tmp___1; 3018 txq = &(priv->tx_queue); 3020 int __CPAchecker_TMP_0 = (int)(txq->next); 3020 next = __CPAchecker_TMP_0; 3022 goto ldv_55977; 3024 goto ldv_55976; 3023 ldv_55976:; 3031 goto ldv_55973; } { } 3085 struct list_head *element; 3086 struct ipw2100_tx_packet *packet; 3087 struct ipw2100_bd_queue *txq; 3088 struct ipw2100_bd *tbd; 3089 int next; 3090 int i; 3091 struct ipw2100_data_header *ipw_hdr; 3092 struct libipw_hdr_3addr *hdr; 3093 const struct list_head *__mptr; 3094 int tmp; 3095 long tmp___0; 3096 int tmp___1; 3097 unsigned long __len; 3098 void *__ret; 3099 unsigned long __len___0; 3100 void *__ret___0; 3101 unsigned long __len___1; 3102 void *__ret___1; 3103 unsigned long __len___2; 3104 void *__ret___2; 3105 int tmp___2; 3106 int tmp___3; 3107 unsigned long long tmp___4; 3108 int tmp___5; 3109 int tmp___6; 3087 txq = &(priv->tx_queue); 3089 int __CPAchecker_TMP_0 = (int)(txq->next); 3089 next = __CPAchecker_TMP_0; 3090 i = 0; 3094 goto ldv_56009; 3096 goto ldv_56008; 3095 ldv_56008:; 3101 element = priv->tx_pend_list.next; 3102 __mptr = (const struct list_head *)element; 3102 packet = ((struct ipw2100_tx_packet *)__mptr) + 18446744073709551576UL; 3104 int __CPAchecker_TMP_1 = (int)(packet->info.d_struct.txb->nr_frags); 3104 tmp___0 = __builtin_expect((__CPAchecker_TMP_1 + 1) > 6, 0L) { /* Function call is skipped due to function is undefined */} 3113 int __CPAchecker_TMP_3 = (int)(packet->info.d_struct.txb->nr_frags); 3118 list_del(element) { /* Function call is skipped due to function is undefined */} 3119 priv->tx_pend_stat.value = (priv->tx_pend_stat.value) - 1; 3121 unsigned long __CPAchecker_TMP_5 = (unsigned long)(txq->next); 3121 tbd = (txq->drv) + __CPAchecker_TMP_5; 3123 int __CPAchecker_TMP_6 = (int)(txq->next); 3123 packet->index = __CPAchecker_TMP_6; 3125 ipw_hdr = packet->info.d_struct.data; 3126 struct libipw_hdr_3addr *__CPAchecker_TMP_7 = (struct libipw_hdr_3addr *)(((packet->info.d_struct.txb->fragments)[0])->data); 3126 hdr = __CPAchecker_TMP_7; 3141 ipw_hdr->host_command_reg = 33U; 3142 ipw_hdr->host_command_reg1 = 0U; 3145 ipw_hdr->needs_encryption = 0U; 3146 ipw_hdr->encrypted = packet->info.d_struct.txb->encrypted; 3147 unsigned int __CPAchecker_TMP_8 = (unsigned int)(packet->info.d_struct.txb->nr_frags); 3152 ipw_hdr->fragment_size = 0U; 3154 tbd->host_addr = (u32 )(packet->info.d_struct.data_phys); 3155 tbd->buf_length = 52U; 3156 unsigned int __CPAchecker_TMP_10 = (unsigned int)(packet->info.d_struct.txb->nr_frags); 3156 tbd->num_fragments = __CPAchecker_TMP_10 + 1U; 3157 tbd->status.info.field = 1U; 3160 txq->next = (txq->next) + 1U; 3161 txq->next = (txq->next) % (txq->entries); 3166 unsigned int __CPAchecker_TMP_12 = (unsigned int)(packet->info.d_struct.txb->nr_frags); 3171 i = 0; 3171 goto ldv_56006; 3171 int __CPAchecker_TMP_22 = (int)(packet->info.d_struct.txb->nr_frags); 3173 goto ldv_56005; 3172 ldv_56005:; 3172 unsigned long __CPAchecker_TMP_15 = (unsigned long)(txq->next); 3172 tbd = (txq->drv) + __CPAchecker_TMP_15; 3173 int __CPAchecker_TMP_16 = (int)(packet->info.d_struct.txb->nr_frags); 3178 tbd->status.info.field = 1U; 3182 tbd->buf_length = (((packet->info.d_struct.txb->fragments)[i])->len) - 24U; 3185 void *__CPAchecker_TMP_17 = (void *)(((packet->info.d_struct.txb->fragments)[i])->data); 3185 size_t __CPAchecker_TMP_18 = (size_t )(tbd->buf_length); { 33 unsigned long long tmp; 32 struct device *__CPAchecker_TMP_0; 32 __CPAchecker_TMP_0 = &(hwdev->dev); 32 -ldv_dma_map_single_attrs_2(__CPAchecker_TMP_0, ptr, size, (enum dma_data_direction )direction, (struct dma_attrs *)0) { } 20 unsigned long long tmp; { } 58 unsigned long long nonedetermined; 59 void *tmp; 58 tmp = ldv_undef_ptr() { /* Function call is skipped due to function is undefined */} 58 nonedetermined = (dma_addr_t )tmp; 63 LDV_DMA_MAP_CALLS = LDV_DMA_MAP_CALLS + 1; } 3185 tbd->host_addr = (u32 )tmp___4; 3197 dma_addr_t __CPAchecker_TMP_20 = (dma_addr_t )(tbd->host_addr); 3197 size_t __CPAchecker_TMP_21 = (size_t )(tbd->buf_length); { 81 struct device *__CPAchecker_TMP_0; 81 __CPAchecker_TMP_0 = &(hwdev->dev); 81 -dma_sync_single_for_device(__CPAchecker_TMP_0, dma_handle, size, (enum dma_data_direction )direction) { } 124 struct dma_map_ops *ops; 125 struct dma_map_ops *tmp; 126 int tmp___0; 127 long tmp___1; { 34 long tmp; 37 tmp = __builtin_expect(((unsigned long)dev) == ((unsigned long)((struct device *)0)), 0L) { /* Function call is skipped due to function is undefined */} 37 assume(!(tmp != 0L)); 37 assume(!(((unsigned long)(dev->archdata.dma_ops)) == ((unsigned long)((struct dma_map_ops *)0)))); 40 return dev->archdata.dma_ops;; } 125 ops = tmp; 127 tmp___1 = __builtin_expect(tmp___0 == 0, 0L) { /* Function call is skipped due to function is undefined */} 128 unsigned long __CPAchecker_TMP_0 = (unsigned long)(ops->sync_single_for_device); 128 assume(__CPAchecker_TMP_0 != ((unsigned long)((void (*)(struct device *, dma_addr_t , size_t , enum dma_data_direction ))0))); 129 (*(ops->sync_single_for_device))(dev, addr, size, dir); 130 debug_dma_sync_single_for_device(dev, addr, size, (int)dir) { /* Function call is skipped due to function is undefined */} } 3202 txq->next = (txq->next) + 1U; 3203 txq->next = (txq->next) % (txq->entries); 3171 i = i + 1; 3172 ldv_56006:; 3171 int __CPAchecker_TMP_22 = (int)(packet->info.d_struct.txb->nr_frags); 3173 goto ldv_56005; 3172 ldv_56005:; 3172 unsigned long __CPAchecker_TMP_15 = (unsigned long)(txq->next); 3172 tbd = (txq->drv) + __CPAchecker_TMP_15; 3173 int __CPAchecker_TMP_16 = (int)(packet->info.d_struct.txb->nr_frags); 3178 tbd->status.info.field = 1U; 3182 tbd->buf_length = (((packet->info.d_struct.txb->fragments)[i])->len) - 24U; 3185 void *__CPAchecker_TMP_17 = (void *)(((packet->info.d_struct.txb->fragments)[i])->data); 3185 size_t __CPAchecker_TMP_18 = (size_t )(tbd->buf_length); { } 33 unsigned long long tmp; 32 struct device *__CPAchecker_TMP_0; 32 __CPAchecker_TMP_0 = &(hwdev->dev); 32 -ldv_dma_map_single_attrs_2(__CPAchecker_TMP_0, ptr, size, (enum dma_data_direction )direction, (struct dma_attrs *)0) { } 20 unsigned long long tmp; { } 58 unsigned long long nonedetermined; 59 void *tmp; 58 tmp = ldv_undef_ptr() { /* Function call is skipped due to function is undefined */} 58 nonedetermined = (dma_addr_t )tmp; } | Source code
1
2 /******************************************************************************
3
4 Copyright(c) 2003 - 2006 Intel Corporation. All rights reserved.
5
6 This program is free software; you can redistribute it and/or modify it
7 under the terms of version 2 of the GNU General Public License as
8 published by the Free Software Foundation.
9
10 This program is distributed in the hope that it will be useful, but WITHOUT
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 more details.
14
15 You should have received a copy of the GNU General Public License along with
16 this program; if not, write to the Free Software Foundation, Inc., 59
17 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
19 The full GNU General Public License is included in this distribution in the
20 file called LICENSE.
21
22 Contact Information:
23 Intel Linux Wireless <ilw@linux.intel.com>
24 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
25
26 Portions of this file are based on the sample_* files provided by Wireless
27 Extensions 0.26 package and copyright (c) 1997-2003 Jean Tourrilhes
28 <jt@hpl.hp.com>
29
30 Portions of this file are based on the Host AP project,
31 Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
32 <j@w1.fi>
33 Copyright (c) 2002-2003, Jouni Malinen <j@w1.fi>
34
35 Portions of ipw2100_mod_firmware_load, ipw2100_do_mod_firmware_load, and
36 ipw2100_fw_load are loosely based on drivers/sound/sound_firmware.c
37 available in the 2.4.25 kernel sources, and are copyright (c) Alan Cox
38
39 ******************************************************************************/
40 /*
41
42 Initial driver on which this is based was developed by Janusz Gorycki,
43 Maciej Urbaniak, and Maciej Sosnowski.
44
45 Promiscuous mode support added by Jacek Wysoczynski and Maciej Urbaniak.
46
47 Theory of Operation
48
49 Tx - Commands and Data
50
51 Firmware and host share a circular queue of Transmit Buffer Descriptors (TBDs)
52 Each TBD contains a pointer to the physical (dma_addr_t) address of data being
53 sent to the firmware as well as the length of the data.
54
55 The host writes to the TBD queue at the WRITE index. The WRITE index points
56 to the _next_ packet to be written and is advanced when after the TBD has been
57 filled.
58
59 The firmware pulls from the TBD queue at the READ index. The READ index points
60 to the currently being read entry, and is advanced once the firmware is
61 done with a packet.
62
63 When data is sent to the firmware, the first TBD is used to indicate to the
64 firmware if a Command or Data is being sent. If it is Command, all of the
65 command information is contained within the physical address referred to by the
66 TBD. If it is Data, the first TBD indicates the type of data packet, number
67 of fragments, etc. The next TBD then refers to the actual packet location.
68
69 The Tx flow cycle is as follows:
70
71 1) ipw2100_tx() is called by kernel with SKB to transmit
72 2) Packet is move from the tx_free_list and appended to the transmit pending
73 list (tx_pend_list)
74 3) work is scheduled to move pending packets into the shared circular queue.
75 4) when placing packet in the circular queue, the incoming SKB is DMA mapped
76 to a physical address. That address is entered into a TBD. Two TBDs are
77 filled out. The first indicating a data packet, the second referring to the
78 actual payload data.
79 5) the packet is removed from tx_pend_list and placed on the end of the
80 firmware pending list (fw_pend_list)
81 6) firmware is notified that the WRITE index has
82 7) Once the firmware has processed the TBD, INTA is triggered.
83 8) For each Tx interrupt received from the firmware, the READ index is checked
84 to see which TBDs are done being processed.
85 9) For each TBD that has been processed, the ISR pulls the oldest packet
86 from the fw_pend_list.
87 10)The packet structure contained in the fw_pend_list is then used
88 to unmap the DMA address and to free the SKB originally passed to the driver
89 from the kernel.
90 11)The packet structure is placed onto the tx_free_list
91
92 The above steps are the same for commands, only the msg_free_list/msg_pend_list
93 are used instead of tx_free_list/tx_pend_list
94
95 ...
96
97 Critical Sections / Locking :
98
99 There are two locks utilized. The first is the low level lock (priv->low_lock)
100 that protects the following:
101
102 - Access to the Tx/Rx queue lists via priv->low_lock. The lists are as follows:
103
104 tx_free_list : Holds pre-allocated Tx buffers.
105 TAIL modified in __ipw2100_tx_process()
106 HEAD modified in ipw2100_tx()
107
108 tx_pend_list : Holds used Tx buffers waiting to go into the TBD ring
109 TAIL modified ipw2100_tx()
110 HEAD modified by ipw2100_tx_send_data()
111
112 msg_free_list : Holds pre-allocated Msg (Command) buffers
113 TAIL modified in __ipw2100_tx_process()
114 HEAD modified in ipw2100_hw_send_command()
115
116 msg_pend_list : Holds used Msg buffers waiting to go into the TBD ring
117 TAIL modified in ipw2100_hw_send_command()
118 HEAD modified in ipw2100_tx_send_commands()
119
120 The flow of data on the TX side is as follows:
121
122 MSG_FREE_LIST + COMMAND => MSG_PEND_LIST => TBD => MSG_FREE_LIST
123 TX_FREE_LIST + DATA => TX_PEND_LIST => TBD => TX_FREE_LIST
124
125 The methods that work on the TBD ring are protected via priv->low_lock.
126
127 - The internal data state of the device itself
128 - Access to the firmware read/write indexes for the BD queues
129 and associated logic
130
131 All external entry functions are locked with the priv->action_lock to ensure
132 that only one external action is invoked at a time.
133
134
135 */
136
137 #include <linux/compiler.h>
138 #include <linux/errno.h>
139 #include <linux/if_arp.h>
140 #include <linux/in6.h>
141 #include <linux/in.h>
142 #include <linux/ip.h>
143 #include <linux/kernel.h>
144 #include <linux/kmod.h>
145 #include <linux/module.h>
146 #include <linux/netdevice.h>
147 #include <linux/ethtool.h>
148 #include <linux/pci.h>
149 #include <linux/dma-mapping.h>
150 #include <linux/proc_fs.h>
151 #include <linux/skbuff.h>
152 #include <asm/uaccess.h>
153 #include <asm/io.h>
154 #include <linux/fs.h>
155 #include <linux/mm.h>
156 #include <linux/slab.h>
157 #include <linux/unistd.h>
158 #include <linux/stringify.h>
159 #include <linux/tcp.h>
160 #include <linux/types.h>
161 #include <linux/time.h>
162 #include <linux/firmware.h>
163 #include <linux/acpi.h>
164 #include <linux/ctype.h>
165 #include <linux/pm_qos.h>
166
167 #include <net/lib80211.h>
168
169 #include "ipw2100.h"
170 #include "ipw.h"
171
172 #define IPW2100_VERSION "git-1.2.2"
173
174 #define DRV_NAME "ipw2100"
175 #define DRV_VERSION IPW2100_VERSION
176 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
177 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
178
179 static struct pm_qos_request ipw2100_pm_qos_req;
180
181 /* Debugging stuff */
182 #ifdef CONFIG_IPW2100_DEBUG
183 #define IPW2100_RX_DEBUG /* Reception debugging */
184 #endif
185
186 MODULE_DESCRIPTION(DRV_DESCRIPTION);
187 MODULE_VERSION(DRV_VERSION);
188 MODULE_AUTHOR(DRV_COPYRIGHT);
189 MODULE_LICENSE("GPL");
190
191 static int debug = 0;
192 static int network_mode = 0;
193 static int channel = 0;
194 static int associate = 0;
195 static int disable = 0;
196 #ifdef CONFIG_PM
197 static struct ipw2100_fw ipw2100_firmware;
198 #endif
199
200 #include <linux/moduleparam.h>
201 module_param(debug, int, 0444);
202 module_param_named(mode, network_mode, int, 0444);
203 module_param(channel, int, 0444);
204 module_param(associate, int, 0444);
205 module_param(disable, int, 0444);
206
207 MODULE_PARM_DESC(debug, "debug level");
208 MODULE_PARM_DESC(mode, "network mode (0=BSS,1=IBSS,2=Monitor)");
209 MODULE_PARM_DESC(channel, "channel");
210 MODULE_PARM_DESC(associate, "auto associate when scanning (default off)");
211 MODULE_PARM_DESC(disable, "manually disable the radio (default 0 [radio on])");
212
213 static u32 ipw2100_debug_level = IPW_DL_NONE;
214
215 #ifdef CONFIG_IPW2100_DEBUG
216 #define IPW_DEBUG(level, message...) \
217 do { \
218 if (ipw2100_debug_level & (level)) { \
219 printk(KERN_DEBUG "ipw2100: %c %s ", \
220 in_interrupt() ? 'I' : 'U', __func__); \
221 printk(message); \
222 } \
223 } while (0)
224 #else
225 #define IPW_DEBUG(level, message...) do {} while (0)
226 #endif /* CONFIG_IPW2100_DEBUG */
227
228 #ifdef CONFIG_IPW2100_DEBUG
229 static const char *command_types[] = {
230 "undefined",
231 "unused", /* HOST_ATTENTION */
232 "HOST_COMPLETE",
233 "unused", /* SLEEP */
234 "unused", /* HOST_POWER_DOWN */
235 "unused",
236 "SYSTEM_CONFIG",
237 "unused", /* SET_IMR */
238 "SSID",
239 "MANDATORY_BSSID",
240 "AUTHENTICATION_TYPE",
241 "ADAPTER_ADDRESS",
242 "PORT_TYPE",
243 "INTERNATIONAL_MODE",
244 "CHANNEL",
245 "RTS_THRESHOLD",
246 "FRAG_THRESHOLD",
247 "POWER_MODE",
248 "TX_RATES",
249 "BASIC_TX_RATES",
250 "WEP_KEY_INFO",
251 "unused",
252 "unused",
253 "unused",
254 "unused",
255 "WEP_KEY_INDEX",
256 "WEP_FLAGS",
257 "ADD_MULTICAST",
258 "CLEAR_ALL_MULTICAST",
259 "BEACON_INTERVAL",
260 "ATIM_WINDOW",
261 "CLEAR_STATISTICS",
262 "undefined",
263 "undefined",
264 "undefined",
265 "undefined",
266 "TX_POWER_INDEX",
267 "undefined",
268 "undefined",
269 "undefined",
270 "undefined",
271 "undefined",
272 "undefined",
273 "BROADCAST_SCAN",
274 "CARD_DISABLE",
275 "PREFERRED_BSSID",
276 "SET_SCAN_OPTIONS",
277 "SCAN_DWELL_TIME",
278 "SWEEP_TABLE",
279 "AP_OR_STATION_TABLE",
280 "GROUP_ORDINALS",
281 "SHORT_RETRY_LIMIT",
282 "LONG_RETRY_LIMIT",
283 "unused", /* SAVE_CALIBRATION */
284 "unused", /* RESTORE_CALIBRATION */
285 "undefined",
286 "undefined",
287 "undefined",
288 "HOST_PRE_POWER_DOWN",
289 "unused", /* HOST_INTERRUPT_COALESCING */
290 "undefined",
291 "CARD_DISABLE_PHY_OFF",
292 "MSDU_TX_RATES",
293 "undefined",
294 "SET_STATION_STAT_BITS",
295 "CLEAR_STATIONS_STAT_BITS",
296 "LEAP_ROGUE_MODE",
297 "SET_SECURITY_INFORMATION",
298 "DISASSOCIATION_BSSID",
299 "SET_WPA_ASS_IE"
300 };
301 #endif
302
303 static const long ipw2100_frequencies[] = {
304 2412, 2417, 2422, 2427,
305 2432, 2437, 2442, 2447,
306 2452, 2457, 2462, 2467,
307 2472, 2484
308 };
309
310 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
311
312 static struct ieee80211_rate ipw2100_bg_rates[] = {
313 { .bitrate = 10 },
314 { .bitrate = 20, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
315 { .bitrate = 55, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
316 { .bitrate = 110, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
317 };
318
319 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
320
321 /* Pre-decl until we get the code solid and then we can clean it up */
322 static void ipw2100_tx_send_commands(struct ipw2100_priv *priv);
323 static void ipw2100_tx_send_data(struct ipw2100_priv *priv);
324 static int ipw2100_adapter_setup(struct ipw2100_priv *priv);
325
326 static void ipw2100_queues_initialize(struct ipw2100_priv *priv);
327 static void ipw2100_queues_free(struct ipw2100_priv *priv);
328 static int ipw2100_queues_allocate(struct ipw2100_priv *priv);
329
330 static int ipw2100_fw_download(struct ipw2100_priv *priv,
331 struct ipw2100_fw *fw);
332 static int ipw2100_get_firmware(struct ipw2100_priv *priv,
333 struct ipw2100_fw *fw);
334 static int ipw2100_get_fwversion(struct ipw2100_priv *priv, char *buf,
335 size_t max);
336 static int ipw2100_get_ucodeversion(struct ipw2100_priv *priv, char *buf,
337 size_t max);
338 static void ipw2100_release_firmware(struct ipw2100_priv *priv,
339 struct ipw2100_fw *fw);
340 static int ipw2100_ucode_download(struct ipw2100_priv *priv,
341 struct ipw2100_fw *fw);
342 static void ipw2100_wx_event_work(struct work_struct *work);
343 static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev);
344 static struct iw_handler_def ipw2100_wx_handler_def;
345
346 static inline void read_register(struct net_device *dev, u32 reg, u32 * val)
347 {
348 struct ipw2100_priv *priv = libipw_priv(dev);
349
350 *val = ioread32(priv->ioaddr + reg);
351 IPW_DEBUG_IO("r: 0x%08X => 0x%08X\n", reg, *val);
352 }
353
354 static inline void write_register(struct net_device *dev, u32 reg, u32 val)
355 {
356 struct ipw2100_priv *priv = libipw_priv(dev);
357
358 iowrite32(val, priv->ioaddr + reg);
359 IPW_DEBUG_IO("w: 0x%08X <= 0x%08X\n", reg, val);
360 }
361
362 static inline void read_register_word(struct net_device *dev, u32 reg,
363 u16 * val)
364 {
365 struct ipw2100_priv *priv = libipw_priv(dev);
366
367 *val = ioread16(priv->ioaddr + reg);
368 IPW_DEBUG_IO("r: 0x%08X => %04X\n", reg, *val);
369 }
370
371 static inline void read_register_byte(struct net_device *dev, u32 reg, u8 * val)
372 {
373 struct ipw2100_priv *priv = libipw_priv(dev);
374
375 *val = ioread8(priv->ioaddr + reg);
376 IPW_DEBUG_IO("r: 0x%08X => %02X\n", reg, *val);
377 }
378
379 static inline void write_register_word(struct net_device *dev, u32 reg, u16 val)
380 {
381 struct ipw2100_priv *priv = libipw_priv(dev);
382
383 iowrite16(val, priv->ioaddr + reg);
384 IPW_DEBUG_IO("w: 0x%08X <= %04X\n", reg, val);
385 }
386
387 static inline void write_register_byte(struct net_device *dev, u32 reg, u8 val)
388 {
389 struct ipw2100_priv *priv = libipw_priv(dev);
390
391 iowrite8(val, priv->ioaddr + reg);
392 IPW_DEBUG_IO("w: 0x%08X =< %02X\n", reg, val);
393 }
394
395 static inline void read_nic_dword(struct net_device *dev, u32 addr, u32 * val)
396 {
397 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
398 addr & IPW_REG_INDIRECT_ADDR_MASK);
399 read_register(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
400 }
401
402 static inline void write_nic_dword(struct net_device *dev, u32 addr, u32 val)
403 {
404 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
405 addr & IPW_REG_INDIRECT_ADDR_MASK);
406 write_register(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
407 }
408
409 static inline void read_nic_word(struct net_device *dev, u32 addr, u16 * val)
410 {
411 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
412 addr & IPW_REG_INDIRECT_ADDR_MASK);
413 read_register_word(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
414 }
415
416 static inline void write_nic_word(struct net_device *dev, u32 addr, u16 val)
417 {
418 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
419 addr & IPW_REG_INDIRECT_ADDR_MASK);
420 write_register_word(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
421 }
422
423 static inline void read_nic_byte(struct net_device *dev, u32 addr, u8 * val)
424 {
425 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
426 addr & IPW_REG_INDIRECT_ADDR_MASK);
427 read_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
428 }
429
430 static inline void write_nic_byte(struct net_device *dev, u32 addr, u8 val)
431 {
432 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
433 addr & IPW_REG_INDIRECT_ADDR_MASK);
434 write_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
435 }
436
437 static inline void write_nic_auto_inc_address(struct net_device *dev, u32 addr)
438 {
439 write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS,
440 addr & IPW_REG_INDIRECT_ADDR_MASK);
441 }
442
443 static inline void write_nic_dword_auto_inc(struct net_device *dev, u32 val)
444 {
445 write_register(dev, IPW_REG_AUTOINCREMENT_DATA, val);
446 }
447
448 static void write_nic_memory(struct net_device *dev, u32 addr, u32 len,
449 const u8 * buf)
450 {
451 u32 aligned_addr;
452 u32 aligned_len;
453 u32 dif_len;
454 u32 i;
455
456 /* read first nibble byte by byte */
457 aligned_addr = addr & (~0x3);
458 dif_len = addr - aligned_addr;
459 if (dif_len) {
460 /* Start reading at aligned_addr + dif_len */
461 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
462 aligned_addr);
463 for (i = dif_len; i < 4; i++, buf++)
464 write_register_byte(dev,
465 IPW_REG_INDIRECT_ACCESS_DATA + i,
466 *buf);
467
468 len -= dif_len;
469 aligned_addr += 4;
470 }
471
472 /* read DWs through autoincrement registers */
473 write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS, aligned_addr);
474 aligned_len = len & (~0x3);
475 for (i = 0; i < aligned_len; i += 4, buf += 4, aligned_addr += 4)
476 write_register(dev, IPW_REG_AUTOINCREMENT_DATA, *(u32 *) buf);
477
478 /* copy the last nibble */
479 dif_len = len - aligned_len;
480 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, aligned_addr);
481 for (i = 0; i < dif_len; i++, buf++)
482 write_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA + i,
483 *buf);
484 }
485
486 static void read_nic_memory(struct net_device *dev, u32 addr, u32 len,
487 u8 * buf)
488 {
489 u32 aligned_addr;
490 u32 aligned_len;
491 u32 dif_len;
492 u32 i;
493
494 /* read first nibble byte by byte */
495 aligned_addr = addr & (~0x3);
496 dif_len = addr - aligned_addr;
497 if (dif_len) {
498 /* Start reading at aligned_addr + dif_len */
499 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
500 aligned_addr);
501 for (i = dif_len; i < 4; i++, buf++)
502 read_register_byte(dev,
503 IPW_REG_INDIRECT_ACCESS_DATA + i,
504 buf);
505
506 len -= dif_len;
507 aligned_addr += 4;
508 }
509
510 /* read DWs through autoincrement registers */
511 write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS, aligned_addr);
512 aligned_len = len & (~0x3);
513 for (i = 0; i < aligned_len; i += 4, buf += 4, aligned_addr += 4)
514 read_register(dev, IPW_REG_AUTOINCREMENT_DATA, (u32 *) buf);
515
516 /* copy the last nibble */
517 dif_len = len - aligned_len;
518 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, aligned_addr);
519 for (i = 0; i < dif_len; i++, buf++)
520 read_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA + i, buf);
521 }
522
523 static bool ipw2100_hw_is_adapter_in_system(struct net_device *dev)
524 {
525 u32 dbg;
526
527 read_register(dev, IPW_REG_DOA_DEBUG_AREA_START, &dbg);
528
529 return dbg == IPW_DATA_DOA_DEBUG_VALUE;
530 }
531
532 static int ipw2100_get_ordinal(struct ipw2100_priv *priv, u32 ord,
533 void *val, u32 * len)
534 {
535 struct ipw2100_ordinals *ordinals = &priv->ordinals;
536 u32 addr;
537 u32 field_info;
538 u16 field_len;
539 u16 field_count;
540 u32 total_length;
541
542 if (ordinals->table1_addr == 0) {
543 printk(KERN_WARNING DRV_NAME ": attempt to use fw ordinals "
544 "before they have been loaded.\n");
545 return -EINVAL;
546 }
547
548 if (IS_ORDINAL_TABLE_ONE(ordinals, ord)) {
549 if (*len < IPW_ORD_TAB_1_ENTRY_SIZE) {
550 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
551
552 printk(KERN_WARNING DRV_NAME
553 ": ordinal buffer length too small, need %zd\n",
554 IPW_ORD_TAB_1_ENTRY_SIZE);
555
556 return -EINVAL;
557 }
558
559 read_nic_dword(priv->net_dev,
560 ordinals->table1_addr + (ord << 2), &addr);
561 read_nic_dword(priv->net_dev, addr, val);
562
563 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
564
565 return 0;
566 }
567
568 if (IS_ORDINAL_TABLE_TWO(ordinals, ord)) {
569
570 ord -= IPW_START_ORD_TAB_2;
571
572 /* get the address of statistic */
573 read_nic_dword(priv->net_dev,
574 ordinals->table2_addr + (ord << 3), &addr);
575
576 /* get the second DW of statistics ;
577 * two 16-bit words - first is length, second is count */
578 read_nic_dword(priv->net_dev,
579 ordinals->table2_addr + (ord << 3) + sizeof(u32),
580 &field_info);
581
582 /* get each entry length */
583 field_len = *((u16 *) & field_info);
584
585 /* get number of entries */
586 field_count = *(((u16 *) & field_info) + 1);
587
588 /* abort if no enough memory */
589 total_length = field_len * field_count;
590 if (total_length > *len) {
591 *len = total_length;
592 return -EINVAL;
593 }
594
595 *len = total_length;
596 if (!total_length)
597 return 0;
598
599 /* read the ordinal data from the SRAM */
600 read_nic_memory(priv->net_dev, addr, total_length, val);
601
602 return 0;
603 }
604
605 printk(KERN_WARNING DRV_NAME ": ordinal %d neither in table 1 nor "
606 "in table 2\n", ord);
607
608 return -EINVAL;
609 }
610
611 static int ipw2100_set_ordinal(struct ipw2100_priv *priv, u32 ord, u32 * val,
612 u32 * len)
613 {
614 struct ipw2100_ordinals *ordinals = &priv->ordinals;
615 u32 addr;
616
617 if (IS_ORDINAL_TABLE_ONE(ordinals, ord)) {
618 if (*len != IPW_ORD_TAB_1_ENTRY_SIZE) {
619 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
620 IPW_DEBUG_INFO("wrong size\n");
621 return -EINVAL;
622 }
623
624 read_nic_dword(priv->net_dev,
625 ordinals->table1_addr + (ord << 2), &addr);
626
627 write_nic_dword(priv->net_dev, addr, *val);
628
629 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
630
631 return 0;
632 }
633
634 IPW_DEBUG_INFO("wrong table\n");
635 if (IS_ORDINAL_TABLE_TWO(ordinals, ord))
636 return -EINVAL;
637
638 return -EINVAL;
639 }
640
641 static char *snprint_line(char *buf, size_t count,
642 const u8 * data, u32 len, u32 ofs)
643 {
644 int out, i, j, l;
645 char c;
646
647 out = snprintf(buf, count, "%08X", ofs);
648
649 for (l = 0, i = 0; i < 2; i++) {
650 out += snprintf(buf + out, count - out, " ");
651 for (j = 0; j < 8 && l < len; j++, l++)
652 out += snprintf(buf + out, count - out, "%02X ",
653 data[(i * 8 + j)]);
654 for (; j < 8; j++)
655 out += snprintf(buf + out, count - out, " ");
656 }
657
658 out += snprintf(buf + out, count - out, " ");
659 for (l = 0, i = 0; i < 2; i++) {
660 out += snprintf(buf + out, count - out, " ");
661 for (j = 0; j < 8 && l < len; j++, l++) {
662 c = data[(i * 8 + j)];
663 if (!isascii(c) || !isprint(c))
664 c = '.';
665
666 out += snprintf(buf + out, count - out, "%c", c);
667 }
668
669 for (; j < 8; j++)
670 out += snprintf(buf + out, count - out, " ");
671 }
672
673 return buf;
674 }
675
676 static void printk_buf(int level, const u8 * data, u32 len)
677 {
678 char line[81];
679 u32 ofs = 0;
680 if (!(ipw2100_debug_level & level))
681 return;
682
683 while (len) {
684 printk(KERN_DEBUG "%s\n",
685 snprint_line(line, sizeof(line), &data[ofs],
686 min(len, 16U), ofs));
687 ofs += 16;
688 len -= min(len, 16U);
689 }
690 }
691
692 #define MAX_RESET_BACKOFF 10
693
694 static void schedule_reset(struct ipw2100_priv *priv)
695 {
696 unsigned long now = get_seconds();
697
698 /* If we haven't received a reset request within the backoff period,
699 * then we can reset the backoff interval so this reset occurs
700 * immediately */
701 if (priv->reset_backoff &&
702 (now - priv->last_reset > priv->reset_backoff))
703 priv->reset_backoff = 0;
704
705 priv->last_reset = get_seconds();
706
707 if (!(priv->status & STATUS_RESET_PENDING)) {
708 IPW_DEBUG_INFO("%s: Scheduling firmware restart (%ds).\n",
709 priv->net_dev->name, priv->reset_backoff);
710 netif_carrier_off(priv->net_dev);
711 netif_stop_queue(priv->net_dev);
712 priv->status |= STATUS_RESET_PENDING;
713 if (priv->reset_backoff)
714 schedule_delayed_work(&priv->reset_work,
715 priv->reset_backoff * HZ);
716 else
717 schedule_delayed_work(&priv->reset_work, 0);
718
719 if (priv->reset_backoff < MAX_RESET_BACKOFF)
720 priv->reset_backoff++;
721
722 wake_up_interruptible(&priv->wait_command_queue);
723 } else
724 IPW_DEBUG_INFO("%s: Firmware restart already in progress.\n",
725 priv->net_dev->name);
726
727 }
728
729 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
730 static int ipw2100_hw_send_command(struct ipw2100_priv *priv,
731 struct host_command *cmd)
732 {
733 struct list_head *element;
734 struct ipw2100_tx_packet *packet;
735 unsigned long flags;
736 int err = 0;
737
738 IPW_DEBUG_HC("Sending %s command (#%d), %d bytes\n",
739 command_types[cmd->host_command], cmd->host_command,
740 cmd->host_command_length);
741 printk_buf(IPW_DL_HC, (u8 *) cmd->host_command_parameters,
742 cmd->host_command_length);
743
744 spin_lock_irqsave(&priv->low_lock, flags);
745
746 if (priv->fatal_error) {
747 IPW_DEBUG_INFO
748 ("Attempt to send command while hardware in fatal error condition.\n");
749 err = -EIO;
750 goto fail_unlock;
751 }
752
753 if (!(priv->status & STATUS_RUNNING)) {
754 IPW_DEBUG_INFO
755 ("Attempt to send command while hardware is not running.\n");
756 err = -EIO;
757 goto fail_unlock;
758 }
759
760 if (priv->status & STATUS_CMD_ACTIVE) {
761 IPW_DEBUG_INFO
762 ("Attempt to send command while another command is pending.\n");
763 err = -EBUSY;
764 goto fail_unlock;
765 }
766
767 if (list_empty(&priv->msg_free_list)) {
768 IPW_DEBUG_INFO("no available msg buffers\n");
769 goto fail_unlock;
770 }
771
772 priv->status |= STATUS_CMD_ACTIVE;
773 priv->messages_sent++;
774
775 element = priv->msg_free_list.next;
776
777 packet = list_entry(element, struct ipw2100_tx_packet, list);
778 packet->jiffy_start = jiffies;
779
780 /* initialize the firmware command packet */
781 packet->info.c_struct.cmd->host_command_reg = cmd->host_command;
782 packet->info.c_struct.cmd->host_command_reg1 = cmd->host_command1;
783 packet->info.c_struct.cmd->host_command_len_reg =
784 cmd->host_command_length;
785 packet->info.c_struct.cmd->sequence = cmd->host_command_sequence;
786
787 memcpy(packet->info.c_struct.cmd->host_command_params_reg,
788 cmd->host_command_parameters,
789 sizeof(packet->info.c_struct.cmd->host_command_params_reg));
790
791 list_del(element);
792 DEC_STAT(&priv->msg_free_stat);
793
794 list_add_tail(element, &priv->msg_pend_list);
795 INC_STAT(&priv->msg_pend_stat);
796
797 ipw2100_tx_send_commands(priv);
798 ipw2100_tx_send_data(priv);
799
800 spin_unlock_irqrestore(&priv->low_lock, flags);
801
802 /*
803 * We must wait for this command to complete before another
804 * command can be sent... but if we wait more than 3 seconds
805 * then there is a problem.
806 */
807
808 err =
809 wait_event_interruptible_timeout(priv->wait_command_queue,
810 !(priv->
811 status & STATUS_CMD_ACTIVE),
812 HOST_COMPLETE_TIMEOUT);
813
814 if (err == 0) {
815 IPW_DEBUG_INFO("Command completion failed out after %dms.\n",
816 1000 * (HOST_COMPLETE_TIMEOUT / HZ));
817 priv->fatal_error = IPW2100_ERR_MSG_TIMEOUT;
818 priv->status &= ~STATUS_CMD_ACTIVE;
819 schedule_reset(priv);
820 return -EIO;
821 }
822
823 if (priv->fatal_error) {
824 printk(KERN_WARNING DRV_NAME ": %s: firmware fatal error\n",
825 priv->net_dev->name);
826 return -EIO;
827 }
828
829 /* !!!!! HACK TEST !!!!!
830 * When lots of debug trace statements are enabled, the driver
831 * doesn't seem to have as many firmware restart cycles...
832 *
833 * As a test, we're sticking in a 1/100s delay here */
834 schedule_timeout_uninterruptible(msecs_to_jiffies(10));
835
836 return 0;
837
838 fail_unlock:
839 spin_unlock_irqrestore(&priv->low_lock, flags);
840
841 return err;
842 }
843
844 /*
845 * Verify the values and data access of the hardware
846 * No locks needed or used. No functions called.
847 */
848 static int ipw2100_verify(struct ipw2100_priv *priv)
849 {
850 u32 data1, data2;
851 u32 address;
852
853 u32 val1 = 0x76543210;
854 u32 val2 = 0xFEDCBA98;
855
856 /* Domain 0 check - all values should be DOA_DEBUG */
857 for (address = IPW_REG_DOA_DEBUG_AREA_START;
858 address < IPW_REG_DOA_DEBUG_AREA_END; address += sizeof(u32)) {
859 read_register(priv->net_dev, address, &data1);
860 if (data1 != IPW_DATA_DOA_DEBUG_VALUE)
861 return -EIO;
862 }
863
864 /* Domain 1 check - use arbitrary read/write compare */
865 for (address = 0; address < 5; address++) {
866 /* The memory area is not used now */
867 write_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x32,
868 val1);
869 write_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x36,
870 val2);
871 read_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x32,
872 &data1);
873 read_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x36,
874 &data2);
875 if (val1 == data1 && val2 == data2)
876 return 0;
877 }
878
879 return -EIO;
880 }
881
882 /*
883 *
884 * Loop until the CARD_DISABLED bit is the same value as the
885 * supplied parameter
886 *
887 * TODO: See if it would be more efficient to do a wait/wake
888 * cycle and have the completion event trigger the wakeup
889 *
890 */
891 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100 // 100 milli
892 static int ipw2100_wait_for_card_state(struct ipw2100_priv *priv, int state)
893 {
894 int i;
895 u32 card_state;
896 u32 len = sizeof(card_state);
897 int err;
898
899 for (i = 0; i <= IPW_CARD_DISABLE_COMPLETE_WAIT * 1000; i += 50) {
900 err = ipw2100_get_ordinal(priv, IPW_ORD_CARD_DISABLED,
901 &card_state, &len);
902 if (err) {
903 IPW_DEBUG_INFO("Query of CARD_DISABLED ordinal "
904 "failed.\n");
905 return 0;
906 }
907
908 /* We'll break out if either the HW state says it is
909 * in the state we want, or if HOST_COMPLETE command
910 * finishes */
911 if ((card_state == state) ||
912 ((priv->status & STATUS_ENABLED) ?
913 IPW_HW_STATE_ENABLED : IPW_HW_STATE_DISABLED) == state) {
914 if (state == IPW_HW_STATE_ENABLED)
915 priv->status |= STATUS_ENABLED;
916 else
917 priv->status &= ~STATUS_ENABLED;
918
919 return 0;
920 }
921
922 udelay(50);
923 }
924
925 IPW_DEBUG_INFO("ipw2100_wait_for_card_state to %s state timed out\n",
926 state ? "DISABLED" : "ENABLED");
927 return -EIO;
928 }
929
930 /*********************************************************************
931 Procedure : sw_reset_and_clock
932 Purpose : Asserts s/w reset, asserts clock initialization
933 and waits for clock stabilization
934 ********************************************************************/
935 static int sw_reset_and_clock(struct ipw2100_priv *priv)
936 {
937 int i;
938 u32 r;
939
940 // assert s/w reset
941 write_register(priv->net_dev, IPW_REG_RESET_REG,
942 IPW_AUX_HOST_RESET_REG_SW_RESET);
943
944 // wait for clock stabilization
945 for (i = 0; i < 1000; i++) {
946 udelay(IPW_WAIT_RESET_ARC_COMPLETE_DELAY);
947
948 // check clock ready bit
949 read_register(priv->net_dev, IPW_REG_RESET_REG, &r);
950 if (r & IPW_AUX_HOST_RESET_REG_PRINCETON_RESET)
951 break;
952 }
953
954 if (i == 1000)
955 return -EIO; // TODO: better error value
956
957 /* set "initialization complete" bit to move adapter to
958 * D0 state */
959 write_register(priv->net_dev, IPW_REG_GP_CNTRL,
960 IPW_AUX_HOST_GP_CNTRL_BIT_INIT_DONE);
961
962 /* wait for clock stabilization */
963 for (i = 0; i < 10000; i++) {
964 udelay(IPW_WAIT_CLOCK_STABILIZATION_DELAY * 4);
965
966 /* check clock ready bit */
967 read_register(priv->net_dev, IPW_REG_GP_CNTRL, &r);
968 if (r & IPW_AUX_HOST_GP_CNTRL_BIT_CLOCK_READY)
969 break;
970 }
971
972 if (i == 10000)
973 return -EIO; /* TODO: better error value */
974
975 /* set D0 standby bit */
976 read_register(priv->net_dev, IPW_REG_GP_CNTRL, &r);
977 write_register(priv->net_dev, IPW_REG_GP_CNTRL,
978 r | IPW_AUX_HOST_GP_CNTRL_BIT_HOST_ALLOWS_STANDBY);
979
980 return 0;
981 }
982
983 /*********************************************************************
984 Procedure : ipw2100_download_firmware
985 Purpose : Initiaze adapter after power on.
986 The sequence is:
987 1. assert s/w reset first!
988 2. awake clocks & wait for clock stabilization
989 3. hold ARC (don't ask me why...)
990 4. load Dino ucode and reset/clock init again
991 5. zero-out shared mem
992 6. download f/w
993 *******************************************************************/
994 static int ipw2100_download_firmware(struct ipw2100_priv *priv)
995 {
996 u32 address;
997 int err;
998
999 #ifndef CONFIG_PM
1000 /* Fetch the firmware and microcode */
1001 struct ipw2100_fw ipw2100_firmware;
1002 #endif
1003
1004 if (priv->fatal_error) {
1005 IPW_DEBUG_ERROR("%s: ipw2100_download_firmware called after "
1006 "fatal error %d. Interface must be brought down.\n",
1007 priv->net_dev->name, priv->fatal_error);
1008 return -EINVAL;
1009 }
1010 #ifdef CONFIG_PM
1011 if (!ipw2100_firmware.version) {
1012 err = ipw2100_get_firmware(priv, &ipw2100_firmware);
1013 if (err) {
1014 IPW_DEBUG_ERROR("%s: ipw2100_get_firmware failed: %d\n",
1015 priv->net_dev->name, err);
1016 priv->fatal_error = IPW2100_ERR_FW_LOAD;
1017 goto fail;
1018 }
1019 }
1020 #else
1021 err = ipw2100_get_firmware(priv, &ipw2100_firmware);
1022 if (err) {
1023 IPW_DEBUG_ERROR("%s: ipw2100_get_firmware failed: %d\n",
1024 priv->net_dev->name, err);
1025 priv->fatal_error = IPW2100_ERR_FW_LOAD;
1026 goto fail;
1027 }
1028 #endif
1029 priv->firmware_version = ipw2100_firmware.version;
1030
1031 /* s/w reset and clock stabilization */
1032 err = sw_reset_and_clock(priv);
1033 if (err) {
1034 IPW_DEBUG_ERROR("%s: sw_reset_and_clock failed: %d\n",
1035 priv->net_dev->name, err);
1036 goto fail;
1037 }
1038
1039 err = ipw2100_verify(priv);
1040 if (err) {
1041 IPW_DEBUG_ERROR("%s: ipw2100_verify failed: %d\n",
1042 priv->net_dev->name, err);
1043 goto fail;
1044 }
1045
1046 /* Hold ARC */
1047 write_nic_dword(priv->net_dev,
1048 IPW_INTERNAL_REGISTER_HALT_AND_RESET, 0x80000000);
1049
1050 /* allow ARC to run */
1051 write_register(priv->net_dev, IPW_REG_RESET_REG, 0);
1052
1053 /* load microcode */
1054 err = ipw2100_ucode_download(priv, &ipw2100_firmware);
1055 if (err) {
1056 printk(KERN_ERR DRV_NAME ": %s: Error loading microcode: %d\n",
1057 priv->net_dev->name, err);
1058 goto fail;
1059 }
1060
1061 /* release ARC */
1062 write_nic_dword(priv->net_dev,
1063 IPW_INTERNAL_REGISTER_HALT_AND_RESET, 0x00000000);
1064
1065 /* s/w reset and clock stabilization (again!!!) */
1066 err = sw_reset_and_clock(priv);
1067 if (err) {
1068 printk(KERN_ERR DRV_NAME
1069 ": %s: sw_reset_and_clock failed: %d\n",
1070 priv->net_dev->name, err);
1071 goto fail;
1072 }
1073
1074 /* load f/w */
1075 err = ipw2100_fw_download(priv, &ipw2100_firmware);
1076 if (err) {
1077 IPW_DEBUG_ERROR("%s: Error loading firmware: %d\n",
1078 priv->net_dev->name, err);
1079 goto fail;
1080 }
1081 #ifndef CONFIG_PM
1082 /*
1083 * When the .resume method of the driver is called, the other
1084 * part of the system, i.e. the ide driver could still stay in
1085 * the suspend stage. This prevents us from loading the firmware
1086 * from the disk. --YZ
1087 */
1088
1089 /* free any storage allocated for firmware image */
1090 ipw2100_release_firmware(priv, &ipw2100_firmware);
1091 #endif
1092
1093 /* zero out Domain 1 area indirectly (Si requirement) */
1094 for (address = IPW_HOST_FW_SHARED_AREA0;
1095 address < IPW_HOST_FW_SHARED_AREA0_END; address += 4)
1096 write_nic_dword(priv->net_dev, address, 0);
1097 for (address = IPW_HOST_FW_SHARED_AREA1;
1098 address < IPW_HOST_FW_SHARED_AREA1_END; address += 4)
1099 write_nic_dword(priv->net_dev, address, 0);
1100 for (address = IPW_HOST_FW_SHARED_AREA2;
1101 address < IPW_HOST_FW_SHARED_AREA2_END; address += 4)
1102 write_nic_dword(priv->net_dev, address, 0);
1103 for (address = IPW_HOST_FW_SHARED_AREA3;
1104 address < IPW_HOST_FW_SHARED_AREA3_END; address += 4)
1105 write_nic_dword(priv->net_dev, address, 0);
1106 for (address = IPW_HOST_FW_INTERRUPT_AREA;
1107 address < IPW_HOST_FW_INTERRUPT_AREA_END; address += 4)
1108 write_nic_dword(priv->net_dev, address, 0);
1109
1110 return 0;
1111
1112 fail:
1113 ipw2100_release_firmware(priv, &ipw2100_firmware);
1114 return err;
1115 }
1116
1117 static inline void ipw2100_enable_interrupts(struct ipw2100_priv *priv)
1118 {
1119 if (priv->status & STATUS_INT_ENABLED)
1120 return;
1121 priv->status |= STATUS_INT_ENABLED;
1122 write_register(priv->net_dev, IPW_REG_INTA_MASK, IPW_INTERRUPT_MASK);
1123 }
1124
1125 static inline void ipw2100_disable_interrupts(struct ipw2100_priv *priv)
1126 {
1127 if (!(priv->status & STATUS_INT_ENABLED))
1128 return;
1129 priv->status &= ~STATUS_INT_ENABLED;
1130 write_register(priv->net_dev, IPW_REG_INTA_MASK, 0x0);
1131 }
1132
1133 static void ipw2100_initialize_ordinals(struct ipw2100_priv *priv)
1134 {
1135 struct ipw2100_ordinals *ord = &priv->ordinals;
1136
1137 IPW_DEBUG_INFO("enter\n");
1138
1139 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_ORDINALS_TABLE_1,
1140 &ord->table1_addr);
1141
1142 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_ORDINALS_TABLE_2,
1143 &ord->table2_addr);
1144
1145 read_nic_dword(priv->net_dev, ord->table1_addr, &ord->table1_size);
1146 read_nic_dword(priv->net_dev, ord->table2_addr, &ord->table2_size);
1147
1148 ord->table2_size &= 0x0000FFFF;
1149
1150 IPW_DEBUG_INFO("table 1 size: %d\n", ord->table1_size);
1151 IPW_DEBUG_INFO("table 2 size: %d\n", ord->table2_size);
1152 IPW_DEBUG_INFO("exit\n");
1153 }
1154
1155 static inline void ipw2100_hw_set_gpio(struct ipw2100_priv *priv)
1156 {
1157 u32 reg = 0;
1158 /*
1159 * Set GPIO 3 writable by FW; GPIO 1 writable
1160 * by driver and enable clock
1161 */
1162 reg = (IPW_BIT_GPIO_GPIO3_MASK | IPW_BIT_GPIO_GPIO1_ENABLE |
1163 IPW_BIT_GPIO_LED_OFF);
1164 write_register(priv->net_dev, IPW_REG_GPIO, reg);
1165 }
1166
1167 static int rf_kill_active(struct ipw2100_priv *priv)
1168 {
1169 #define MAX_RF_KILL_CHECKS 5
1170 #define RF_KILL_CHECK_DELAY 40
1171
1172 unsigned short value = 0;
1173 u32 reg = 0;
1174 int i;
1175
1176 if (!(priv->hw_features & HW_FEATURE_RFKILL)) {
1177 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, false);
1178 priv->status &= ~STATUS_RF_KILL_HW;
1179 return 0;
1180 }
1181
1182 for (i = 0; i < MAX_RF_KILL_CHECKS; i++) {
1183 udelay(RF_KILL_CHECK_DELAY);
1184 read_register(priv->net_dev, IPW_REG_GPIO, ®);
1185 value = (value << 1) | ((reg & IPW_BIT_GPIO_RF_KILL) ? 0 : 1);
1186 }
1187
1188 if (value == 0) {
1189 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true);
1190 priv->status |= STATUS_RF_KILL_HW;
1191 } else {
1192 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, false);
1193 priv->status &= ~STATUS_RF_KILL_HW;
1194 }
1195
1196 return (value == 0);
1197 }
1198
1199 static int ipw2100_get_hw_features(struct ipw2100_priv *priv)
1200 {
1201 u32 addr, len;
1202 u32 val;
1203
1204 /*
1205 * EEPROM_SRAM_DB_START_ADDRESS using ordinal in ordinal table 1
1206 */
1207 len = sizeof(addr);
1208 if (ipw2100_get_ordinal
1209 (priv, IPW_ORD_EEPROM_SRAM_DB_BLOCK_START_ADDRESS, &addr, &len)) {
1210 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1211 __LINE__);
1212 return -EIO;
1213 }
1214
1215 IPW_DEBUG_INFO("EEPROM address: %08X\n", addr);
1216
1217 /*
1218 * EEPROM version is the byte at offset 0xfd in firmware
1219 * We read 4 bytes, then shift out the byte we actually want */
1220 read_nic_dword(priv->net_dev, addr + 0xFC, &val);
1221 priv->eeprom_version = (val >> 24) & 0xFF;
1222 IPW_DEBUG_INFO("EEPROM version: %d\n", priv->eeprom_version);
1223
1224 /*
1225 * HW RF Kill enable is bit 0 in byte at offset 0x21 in firmware
1226 *
1227 * notice that the EEPROM bit is reverse polarity, i.e.
1228 * bit = 0 signifies HW RF kill switch is supported
1229 * bit = 1 signifies HW RF kill switch is NOT supported
1230 */
1231 read_nic_dword(priv->net_dev, addr + 0x20, &val);
1232 if (!((val >> 24) & 0x01))
1233 priv->hw_features |= HW_FEATURE_RFKILL;
1234
1235 IPW_DEBUG_INFO("HW RF Kill: %ssupported.\n",
1236 (priv->hw_features & HW_FEATURE_RFKILL) ? "" : "not ");
1237
1238 return 0;
1239 }
1240
1241 /*
1242 * Start firmware execution after power on and intialization
1243 * The sequence is:
1244 * 1. Release ARC
1245 * 2. Wait for f/w initialization completes;
1246 */
1247 static int ipw2100_start_adapter(struct ipw2100_priv *priv)
1248 {
1249 int i;
1250 u32 inta, inta_mask, gpio;
1251
1252 IPW_DEBUG_INFO("enter\n");
1253
1254 if (priv->status & STATUS_RUNNING)
1255 return 0;
1256
1257 /*
1258 * Initialize the hw - drive adapter to DO state by setting
1259 * init_done bit. Wait for clk_ready bit and Download
1260 * fw & dino ucode
1261 */
1262 if (ipw2100_download_firmware(priv)) {
1263 printk(KERN_ERR DRV_NAME
1264 ": %s: Failed to power on the adapter.\n",
1265 priv->net_dev->name);
1266 return -EIO;
1267 }
1268
1269 /* Clear the Tx, Rx and Msg queues and the r/w indexes
1270 * in the firmware RBD and TBD ring queue */
1271 ipw2100_queues_initialize(priv);
1272
1273 ipw2100_hw_set_gpio(priv);
1274
1275 /* TODO -- Look at disabling interrupts here to make sure none
1276 * get fired during FW initialization */
1277
1278 /* Release ARC - clear reset bit */
1279 write_register(priv->net_dev, IPW_REG_RESET_REG, 0);
1280
1281 /* wait for f/w intialization complete */
1282 IPW_DEBUG_FW("Waiting for f/w initialization to complete...\n");
1283 i = 5000;
1284 do {
1285 schedule_timeout_uninterruptible(msecs_to_jiffies(40));
1286 /* Todo... wait for sync command ... */
1287
1288 read_register(priv->net_dev, IPW_REG_INTA, &inta);
1289
1290 /* check "init done" bit */
1291 if (inta & IPW2100_INTA_FW_INIT_DONE) {
1292 /* reset "init done" bit */
1293 write_register(priv->net_dev, IPW_REG_INTA,
1294 IPW2100_INTA_FW_INIT_DONE);
1295 break;
1296 }
1297
1298 /* check error conditions : we check these after the firmware
1299 * check so that if there is an error, the interrupt handler
1300 * will see it and the adapter will be reset */
1301 if (inta &
1302 (IPW2100_INTA_FATAL_ERROR | IPW2100_INTA_PARITY_ERROR)) {
1303 /* clear error conditions */
1304 write_register(priv->net_dev, IPW_REG_INTA,
1305 IPW2100_INTA_FATAL_ERROR |
1306 IPW2100_INTA_PARITY_ERROR);
1307 }
1308 } while (--i);
1309
1310 /* Clear out any pending INTAs since we aren't supposed to have
1311 * interrupts enabled at this point... */
1312 read_register(priv->net_dev, IPW_REG_INTA, &inta);
1313 read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask);
1314 inta &= IPW_INTERRUPT_MASK;
1315 /* Clear out any pending interrupts */
1316 if (inta & inta_mask)
1317 write_register(priv->net_dev, IPW_REG_INTA, inta);
1318
1319 IPW_DEBUG_FW("f/w initialization complete: %s\n",
1320 i ? "SUCCESS" : "FAILED");
1321
1322 if (!i) {
1323 printk(KERN_WARNING DRV_NAME
1324 ": %s: Firmware did not initialize.\n",
1325 priv->net_dev->name);
1326 return -EIO;
1327 }
1328
1329 /* allow firmware to write to GPIO1 & GPIO3 */
1330 read_register(priv->net_dev, IPW_REG_GPIO, &gpio);
1331
1332 gpio |= (IPW_BIT_GPIO_GPIO1_MASK | IPW_BIT_GPIO_GPIO3_MASK);
1333
1334 write_register(priv->net_dev, IPW_REG_GPIO, gpio);
1335
1336 /* Ready to receive commands */
1337 priv->status |= STATUS_RUNNING;
1338
1339 /* The adapter has been reset; we are not associated */
1340 priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED);
1341
1342 IPW_DEBUG_INFO("exit\n");
1343
1344 return 0;
1345 }
1346
1347 static inline void ipw2100_reset_fatalerror(struct ipw2100_priv *priv)
1348 {
1349 if (!priv->fatal_error)
1350 return;
1351
1352 priv->fatal_errors[priv->fatal_index++] = priv->fatal_error;
1353 priv->fatal_index %= IPW2100_ERROR_QUEUE;
1354 priv->fatal_error = 0;
1355 }
1356
1357 /* NOTE: Our interrupt is disabled when this method is called */
1358 static int ipw2100_power_cycle_adapter(struct ipw2100_priv *priv)
1359 {
1360 u32 reg;
1361 int i;
1362
1363 IPW_DEBUG_INFO("Power cycling the hardware.\n");
1364
1365 ipw2100_hw_set_gpio(priv);
1366
1367 /* Step 1. Stop Master Assert */
1368 write_register(priv->net_dev, IPW_REG_RESET_REG,
1369 IPW_AUX_HOST_RESET_REG_STOP_MASTER);
1370
1371 /* Step 2. Wait for stop Master Assert
1372 * (not more than 50us, otherwise ret error */
1373 i = 5;
1374 do {
1375 udelay(IPW_WAIT_RESET_MASTER_ASSERT_COMPLETE_DELAY);
1376 read_register(priv->net_dev, IPW_REG_RESET_REG, ®);
1377
1378 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED)
1379 break;
1380 } while (--i);
1381
1382 priv->status &= ~STATUS_RESET_PENDING;
1383
1384 if (!i) {
1385 IPW_DEBUG_INFO
1386 ("exit - waited too long for master assert stop\n");
1387 return -EIO;
1388 }
1389
1390 write_register(priv->net_dev, IPW_REG_RESET_REG,
1391 IPW_AUX_HOST_RESET_REG_SW_RESET);
1392
1393 /* Reset any fatal_error conditions */
1394 ipw2100_reset_fatalerror(priv);
1395
1396 /* At this point, the adapter is now stopped and disabled */
1397 priv->status &= ~(STATUS_RUNNING | STATUS_ASSOCIATING |
1398 STATUS_ASSOCIATED | STATUS_ENABLED);
1399
1400 return 0;
1401 }
1402
1403 /*
1404 * Send the CARD_DISABLE_PHY_OFF command to the card to disable it
1405 *
1406 * After disabling, if the card was associated, a STATUS_ASSN_LOST will be sent.
1407 *
1408 * STATUS_CARD_DISABLE_NOTIFICATION will be sent regardless of
1409 * if STATUS_ASSN_LOST is sent.
1410 */
1411 static int ipw2100_hw_phy_off(struct ipw2100_priv *priv)
1412 {
1413
1414 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
1415
1416 struct host_command cmd = {
1417 .host_command = CARD_DISABLE_PHY_OFF,
1418 .host_command_sequence = 0,
1419 .host_command_length = 0,
1420 };
1421 int err, i;
1422 u32 val1, val2;
1423
1424 IPW_DEBUG_HC("CARD_DISABLE_PHY_OFF\n");
1425
1426 /* Turn off the radio */
1427 err = ipw2100_hw_send_command(priv, &cmd);
1428 if (err)
1429 return err;
1430
1431 for (i = 0; i < 2500; i++) {
1432 read_nic_dword(priv->net_dev, IPW2100_CONTROL_REG, &val1);
1433 read_nic_dword(priv->net_dev, IPW2100_COMMAND, &val2);
1434
1435 if ((val1 & IPW2100_CONTROL_PHY_OFF) &&
1436 (val2 & IPW2100_COMMAND_PHY_OFF))
1437 return 0;
1438
1439 schedule_timeout_uninterruptible(HW_PHY_OFF_LOOP_DELAY);
1440 }
1441
1442 return -EIO;
1443 }
1444
1445 static int ipw2100_enable_adapter(struct ipw2100_priv *priv)
1446 {
1447 struct host_command cmd = {
1448 .host_command = HOST_COMPLETE,
1449 .host_command_sequence = 0,
1450 .host_command_length = 0
1451 };
1452 int err = 0;
1453
1454 IPW_DEBUG_HC("HOST_COMPLETE\n");
1455
1456 if (priv->status & STATUS_ENABLED)
1457 return 0;
1458
1459 mutex_lock(&priv->adapter_mutex);
1460
1461 if (rf_kill_active(priv)) {
1462 IPW_DEBUG_HC("Command aborted due to RF kill active.\n");
1463 goto fail_up;
1464 }
1465
1466 err = ipw2100_hw_send_command(priv, &cmd);
1467 if (err) {
1468 IPW_DEBUG_INFO("Failed to send HOST_COMPLETE command\n");
1469 goto fail_up;
1470 }
1471
1472 err = ipw2100_wait_for_card_state(priv, IPW_HW_STATE_ENABLED);
1473 if (err) {
1474 IPW_DEBUG_INFO("%s: card not responding to init command.\n",
1475 priv->net_dev->name);
1476 goto fail_up;
1477 }
1478
1479 if (priv->stop_hang_check) {
1480 priv->stop_hang_check = 0;
1481 schedule_delayed_work(&priv->hang_check, HZ / 2);
1482 }
1483
1484 fail_up:
1485 mutex_unlock(&priv->adapter_mutex);
1486 return err;
1487 }
1488
1489 static int ipw2100_hw_stop_adapter(struct ipw2100_priv *priv)
1490 {
1491 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
1492
1493 struct host_command cmd = {
1494 .host_command = HOST_PRE_POWER_DOWN,
1495 .host_command_sequence = 0,
1496 .host_command_length = 0,
1497 };
1498 int err, i;
1499 u32 reg;
1500
1501 if (!(priv->status & STATUS_RUNNING))
1502 return 0;
1503
1504 priv->status |= STATUS_STOPPING;
1505
1506 /* We can only shut down the card if the firmware is operational. So,
1507 * if we haven't reset since a fatal_error, then we can not send the
1508 * shutdown commands. */
1509 if (!priv->fatal_error) {
1510 /* First, make sure the adapter is enabled so that the PHY_OFF
1511 * command can shut it down */
1512 ipw2100_enable_adapter(priv);
1513
1514 err = ipw2100_hw_phy_off(priv);
1515 if (err)
1516 printk(KERN_WARNING DRV_NAME
1517 ": Error disabling radio %d\n", err);
1518
1519 /*
1520 * If in D0-standby mode going directly to D3 may cause a
1521 * PCI bus violation. Therefore we must change out of the D0
1522 * state.
1523 *
1524 * Sending the PREPARE_FOR_POWER_DOWN will restrict the
1525 * hardware from going into standby mode and will transition
1526 * out of D0-standby if it is already in that state.
1527 *
1528 * STATUS_PREPARE_POWER_DOWN_COMPLETE will be sent by the
1529 * driver upon completion. Once received, the driver can
1530 * proceed to the D3 state.
1531 *
1532 * Prepare for power down command to fw. This command would
1533 * take HW out of D0-standby and prepare it for D3 state.
1534 *
1535 * Currently FW does not support event notification for this
1536 * event. Therefore, skip waiting for it. Just wait a fixed
1537 * 100ms
1538 */
1539 IPW_DEBUG_HC("HOST_PRE_POWER_DOWN\n");
1540
1541 err = ipw2100_hw_send_command(priv, &cmd);
1542 if (err)
1543 printk(KERN_WARNING DRV_NAME ": "
1544 "%s: Power down command failed: Error %d\n",
1545 priv->net_dev->name, err);
1546 else
1547 schedule_timeout_uninterruptible(HW_POWER_DOWN_DELAY);
1548 }
1549
1550 priv->status &= ~STATUS_ENABLED;
1551
1552 /*
1553 * Set GPIO 3 writable by FW; GPIO 1 writable
1554 * by driver and enable clock
1555 */
1556 ipw2100_hw_set_gpio(priv);
1557
1558 /*
1559 * Power down adapter. Sequence:
1560 * 1. Stop master assert (RESET_REG[9]=1)
1561 * 2. Wait for stop master (RESET_REG[8]==1)
1562 * 3. S/w reset assert (RESET_REG[7] = 1)
1563 */
1564
1565 /* Stop master assert */
1566 write_register(priv->net_dev, IPW_REG_RESET_REG,
1567 IPW_AUX_HOST_RESET_REG_STOP_MASTER);
1568
1569 /* wait stop master not more than 50 usec.
1570 * Otherwise return error. */
1571 for (i = 5; i > 0; i--) {
1572 udelay(10);
1573
1574 /* Check master stop bit */
1575 read_register(priv->net_dev, IPW_REG_RESET_REG, ®);
1576
1577 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED)
1578 break;
1579 }
1580
1581 if (i == 0)
1582 printk(KERN_WARNING DRV_NAME
1583 ": %s: Could now power down adapter.\n",
1584 priv->net_dev->name);
1585
1586 /* assert s/w reset */
1587 write_register(priv->net_dev, IPW_REG_RESET_REG,
1588 IPW_AUX_HOST_RESET_REG_SW_RESET);
1589
1590 priv->status &= ~(STATUS_RUNNING | STATUS_STOPPING);
1591
1592 return 0;
1593 }
1594
1595 static int ipw2100_disable_adapter(struct ipw2100_priv *priv)
1596 {
1597 struct host_command cmd = {
1598 .host_command = CARD_DISABLE,
1599 .host_command_sequence = 0,
1600 .host_command_length = 0
1601 };
1602 int err = 0;
1603
1604 IPW_DEBUG_HC("CARD_DISABLE\n");
1605
1606 if (!(priv->status & STATUS_ENABLED))
1607 return 0;
1608
1609 /* Make sure we clear the associated state */
1610 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1611
1612 if (!priv->stop_hang_check) {
1613 priv->stop_hang_check = 1;
1614 cancel_delayed_work(&priv->hang_check);
1615 }
1616
1617 mutex_lock(&priv->adapter_mutex);
1618
1619 err = ipw2100_hw_send_command(priv, &cmd);
1620 if (err) {
1621 printk(KERN_WARNING DRV_NAME
1622 ": exit - failed to send CARD_DISABLE command\n");
1623 goto fail_up;
1624 }
1625
1626 err = ipw2100_wait_for_card_state(priv, IPW_HW_STATE_DISABLED);
1627 if (err) {
1628 printk(KERN_WARNING DRV_NAME
1629 ": exit - card failed to change to DISABLED\n");
1630 goto fail_up;
1631 }
1632
1633 IPW_DEBUG_INFO("TODO: implement scan state machine\n");
1634
1635 fail_up:
1636 mutex_unlock(&priv->adapter_mutex);
1637 return err;
1638 }
1639
1640 static int ipw2100_set_scan_options(struct ipw2100_priv *priv)
1641 {
1642 struct host_command cmd = {
1643 .host_command = SET_SCAN_OPTIONS,
1644 .host_command_sequence = 0,
1645 .host_command_length = 8
1646 };
1647 int err;
1648
1649 IPW_DEBUG_INFO("enter\n");
1650
1651 IPW_DEBUG_SCAN("setting scan options\n");
1652
1653 cmd.host_command_parameters[0] = 0;
1654
1655 if (!(priv->config & CFG_ASSOCIATE))
1656 cmd.host_command_parameters[0] |= IPW_SCAN_NOASSOCIATE;
1657 if ((priv->ieee->sec.flags & SEC_ENABLED) && priv->ieee->sec.enabled)
1658 cmd.host_command_parameters[0] |= IPW_SCAN_MIXED_CELL;
1659 if (priv->config & CFG_PASSIVE_SCAN)
1660 cmd.host_command_parameters[0] |= IPW_SCAN_PASSIVE;
1661
1662 cmd.host_command_parameters[1] = priv->channel_mask;
1663
1664 err = ipw2100_hw_send_command(priv, &cmd);
1665
1666 IPW_DEBUG_HC("SET_SCAN_OPTIONS 0x%04X\n",
1667 cmd.host_command_parameters[0]);
1668
1669 return err;
1670 }
1671
1672 static int ipw2100_start_scan(struct ipw2100_priv *priv)
1673 {
1674 struct host_command cmd = {
1675 .host_command = BROADCAST_SCAN,
1676 .host_command_sequence = 0,
1677 .host_command_length = 4
1678 };
1679 int err;
1680
1681 IPW_DEBUG_HC("START_SCAN\n");
1682
1683 cmd.host_command_parameters[0] = 0;
1684
1685 /* No scanning if in monitor mode */
1686 if (priv->ieee->iw_mode == IW_MODE_MONITOR)
1687 return 1;
1688
1689 if (priv->status & STATUS_SCANNING) {
1690 IPW_DEBUG_SCAN("Scan requested while already in scan...\n");
1691 return 0;
1692 }
1693
1694 IPW_DEBUG_INFO("enter\n");
1695
1696 /* Not clearing here; doing so makes iwlist always return nothing...
1697 *
1698 * We should modify the table logic to use aging tables vs. clearing
1699 * the table on each scan start.
1700 */
1701 IPW_DEBUG_SCAN("starting scan\n");
1702
1703 priv->status |= STATUS_SCANNING;
1704 err = ipw2100_hw_send_command(priv, &cmd);
1705 if (err)
1706 priv->status &= ~STATUS_SCANNING;
1707
1708 IPW_DEBUG_INFO("exit\n");
1709
1710 return err;
1711 }
1712
1713 static const struct libipw_geo ipw_geos[] = {
1714 { /* Restricted */
1715 "---",
1716 .bg_channels = 14,
1717 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
1718 {2427, 4}, {2432, 5}, {2437, 6},
1719 {2442, 7}, {2447, 8}, {2452, 9},
1720 {2457, 10}, {2462, 11}, {2467, 12},
1721 {2472, 13}, {2484, 14}},
1722 },
1723 };
1724
1725 static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
1726 {
1727 unsigned long flags;
1728 int rc = 0;
1729 u32 lock;
1730 u32 ord_len = sizeof(lock);
1731
1732 /* Age scan list entries found before suspend */
1733 if (priv->suspend_time) {
1734 libipw_networks_age(priv->ieee, priv->suspend_time);
1735 priv->suspend_time = 0;
1736 }
1737
1738 /* Quiet if manually disabled. */
1739 if (priv->status & STATUS_RF_KILL_SW) {
1740 IPW_DEBUG_INFO("%s: Radio is disabled by Manual Disable "
1741 "switch\n", priv->net_dev->name);
1742 return 0;
1743 }
1744
1745 /* the ipw2100 hardware really doesn't want power management delays
1746 * longer than 175usec
1747 */
1748 pm_qos_update_request(&ipw2100_pm_qos_req, 175);
1749
1750 /* If the interrupt is enabled, turn it off... */
1751 spin_lock_irqsave(&priv->low_lock, flags);
1752 ipw2100_disable_interrupts(priv);
1753
1754 /* Reset any fatal_error conditions */
1755 ipw2100_reset_fatalerror(priv);
1756 spin_unlock_irqrestore(&priv->low_lock, flags);
1757
1758 if (priv->status & STATUS_POWERED ||
1759 (priv->status & STATUS_RESET_PENDING)) {
1760 /* Power cycle the card ... */
1761 if (ipw2100_power_cycle_adapter(priv)) {
1762 printk(KERN_WARNING DRV_NAME
1763 ": %s: Could not cycle adapter.\n",
1764 priv->net_dev->name);
1765 rc = 1;
1766 goto exit;
1767 }
1768 } else
1769 priv->status |= STATUS_POWERED;
1770
1771 /* Load the firmware, start the clocks, etc. */
1772 if (ipw2100_start_adapter(priv)) {
1773 printk(KERN_ERR DRV_NAME
1774 ": %s: Failed to start the firmware.\n",
1775 priv->net_dev->name);
1776 rc = 1;
1777 goto exit;
1778 }
1779
1780 ipw2100_initialize_ordinals(priv);
1781
1782 /* Determine capabilities of this particular HW configuration */
1783 if (ipw2100_get_hw_features(priv)) {
1784 printk(KERN_ERR DRV_NAME
1785 ": %s: Failed to determine HW features.\n",
1786 priv->net_dev->name);
1787 rc = 1;
1788 goto exit;
1789 }
1790
1791 /* Initialize the geo */
1792 libipw_set_geo(priv->ieee, &ipw_geos[0]);
1793 priv->ieee->freq_band = LIBIPW_24GHZ_BAND;
1794
1795 lock = LOCK_NONE;
1796 if (ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len)) {
1797 printk(KERN_ERR DRV_NAME
1798 ": %s: Failed to clear ordinal lock.\n",
1799 priv->net_dev->name);
1800 rc = 1;
1801 goto exit;
1802 }
1803
1804 priv->status &= ~STATUS_SCANNING;
1805
1806 if (rf_kill_active(priv)) {
1807 printk(KERN_INFO "%s: Radio is disabled by RF switch.\n",
1808 priv->net_dev->name);
1809
1810 if (priv->stop_rf_kill) {
1811 priv->stop_rf_kill = 0;
1812 schedule_delayed_work(&priv->rf_kill,
1813 round_jiffies_relative(HZ));
1814 }
1815
1816 deferred = 1;
1817 }
1818
1819 /* Turn on the interrupt so that commands can be processed */
1820 ipw2100_enable_interrupts(priv);
1821
1822 /* Send all of the commands that must be sent prior to
1823 * HOST_COMPLETE */
1824 if (ipw2100_adapter_setup(priv)) {
1825 printk(KERN_ERR DRV_NAME ": %s: Failed to start the card.\n",
1826 priv->net_dev->name);
1827 rc = 1;
1828 goto exit;
1829 }
1830
1831 if (!deferred) {
1832 /* Enable the adapter - sends HOST_COMPLETE */
1833 if (ipw2100_enable_adapter(priv)) {
1834 printk(KERN_ERR DRV_NAME ": "
1835 "%s: failed in call to enable adapter.\n",
1836 priv->net_dev->name);
1837 ipw2100_hw_stop_adapter(priv);
1838 rc = 1;
1839 goto exit;
1840 }
1841
1842 /* Start a scan . . . */
1843 ipw2100_set_scan_options(priv);
1844 ipw2100_start_scan(priv);
1845 }
1846
1847 exit:
1848 return rc;
1849 }
1850
1851 static void ipw2100_down(struct ipw2100_priv *priv)
1852 {
1853 unsigned long flags;
1854 union iwreq_data wrqu = {
1855 .ap_addr = {
1856 .sa_family = ARPHRD_ETHER}
1857 };
1858 int associated = priv->status & STATUS_ASSOCIATED;
1859
1860 /* Kill the RF switch timer */
1861 if (!priv->stop_rf_kill) {
1862 priv->stop_rf_kill = 1;
1863 cancel_delayed_work(&priv->rf_kill);
1864 }
1865
1866 /* Kill the firmware hang check timer */
1867 if (!priv->stop_hang_check) {
1868 priv->stop_hang_check = 1;
1869 cancel_delayed_work(&priv->hang_check);
1870 }
1871
1872 /* Kill any pending resets */
1873 if (priv->status & STATUS_RESET_PENDING)
1874 cancel_delayed_work(&priv->reset_work);
1875
1876 /* Make sure the interrupt is on so that FW commands will be
1877 * processed correctly */
1878 spin_lock_irqsave(&priv->low_lock, flags);
1879 ipw2100_enable_interrupts(priv);
1880 spin_unlock_irqrestore(&priv->low_lock, flags);
1881
1882 if (ipw2100_hw_stop_adapter(priv))
1883 printk(KERN_ERR DRV_NAME ": %s: Error stopping adapter.\n",
1884 priv->net_dev->name);
1885
1886 /* Do not disable the interrupt until _after_ we disable
1887 * the adaptor. Otherwise the CARD_DISABLE command will never
1888 * be ack'd by the firmware */
1889 spin_lock_irqsave(&priv->low_lock, flags);
1890 ipw2100_disable_interrupts(priv);
1891 spin_unlock_irqrestore(&priv->low_lock, flags);
1892
1893 pm_qos_update_request(&ipw2100_pm_qos_req, PM_QOS_DEFAULT_VALUE);
1894
1895 /* We have to signal any supplicant if we are disassociating */
1896 if (associated)
1897 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
1898
1899 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1900 netif_carrier_off(priv->net_dev);
1901 netif_stop_queue(priv->net_dev);
1902 }
1903
1904 static int ipw2100_wdev_init(struct net_device *dev)
1905 {
1906 struct ipw2100_priv *priv = libipw_priv(dev);
1907 const struct libipw_geo *geo = libipw_get_geo(priv->ieee);
1908 struct wireless_dev *wdev = &priv->ieee->wdev;
1909 int i;
1910
1911 memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN);
1912
1913 /* fill-out priv->ieee->bg_band */
1914 if (geo->bg_channels) {
1915 struct ieee80211_supported_band *bg_band = &priv->ieee->bg_band;
1916
1917 bg_band->band = IEEE80211_BAND_2GHZ;
1918 bg_band->n_channels = geo->bg_channels;
1919 bg_band->channels = kcalloc(geo->bg_channels,
1920 sizeof(struct ieee80211_channel),
1921 GFP_KERNEL);
1922 if (!bg_band->channels) {
1923 ipw2100_down(priv);
1924 return -ENOMEM;
1925 }
1926 /* translate geo->bg to bg_band.channels */
1927 for (i = 0; i < geo->bg_channels; i++) {
1928 bg_band->channels[i].band = IEEE80211_BAND_2GHZ;
1929 bg_band->channels[i].center_freq = geo->bg[i].freq;
1930 bg_band->channels[i].hw_value = geo->bg[i].channel;
1931 bg_band->channels[i].max_power = geo->bg[i].max_power;
1932 if (geo->bg[i].flags & LIBIPW_CH_PASSIVE_ONLY)
1933 bg_band->channels[i].flags |=
1934 IEEE80211_CHAN_NO_IR;
1935 if (geo->bg[i].flags & LIBIPW_CH_NO_IBSS)
1936 bg_band->channels[i].flags |=
1937 IEEE80211_CHAN_NO_IR;
1938 if (geo->bg[i].flags & LIBIPW_CH_RADAR_DETECT)
1939 bg_band->channels[i].flags |=
1940 IEEE80211_CHAN_RADAR;
1941 /* No equivalent for LIBIPW_CH_80211H_RULES,
1942 LIBIPW_CH_UNIFORM_SPREADING, or
1943 LIBIPW_CH_B_ONLY... */
1944 }
1945 /* point at bitrate info */
1946 bg_band->bitrates = ipw2100_bg_rates;
1947 bg_band->n_bitrates = RATE_COUNT;
1948
1949 wdev->wiphy->bands[IEEE80211_BAND_2GHZ] = bg_band;
1950 }
1951
1952 wdev->wiphy->cipher_suites = ipw_cipher_suites;
1953 wdev->wiphy->n_cipher_suites = ARRAY_SIZE(ipw_cipher_suites);
1954
1955 set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev);
1956 if (wiphy_register(wdev->wiphy))
1957 return -EIO;
1958 return 0;
1959 }
1960
1961 static void ipw2100_reset_adapter(struct work_struct *work)
1962 {
1963 struct ipw2100_priv *priv =
1964 container_of(work, struct ipw2100_priv, reset_work.work);
1965 unsigned long flags;
1966 union iwreq_data wrqu = {
1967 .ap_addr = {
1968 .sa_family = ARPHRD_ETHER}
1969 };
1970 int associated = priv->status & STATUS_ASSOCIATED;
1971
1972 spin_lock_irqsave(&priv->low_lock, flags);
1973 IPW_DEBUG_INFO(": %s: Restarting adapter.\n", priv->net_dev->name);
1974 priv->resets++;
1975 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1976 priv->status |= STATUS_SECURITY_UPDATED;
1977
1978 /* Force a power cycle even if interface hasn't been opened
1979 * yet */
1980 cancel_delayed_work(&priv->reset_work);
1981 priv->status |= STATUS_RESET_PENDING;
1982 spin_unlock_irqrestore(&priv->low_lock, flags);
1983
1984 mutex_lock(&priv->action_mutex);
1985 /* stop timed checks so that they don't interfere with reset */
1986 priv->stop_hang_check = 1;
1987 cancel_delayed_work(&priv->hang_check);
1988
1989 /* We have to signal any supplicant if we are disassociating */
1990 if (associated)
1991 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
1992
1993 ipw2100_up(priv, 0);
1994 mutex_unlock(&priv->action_mutex);
1995
1996 }
1997
1998 static void isr_indicate_associated(struct ipw2100_priv *priv, u32 status)
1999 {
2000
2001 #define MAC_ASSOCIATION_READ_DELAY (HZ)
2002 int ret;
2003 unsigned int len, essid_len;
2004 char essid[IW_ESSID_MAX_SIZE];
2005 u32 txrate;
2006 u32 chan;
2007 char *txratename;
2008 u8 bssid[ETH_ALEN];
2009 DECLARE_SSID_BUF(ssid);
2010
2011 /*
2012 * TBD: BSSID is usually 00:00:00:00:00:00 here and not
2013 * an actual MAC of the AP. Seems like FW sets this
2014 * address too late. Read it later and expose through
2015 * /proc or schedule a later task to query and update
2016 */
2017
2018 essid_len = IW_ESSID_MAX_SIZE;
2019 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_SSID,
2020 essid, &essid_len);
2021 if (ret) {
2022 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
2023 __LINE__);
2024 return;
2025 }
2026
2027 len = sizeof(u32);
2028 ret = ipw2100_get_ordinal(priv, IPW_ORD_CURRENT_TX_RATE, &txrate, &len);
2029 if (ret) {
2030 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
2031 __LINE__);
2032 return;
2033 }
2034
2035 len = sizeof(u32);
2036 ret = ipw2100_get_ordinal(priv, IPW_ORD_OUR_FREQ, &chan, &len);
2037 if (ret) {
2038 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
2039 __LINE__);
2040 return;
2041 }
2042 len = ETH_ALEN;
2043 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID, bssid,
2044 &len);
2045 if (ret) {
2046 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
2047 __LINE__);
2048 return;
2049 }
2050 memcpy(priv->ieee->bssid, bssid, ETH_ALEN);
2051
2052 switch (txrate) {
2053 case TX_RATE_1_MBIT:
2054 txratename = "1Mbps";
2055 break;
2056 case TX_RATE_2_MBIT:
2057 txratename = "2Mbsp";
2058 break;
2059 case TX_RATE_5_5_MBIT:
2060 txratename = "5.5Mbps";
2061 break;
2062 case TX_RATE_11_MBIT:
2063 txratename = "11Mbps";
2064 break;
2065 default:
2066 IPW_DEBUG_INFO("Unknown rate: %d\n", txrate);
2067 txratename = "unknown rate";
2068 break;
2069 }
2070
2071 IPW_DEBUG_INFO("%s: Associated with '%s' at %s, channel %d (BSSID=%pM)\n",
2072 priv->net_dev->name, print_ssid(ssid, essid, essid_len),
2073 txratename, chan, bssid);
2074
2075 /* now we copy read ssid into dev */
2076 if (!(priv->config & CFG_STATIC_ESSID)) {
2077 priv->essid_len = min((u8) essid_len, (u8) IW_ESSID_MAX_SIZE);
2078 memcpy(priv->essid, essid, priv->essid_len);
2079 }
2080 priv->channel = chan;
2081 memcpy(priv->bssid, bssid, ETH_ALEN);
2082
2083 priv->status |= STATUS_ASSOCIATING;
2084 priv->connect_start = get_seconds();
2085
2086 schedule_delayed_work(&priv->wx_event_work, HZ / 10);
2087 }
2088
2089 static int ipw2100_set_essid(struct ipw2100_priv *priv, char *essid,
2090 int length, int batch_mode)
2091 {
2092 int ssid_len = min(length, IW_ESSID_MAX_SIZE);
2093 struct host_command cmd = {
2094 .host_command = SSID,
2095 .host_command_sequence = 0,
2096 .host_command_length = ssid_len
2097 };
2098 int err;
2099 DECLARE_SSID_BUF(ssid);
2100
2101 IPW_DEBUG_HC("SSID: '%s'\n", print_ssid(ssid, essid, ssid_len));
2102
2103 if (ssid_len)
2104 memcpy(cmd.host_command_parameters, essid, ssid_len);
2105
2106 if (!batch_mode) {
2107 err = ipw2100_disable_adapter(priv);
2108 if (err)
2109 return err;
2110 }
2111
2112 /* Bug in FW currently doesn't honor bit 0 in SET_SCAN_OPTIONS to
2113 * disable auto association -- so we cheat by setting a bogus SSID */
2114 if (!ssid_len && !(priv->config & CFG_ASSOCIATE)) {
2115 int i;
2116 u8 *bogus = (u8 *) cmd.host_command_parameters;
2117 for (i = 0; i < IW_ESSID_MAX_SIZE; i++)
2118 bogus[i] = 0x18 + i;
2119 cmd.host_command_length = IW_ESSID_MAX_SIZE;
2120 }
2121
2122 /* NOTE: We always send the SSID command even if the provided ESSID is
2123 * the same as what we currently think is set. */
2124
2125 err = ipw2100_hw_send_command(priv, &cmd);
2126 if (!err) {
2127 memset(priv->essid + ssid_len, 0, IW_ESSID_MAX_SIZE - ssid_len);
2128 memcpy(priv->essid, essid, ssid_len);
2129 priv->essid_len = ssid_len;
2130 }
2131
2132 if (!batch_mode) {
2133 if (ipw2100_enable_adapter(priv))
2134 err = -EIO;
2135 }
2136
2137 return err;
2138 }
2139
2140 static void isr_indicate_association_lost(struct ipw2100_priv *priv, u32 status)
2141 {
2142 DECLARE_SSID_BUF(ssid);
2143
2144 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE | IPW_DL_ASSOC,
2145 "disassociated: '%s' %pM\n",
2146 print_ssid(ssid, priv->essid, priv->essid_len),
2147 priv->bssid);
2148
2149 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
2150
2151 if (priv->status & STATUS_STOPPING) {
2152 IPW_DEBUG_INFO("Card is stopping itself, discard ASSN_LOST.\n");
2153 return;
2154 }
2155
2156 memset(priv->bssid, 0, ETH_ALEN);
2157 memset(priv->ieee->bssid, 0, ETH_ALEN);
2158
2159 netif_carrier_off(priv->net_dev);
2160 netif_stop_queue(priv->net_dev);
2161
2162 if (!(priv->status & STATUS_RUNNING))
2163 return;
2164
2165 if (priv->status & STATUS_SECURITY_UPDATED)
2166 schedule_delayed_work(&priv->security_work, 0);
2167
2168 schedule_delayed_work(&priv->wx_event_work, 0);
2169 }
2170
2171 static void isr_indicate_rf_kill(struct ipw2100_priv *priv, u32 status)
2172 {
2173 IPW_DEBUG_INFO("%s: RF Kill state changed to radio OFF.\n",
2174 priv->net_dev->name);
2175
2176 /* RF_KILL is now enabled (else we wouldn't be here) */
2177 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true);
2178 priv->status |= STATUS_RF_KILL_HW;
2179
2180 /* Make sure the RF Kill check timer is running */
2181 priv->stop_rf_kill = 0;
2182 mod_delayed_work(system_wq, &priv->rf_kill, round_jiffies_relative(HZ));
2183 }
2184
2185 static void ipw2100_scan_event(struct work_struct *work)
2186 {
2187 struct ipw2100_priv *priv = container_of(work, struct ipw2100_priv,
2188 scan_event.work);
2189 union iwreq_data wrqu;
2190
2191 wrqu.data.length = 0;
2192 wrqu.data.flags = 0;
2193 wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL);
2194 }
2195
2196 static void isr_scan_complete(struct ipw2100_priv *priv, u32 status)
2197 {
2198 IPW_DEBUG_SCAN("scan complete\n");
2199 /* Age the scan results... */
2200 priv->ieee->scans++;
2201 priv->status &= ~STATUS_SCANNING;
2202
2203 /* Only userspace-requested scan completion events go out immediately */
2204 if (!priv->user_requested_scan) {
2205 schedule_delayed_work(&priv->scan_event,
2206 round_jiffies_relative(msecs_to_jiffies(4000)));
2207 } else {
2208 priv->user_requested_scan = 0;
2209 mod_delayed_work(system_wq, &priv->scan_event, 0);
2210 }
2211 }
2212
2213 #ifdef CONFIG_IPW2100_DEBUG
2214 #define IPW2100_HANDLER(v, f) { v, f, # v }
2215 struct ipw2100_status_indicator {
2216 int status;
2217 void (*cb) (struct ipw2100_priv * priv, u32 status);
2218 char *name;
2219 };
2220 #else
2221 #define IPW2100_HANDLER(v, f) { v, f }
2222 struct ipw2100_status_indicator {
2223 int status;
2224 void (*cb) (struct ipw2100_priv * priv, u32 status);
2225 };
2226 #endif /* CONFIG_IPW2100_DEBUG */
2227
2228 static void isr_indicate_scanning(struct ipw2100_priv *priv, u32 status)
2229 {
2230 IPW_DEBUG_SCAN("Scanning...\n");
2231 priv->status |= STATUS_SCANNING;
2232 }
2233
2234 static const struct ipw2100_status_indicator status_handlers[] = {
2235 IPW2100_HANDLER(IPW_STATE_INITIALIZED, NULL),
2236 IPW2100_HANDLER(IPW_STATE_COUNTRY_FOUND, NULL),
2237 IPW2100_HANDLER(IPW_STATE_ASSOCIATED, isr_indicate_associated),
2238 IPW2100_HANDLER(IPW_STATE_ASSN_LOST, isr_indicate_association_lost),
2239 IPW2100_HANDLER(IPW_STATE_ASSN_CHANGED, NULL),
2240 IPW2100_HANDLER(IPW_STATE_SCAN_COMPLETE, isr_scan_complete),
2241 IPW2100_HANDLER(IPW_STATE_ENTERED_PSP, NULL),
2242 IPW2100_HANDLER(IPW_STATE_LEFT_PSP, NULL),
2243 IPW2100_HANDLER(IPW_STATE_RF_KILL, isr_indicate_rf_kill),
2244 IPW2100_HANDLER(IPW_STATE_DISABLED, NULL),
2245 IPW2100_HANDLER(IPW_STATE_POWER_DOWN, NULL),
2246 IPW2100_HANDLER(IPW_STATE_SCANNING, isr_indicate_scanning),
2247 IPW2100_HANDLER(-1, NULL)
2248 };
2249
2250 static void isr_status_change(struct ipw2100_priv *priv, int status)
2251 {
2252 int i;
2253
2254 if (status == IPW_STATE_SCANNING &&
2255 priv->status & STATUS_ASSOCIATED &&
2256 !(priv->status & STATUS_SCANNING)) {
2257 IPW_DEBUG_INFO("Scan detected while associated, with "
2258 "no scan request. Restarting firmware.\n");
2259
2260 /* Wake up any sleeping jobs */
2261 schedule_reset(priv);
2262 }
2263
2264 for (i = 0; status_handlers[i].status != -1; i++) {
2265 if (status == status_handlers[i].status) {
2266 IPW_DEBUG_NOTIF("Status change: %s\n",
2267 status_handlers[i].name);
2268 if (status_handlers[i].cb)
2269 status_handlers[i].cb(priv, status);
2270 priv->wstats.status = status;
2271 return;
2272 }
2273 }
2274
2275 IPW_DEBUG_NOTIF("unknown status received: %04x\n", status);
2276 }
2277
2278 static void isr_rx_complete_command(struct ipw2100_priv *priv,
2279 struct ipw2100_cmd_header *cmd)
2280 {
2281 #ifdef CONFIG_IPW2100_DEBUG
2282 if (cmd->host_command_reg < ARRAY_SIZE(command_types)) {
2283 IPW_DEBUG_HC("Command completed '%s (%d)'\n",
2284 command_types[cmd->host_command_reg],
2285 cmd->host_command_reg);
2286 }
2287 #endif
2288 if (cmd->host_command_reg == HOST_COMPLETE)
2289 priv->status |= STATUS_ENABLED;
2290
2291 if (cmd->host_command_reg == CARD_DISABLE)
2292 priv->status &= ~STATUS_ENABLED;
2293
2294 priv->status &= ~STATUS_CMD_ACTIVE;
2295
2296 wake_up_interruptible(&priv->wait_command_queue);
2297 }
2298
2299 #ifdef CONFIG_IPW2100_DEBUG
2300 static const char *frame_types[] = {
2301 "COMMAND_STATUS_VAL",
2302 "STATUS_CHANGE_VAL",
2303 "P80211_DATA_VAL",
2304 "P8023_DATA_VAL",
2305 "HOST_NOTIFICATION_VAL"
2306 };
2307 #endif
2308
2309 static int ipw2100_alloc_skb(struct ipw2100_priv *priv,
2310 struct ipw2100_rx_packet *packet)
2311 {
2312 packet->skb = dev_alloc_skb(sizeof(struct ipw2100_rx));
2313 if (!packet->skb)
2314 return -ENOMEM;
2315
2316 packet->rxp = (struct ipw2100_rx *)packet->skb->data;
2317 packet->dma_addr = pci_map_single(priv->pci_dev, packet->skb->data,
2318 sizeof(struct ipw2100_rx),
2319 PCI_DMA_FROMDEVICE);
2320 /* NOTE: pci_map_single does not return an error code, and 0 is a valid
2321 * dma_addr */
2322
2323 return 0;
2324 }
2325
2326 #define SEARCH_ERROR 0xffffffff
2327 #define SEARCH_FAIL 0xfffffffe
2328 #define SEARCH_SUCCESS 0xfffffff0
2329 #define SEARCH_DISCARD 0
2330 #define SEARCH_SNAPSHOT 1
2331
2332 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
2333 static void ipw2100_snapshot_free(struct ipw2100_priv *priv)
2334 {
2335 int i;
2336 if (!priv->snapshot[0])
2337 return;
2338 for (i = 0; i < 0x30; i++)
2339 kfree(priv->snapshot[i]);
2340 priv->snapshot[0] = NULL;
2341 }
2342
2343 #ifdef IPW2100_DEBUG_C3
2344 static int ipw2100_snapshot_alloc(struct ipw2100_priv *priv)
2345 {
2346 int i;
2347 if (priv->snapshot[0])
2348 return 1;
2349 for (i = 0; i < 0x30; i++) {
2350 priv->snapshot[i] = kmalloc(0x1000, GFP_ATOMIC);
2351 if (!priv->snapshot[i]) {
2352 IPW_DEBUG_INFO("%s: Error allocating snapshot "
2353 "buffer %d\n", priv->net_dev->name, i);
2354 while (i > 0)
2355 kfree(priv->snapshot[--i]);
2356 priv->snapshot[0] = NULL;
2357 return 0;
2358 }
2359 }
2360
2361 return 1;
2362 }
2363
2364 static u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 * in_buf,
2365 size_t len, int mode)
2366 {
2367 u32 i, j;
2368 u32 tmp;
2369 u8 *s, *d;
2370 u32 ret;
2371
2372 s = in_buf;
2373 if (mode == SEARCH_SNAPSHOT) {
2374 if (!ipw2100_snapshot_alloc(priv))
2375 mode = SEARCH_DISCARD;
2376 }
2377
2378 for (ret = SEARCH_FAIL, i = 0; i < 0x30000; i += 4) {
2379 read_nic_dword(priv->net_dev, i, &tmp);
2380 if (mode == SEARCH_SNAPSHOT)
2381 *(u32 *) SNAPSHOT_ADDR(i) = tmp;
2382 if (ret == SEARCH_FAIL) {
2383 d = (u8 *) & tmp;
2384 for (j = 0; j < 4; j++) {
2385 if (*s != *d) {
2386 s = in_buf;
2387 continue;
2388 }
2389
2390 s++;
2391 d++;
2392
2393 if ((s - in_buf) == len)
2394 ret = (i + j) - len + 1;
2395 }
2396 } else if (mode == SEARCH_DISCARD)
2397 return ret;
2398 }
2399
2400 return ret;
2401 }
2402 #endif
2403
2404 /*
2405 *
2406 * 0) Disconnect the SKB from the firmware (just unmap)
2407 * 1) Pack the ETH header into the SKB
2408 * 2) Pass the SKB to the network stack
2409 *
2410 * When packet is provided by the firmware, it contains the following:
2411 *
2412 * . libipw_hdr
2413 * . libipw_snap_hdr
2414 *
2415 * The size of the constructed ethernet
2416 *
2417 */
2418 #ifdef IPW2100_RX_DEBUG
2419 static u8 packet_data[IPW_RX_NIC_BUFFER_LENGTH];
2420 #endif
2421
2422 static void ipw2100_corruption_detected(struct ipw2100_priv *priv, int i)
2423 {
2424 #ifdef IPW2100_DEBUG_C3
2425 struct ipw2100_status *status = &priv->status_queue.drv[i];
2426 u32 match, reg;
2427 int j;
2428 #endif
2429
2430 IPW_DEBUG_INFO(": PCI latency error detected at 0x%04zX.\n",
2431 i * sizeof(struct ipw2100_status));
2432
2433 #ifdef IPW2100_DEBUG_C3
2434 /* Halt the firmware so we can get a good image */
2435 write_register(priv->net_dev, IPW_REG_RESET_REG,
2436 IPW_AUX_HOST_RESET_REG_STOP_MASTER);
2437 j = 5;
2438 do {
2439 udelay(IPW_WAIT_RESET_MASTER_ASSERT_COMPLETE_DELAY);
2440 read_register(priv->net_dev, IPW_REG_RESET_REG, ®);
2441
2442 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED)
2443 break;
2444 } while (j--);
2445
2446 match = ipw2100_match_buf(priv, (u8 *) status,
2447 sizeof(struct ipw2100_status),
2448 SEARCH_SNAPSHOT);
2449 if (match < SEARCH_SUCCESS)
2450 IPW_DEBUG_INFO("%s: DMA status match in Firmware at "
2451 "offset 0x%06X, length %d:\n",
2452 priv->net_dev->name, match,
2453 sizeof(struct ipw2100_status));
2454 else
2455 IPW_DEBUG_INFO("%s: No DMA status match in "
2456 "Firmware.\n", priv->net_dev->name);
2457
2458 printk_buf((u8 *) priv->status_queue.drv,
2459 sizeof(struct ipw2100_status) * RX_QUEUE_LENGTH);
2460 #endif
2461
2462 priv->fatal_error = IPW2100_ERR_C3_CORRUPTION;
2463 priv->net_dev->stats.rx_errors++;
2464 schedule_reset(priv);
2465 }
2466
2467 static void isr_rx(struct ipw2100_priv *priv, int i,
2468 struct libipw_rx_stats *stats)
2469 {
2470 struct net_device *dev = priv->net_dev;
2471 struct ipw2100_status *status = &priv->status_queue.drv[i];
2472 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i];
2473
2474 IPW_DEBUG_RX("Handler...\n");
2475
2476 if (unlikely(status->frame_size > skb_tailroom(packet->skb))) {
2477 IPW_DEBUG_INFO("%s: frame_size (%u) > skb_tailroom (%u)!"
2478 " Dropping.\n",
2479 dev->name,
2480 status->frame_size, skb_tailroom(packet->skb));
2481 dev->stats.rx_errors++;
2482 return;
2483 }
2484
2485 if (unlikely(!netif_running(dev))) {
2486 dev->stats.rx_errors++;
2487 priv->wstats.discard.misc++;
2488 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
2489 return;
2490 }
2491
2492 if (unlikely(priv->ieee->iw_mode != IW_MODE_MONITOR &&
2493 !(priv->status & STATUS_ASSOCIATED))) {
2494 IPW_DEBUG_DROP("Dropping packet while not associated.\n");
2495 priv->wstats.discard.misc++;
2496 return;
2497 }
2498
2499 pci_unmap_single(priv->pci_dev,
2500 packet->dma_addr,
2501 sizeof(struct ipw2100_rx), PCI_DMA_FROMDEVICE);
2502
2503 skb_put(packet->skb, status->frame_size);
2504
2505 #ifdef IPW2100_RX_DEBUG
2506 /* Make a copy of the frame so we can dump it to the logs if
2507 * libipw_rx fails */
2508 skb_copy_from_linear_data(packet->skb, packet_data,
2509 min_t(u32, status->frame_size,
2510 IPW_RX_NIC_BUFFER_LENGTH));
2511 #endif
2512
2513 if (!libipw_rx(priv->ieee, packet->skb, stats)) {
2514 #ifdef IPW2100_RX_DEBUG
2515 IPW_DEBUG_DROP("%s: Non consumed packet:\n",
2516 dev->name);
2517 printk_buf(IPW_DL_DROP, packet_data, status->frame_size);
2518 #endif
2519 dev->stats.rx_errors++;
2520
2521 /* libipw_rx failed, so it didn't free the SKB */
2522 dev_kfree_skb_any(packet->skb);
2523 packet->skb = NULL;
2524 }
2525
2526 /* We need to allocate a new SKB and attach it to the RDB. */
2527 if (unlikely(ipw2100_alloc_skb(priv, packet))) {
2528 printk(KERN_WARNING DRV_NAME ": "
2529 "%s: Unable to allocate SKB onto RBD ring - disabling "
2530 "adapter.\n", dev->name);
2531 /* TODO: schedule adapter shutdown */
2532 IPW_DEBUG_INFO("TODO: Shutdown adapter...\n");
2533 }
2534
2535 /* Update the RDB entry */
2536 priv->rx_queue.drv[i].host_addr = packet->dma_addr;
2537 }
2538
2539 #ifdef CONFIG_IPW2100_MONITOR
2540
2541 static void isr_rx_monitor(struct ipw2100_priv *priv, int i,
2542 struct libipw_rx_stats *stats)
2543 {
2544 struct net_device *dev = priv->net_dev;
2545 struct ipw2100_status *status = &priv->status_queue.drv[i];
2546 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i];
2547
2548 /* Magic struct that slots into the radiotap header -- no reason
2549 * to build this manually element by element, we can write it much
2550 * more efficiently than we can parse it. ORDER MATTERS HERE */
2551 struct ipw_rt_hdr {
2552 struct ieee80211_radiotap_header rt_hdr;
2553 s8 rt_dbmsignal; /* signal in dbM, kluged to signed */
2554 } *ipw_rt;
2555
2556 IPW_DEBUG_RX("Handler...\n");
2557
2558 if (unlikely(status->frame_size > skb_tailroom(packet->skb) -
2559 sizeof(struct ipw_rt_hdr))) {
2560 IPW_DEBUG_INFO("%s: frame_size (%u) > skb_tailroom (%u)!"
2561 " Dropping.\n",
2562 dev->name,
2563 status->frame_size,
2564 skb_tailroom(packet->skb));
2565 dev->stats.rx_errors++;
2566 return;
2567 }
2568
2569 if (unlikely(!netif_running(dev))) {
2570 dev->stats.rx_errors++;
2571 priv->wstats.discard.misc++;
2572 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
2573 return;
2574 }
2575
2576 if (unlikely(priv->config & CFG_CRC_CHECK &&
2577 status->flags & IPW_STATUS_FLAG_CRC_ERROR)) {
2578 IPW_DEBUG_RX("CRC error in packet. Dropping.\n");
2579 dev->stats.rx_errors++;
2580 return;
2581 }
2582
2583 pci_unmap_single(priv->pci_dev, packet->dma_addr,
2584 sizeof(struct ipw2100_rx), PCI_DMA_FROMDEVICE);
2585 memmove(packet->skb->data + sizeof(struct ipw_rt_hdr),
2586 packet->skb->data, status->frame_size);
2587
2588 ipw_rt = (struct ipw_rt_hdr *) packet->skb->data;
2589
2590 ipw_rt->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION;
2591 ipw_rt->rt_hdr.it_pad = 0; /* always good to zero */
2592 ipw_rt->rt_hdr.it_len = cpu_to_le16(sizeof(struct ipw_rt_hdr)); /* total hdr+data */
2593
2594 ipw_rt->rt_hdr.it_present = cpu_to_le32(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL);
2595
2596 ipw_rt->rt_dbmsignal = status->rssi + IPW2100_RSSI_TO_DBM;
2597
2598 skb_put(packet->skb, status->frame_size + sizeof(struct ipw_rt_hdr));
2599
2600 if (!libipw_rx(priv->ieee, packet->skb, stats)) {
2601 dev->stats.rx_errors++;
2602
2603 /* libipw_rx failed, so it didn't free the SKB */
2604 dev_kfree_skb_any(packet->skb);
2605 packet->skb = NULL;
2606 }
2607
2608 /* We need to allocate a new SKB and attach it to the RDB. */
2609 if (unlikely(ipw2100_alloc_skb(priv, packet))) {
2610 IPW_DEBUG_WARNING(
2611 "%s: Unable to allocate SKB onto RBD ring - disabling "
2612 "adapter.\n", dev->name);
2613 /* TODO: schedule adapter shutdown */
2614 IPW_DEBUG_INFO("TODO: Shutdown adapter...\n");
2615 }
2616
2617 /* Update the RDB entry */
2618 priv->rx_queue.drv[i].host_addr = packet->dma_addr;
2619 }
2620
2621 #endif
2622
2623 static int ipw2100_corruption_check(struct ipw2100_priv *priv, int i)
2624 {
2625 struct ipw2100_status *status = &priv->status_queue.drv[i];
2626 struct ipw2100_rx *u = priv->rx_buffers[i].rxp;
2627 u16 frame_type = status->status_fields & STATUS_TYPE_MASK;
2628
2629 switch (frame_type) {
2630 case COMMAND_STATUS_VAL:
2631 return (status->frame_size != sizeof(u->rx_data.command));
2632 case STATUS_CHANGE_VAL:
2633 return (status->frame_size != sizeof(u->rx_data.status));
2634 case HOST_NOTIFICATION_VAL:
2635 return (status->frame_size < sizeof(u->rx_data.notification));
2636 case P80211_DATA_VAL:
2637 case P8023_DATA_VAL:
2638 #ifdef CONFIG_IPW2100_MONITOR
2639 return 0;
2640 #else
2641 switch (WLAN_FC_GET_TYPE(le16_to_cpu(u->rx_data.header.frame_ctl))) {
2642 case IEEE80211_FTYPE_MGMT:
2643 case IEEE80211_FTYPE_CTL:
2644 return 0;
2645 case IEEE80211_FTYPE_DATA:
2646 return (status->frame_size >
2647 IPW_MAX_802_11_PAYLOAD_LENGTH);
2648 }
2649 #endif
2650 }
2651
2652 return 1;
2653 }
2654
2655 /*
2656 * ipw2100 interrupts are disabled at this point, and the ISR
2657 * is the only code that calls this method. So, we do not need
2658 * to play with any locks.
2659 *
2660 * RX Queue works as follows:
2661 *
2662 * Read index - firmware places packet in entry identified by the
2663 * Read index and advances Read index. In this manner,
2664 * Read index will always point to the next packet to
2665 * be filled--but not yet valid.
2666 *
2667 * Write index - driver fills this entry with an unused RBD entry.
2668 * This entry has not filled by the firmware yet.
2669 *
2670 * In between the W and R indexes are the RBDs that have been received
2671 * but not yet processed.
2672 *
2673 * The process of handling packets will start at WRITE + 1 and advance
2674 * until it reaches the READ index.
2675 *
2676 * The WRITE index is cached in the variable 'priv->rx_queue.next'.
2677 *
2678 */
2679 static void __ipw2100_rx_process(struct ipw2100_priv *priv)
2680 {
2681 struct ipw2100_bd_queue *rxq = &priv->rx_queue;
2682 struct ipw2100_status_queue *sq = &priv->status_queue;
2683 struct ipw2100_rx_packet *packet;
2684 u16 frame_type;
2685 u32 r, w, i, s;
2686 struct ipw2100_rx *u;
2687 struct libipw_rx_stats stats = {
2688 .mac_time = jiffies,
2689 };
2690
2691 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_READ_INDEX, &r);
2692 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, &w);
2693
2694 if (r >= rxq->entries) {
2695 IPW_DEBUG_RX("exit - bad read index\n");
2696 return;
2697 }
2698
2699 i = (rxq->next + 1) % rxq->entries;
2700 s = i;
2701 while (i != r) {
2702 /* IPW_DEBUG_RX("r = %d : w = %d : processing = %d\n",
2703 r, rxq->next, i); */
2704
2705 packet = &priv->rx_buffers[i];
2706
2707 /* Sync the DMA for the RX buffer so CPU is sure to get
2708 * the correct values */
2709 pci_dma_sync_single_for_cpu(priv->pci_dev, packet->dma_addr,
2710 sizeof(struct ipw2100_rx),
2711 PCI_DMA_FROMDEVICE);
2712
2713 if (unlikely(ipw2100_corruption_check(priv, i))) {
2714 ipw2100_corruption_detected(priv, i);
2715 goto increment;
2716 }
2717
2718 u = packet->rxp;
2719 frame_type = sq->drv[i].status_fields & STATUS_TYPE_MASK;
2720 stats.rssi = sq->drv[i].rssi + IPW2100_RSSI_TO_DBM;
2721 stats.len = sq->drv[i].frame_size;
2722
2723 stats.mask = 0;
2724 if (stats.rssi != 0)
2725 stats.mask |= LIBIPW_STATMASK_RSSI;
2726 stats.freq = LIBIPW_24GHZ_BAND;
2727
2728 IPW_DEBUG_RX("%s: '%s' frame type received (%d).\n",
2729 priv->net_dev->name, frame_types[frame_type],
2730 stats.len);
2731
2732 switch (frame_type) {
2733 case COMMAND_STATUS_VAL:
2734 /* Reset Rx watchdog */
2735 isr_rx_complete_command(priv, &u->rx_data.command);
2736 break;
2737
2738 case STATUS_CHANGE_VAL:
2739 isr_status_change(priv, u->rx_data.status);
2740 break;
2741
2742 case P80211_DATA_VAL:
2743 case P8023_DATA_VAL:
2744 #ifdef CONFIG_IPW2100_MONITOR
2745 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
2746 isr_rx_monitor(priv, i, &stats);
2747 break;
2748 }
2749 #endif
2750 if (stats.len < sizeof(struct libipw_hdr_3addr))
2751 break;
2752 switch (WLAN_FC_GET_TYPE(le16_to_cpu(u->rx_data.header.frame_ctl))) {
2753 case IEEE80211_FTYPE_MGMT:
2754 libipw_rx_mgt(priv->ieee,
2755 &u->rx_data.header, &stats);
2756 break;
2757
2758 case IEEE80211_FTYPE_CTL:
2759 break;
2760
2761 case IEEE80211_FTYPE_DATA:
2762 isr_rx(priv, i, &stats);
2763 break;
2764
2765 }
2766 break;
2767 }
2768
2769 increment:
2770 /* clear status field associated with this RBD */
2771 rxq->drv[i].status.info.field = 0;
2772
2773 i = (i + 1) % rxq->entries;
2774 }
2775
2776 if (i != s) {
2777 /* backtrack one entry, wrapping to end if at 0 */
2778 rxq->next = (i ? i : rxq->entries) - 1;
2779
2780 write_register(priv->net_dev,
2781 IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, rxq->next);
2782 }
2783 }
2784
2785 /*
2786 * __ipw2100_tx_process
2787 *
2788 * This routine will determine whether the next packet on
2789 * the fw_pend_list has been processed by the firmware yet.
2790 *
2791 * If not, then it does nothing and returns.
2792 *
2793 * If so, then it removes the item from the fw_pend_list, frees
2794 * any associated storage, and places the item back on the
2795 * free list of its source (either msg_free_list or tx_free_list)
2796 *
2797 * TX Queue works as follows:
2798 *
2799 * Read index - points to the next TBD that the firmware will
2800 * process. The firmware will read the data, and once
2801 * done processing, it will advance the Read index.
2802 *
2803 * Write index - driver fills this entry with an constructed TBD
2804 * entry. The Write index is not advanced until the
2805 * packet has been configured.
2806 *
2807 * In between the W and R indexes are the TBDs that have NOT been
2808 * processed. Lagging behind the R index are packets that have
2809 * been processed but have not been freed by the driver.
2810 *
2811 * In order to free old storage, an internal index will be maintained
2812 * that points to the next packet to be freed. When all used
2813 * packets have been freed, the oldest index will be the same as the
2814 * firmware's read index.
2815 *
2816 * The OLDEST index is cached in the variable 'priv->tx_queue.oldest'
2817 *
2818 * Because the TBD structure can not contain arbitrary data, the
2819 * driver must keep an internal queue of cached allocations such that
2820 * it can put that data back into the tx_free_list and msg_free_list
2821 * for use by future command and data packets.
2822 *
2823 */
2824 static int __ipw2100_tx_process(struct ipw2100_priv *priv)
2825 {
2826 struct ipw2100_bd_queue *txq = &priv->tx_queue;
2827 struct ipw2100_bd *tbd;
2828 struct list_head *element;
2829 struct ipw2100_tx_packet *packet;
2830 int descriptors_used;
2831 int e, i;
2832 u32 r, w, frag_num = 0;
2833
2834 if (list_empty(&priv->fw_pend_list))
2835 return 0;
2836
2837 element = priv->fw_pend_list.next;
2838
2839 packet = list_entry(element, struct ipw2100_tx_packet, list);
2840 tbd = &txq->drv[packet->index];
2841
2842 /* Determine how many TBD entries must be finished... */
2843 switch (packet->type) {
2844 case COMMAND:
2845 /* COMMAND uses only one slot; don't advance */
2846 descriptors_used = 1;
2847 e = txq->oldest;
2848 break;
2849
2850 case DATA:
2851 /* DATA uses two slots; advance and loop position. */
2852 descriptors_used = tbd->num_fragments;
2853 frag_num = tbd->num_fragments - 1;
2854 e = txq->oldest + frag_num;
2855 e %= txq->entries;
2856 break;
2857
2858 default:
2859 printk(KERN_WARNING DRV_NAME ": %s: Bad fw_pend_list entry!\n",
2860 priv->net_dev->name);
2861 return 0;
2862 }
2863
2864 /* if the last TBD is not done by NIC yet, then packet is
2865 * not ready to be released.
2866 *
2867 */
2868 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_READ_INDEX,
2869 &r);
2870 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
2871 &w);
2872 if (w != txq->next)
2873 printk(KERN_WARNING DRV_NAME ": %s: write index mismatch\n",
2874 priv->net_dev->name);
2875
2876 /*
2877 * txq->next is the index of the last packet written txq->oldest is
2878 * the index of the r is the index of the next packet to be read by
2879 * firmware
2880 */
2881
2882 /*
2883 * Quick graphic to help you visualize the following
2884 * if / else statement
2885 *
2886 * ===>| s---->|===============
2887 * e>|
2888 * | a | b | c | d | e | f | g | h | i | j | k | l
2889 * r---->|
2890 * w
2891 *
2892 * w - updated by driver
2893 * r - updated by firmware
2894 * s - start of oldest BD entry (txq->oldest)
2895 * e - end of oldest BD entry
2896 *
2897 */
2898 if (!((r <= w && (e < r || e >= w)) || (e < r && e >= w))) {
2899 IPW_DEBUG_TX("exit - no processed packets ready to release.\n");
2900 return 0;
2901 }
2902
2903 list_del(element);
2904 DEC_STAT(&priv->fw_pend_stat);
2905
2906 #ifdef CONFIG_IPW2100_DEBUG
2907 {
2908 i = txq->oldest;
2909 IPW_DEBUG_TX("TX%d V=%p P=%04X T=%04X L=%d\n", i,
2910 &txq->drv[i],
2911 (u32) (txq->nic + i * sizeof(struct ipw2100_bd)),
2912 txq->drv[i].host_addr, txq->drv[i].buf_length);
2913
2914 if (packet->type == DATA) {
2915 i = (i + 1) % txq->entries;
2916
2917 IPW_DEBUG_TX("TX%d V=%p P=%04X T=%04X L=%d\n", i,
2918 &txq->drv[i],
2919 (u32) (txq->nic + i *
2920 sizeof(struct ipw2100_bd)),
2921 (u32) txq->drv[i].host_addr,
2922 txq->drv[i].buf_length);
2923 }
2924 }
2925 #endif
2926
2927 switch (packet->type) {
2928 case DATA:
2929 if (txq->drv[txq->oldest].status.info.fields.txType != 0)
2930 printk(KERN_WARNING DRV_NAME ": %s: Queue mismatch. "
2931 "Expecting DATA TBD but pulled "
2932 "something else: ids %d=%d.\n",
2933 priv->net_dev->name, txq->oldest, packet->index);
2934
2935 /* DATA packet; we have to unmap and free the SKB */
2936 for (i = 0; i < frag_num; i++) {
2937 tbd = &txq->drv[(packet->index + 1 + i) % txq->entries];
2938
2939 IPW_DEBUG_TX("TX%d P=%08x L=%d\n",
2940 (packet->index + 1 + i) % txq->entries,
2941 tbd->host_addr, tbd->buf_length);
2942
2943 pci_unmap_single(priv->pci_dev,
2944 tbd->host_addr,
2945 tbd->buf_length, PCI_DMA_TODEVICE);
2946 }
2947
2948 libipw_txb_free(packet->info.d_struct.txb);
2949 packet->info.d_struct.txb = NULL;
2950
2951 list_add_tail(element, &priv->tx_free_list);
2952 INC_STAT(&priv->tx_free_stat);
2953
2954 /* We have a free slot in the Tx queue, so wake up the
2955 * transmit layer if it is stopped. */
2956 if (priv->status & STATUS_ASSOCIATED)
2957 netif_wake_queue(priv->net_dev);
2958
2959 /* A packet was processed by the hardware, so update the
2960 * watchdog */
2961 priv->net_dev->trans_start = jiffies;
2962
2963 break;
2964
2965 case COMMAND:
2966 if (txq->drv[txq->oldest].status.info.fields.txType != 1)
2967 printk(KERN_WARNING DRV_NAME ": %s: Queue mismatch. "
2968 "Expecting COMMAND TBD but pulled "
2969 "something else: ids %d=%d.\n",
2970 priv->net_dev->name, txq->oldest, packet->index);
2971
2972 #ifdef CONFIG_IPW2100_DEBUG
2973 if (packet->info.c_struct.cmd->host_command_reg <
2974 ARRAY_SIZE(command_types))
2975 IPW_DEBUG_TX("Command '%s (%d)' processed: %d.\n",
2976 command_types[packet->info.c_struct.cmd->
2977 host_command_reg],
2978 packet->info.c_struct.cmd->
2979 host_command_reg,
2980 packet->info.c_struct.cmd->cmd_status_reg);
2981 #endif
2982
2983 list_add_tail(element, &priv->msg_free_list);
2984 INC_STAT(&priv->msg_free_stat);
2985 break;
2986 }
2987
2988 /* advance oldest used TBD pointer to start of next entry */
2989 txq->oldest = (e + 1) % txq->entries;
2990 /* increase available TBDs number */
2991 txq->available += descriptors_used;
2992 SET_STAT(&priv->txq_stat, txq->available);
2993
2994 IPW_DEBUG_TX("packet latency (send to process) %ld jiffies\n",
2995 jiffies - packet->jiffy_start);
2996
2997 return (!list_empty(&priv->fw_pend_list));
2998 }
2999
3000 static inline void __ipw2100_tx_complete(struct ipw2100_priv *priv)
3001 {
3002 int i = 0;
3003
3004 while (__ipw2100_tx_process(priv) && i < 200)
3005 i++;
3006
3007 if (i == 200) {
3008 printk(KERN_WARNING DRV_NAME ": "
3009 "%s: Driver is running slow (%d iters).\n",
3010 priv->net_dev->name, i);
3011 }
3012 }
3013
3014 static void ipw2100_tx_send_commands(struct ipw2100_priv *priv)
3015 {
3016 struct list_head *element;
3017 struct ipw2100_tx_packet *packet;
3018 struct ipw2100_bd_queue *txq = &priv->tx_queue;
3019 struct ipw2100_bd *tbd;
3020 int next = txq->next;
3021
3022 while (!list_empty(&priv->msg_pend_list)) {
3023 /* if there isn't enough space in TBD queue, then
3024 * don't stuff a new one in.
3025 * NOTE: 3 are needed as a command will take one,
3026 * and there is a minimum of 2 that must be
3027 * maintained between the r and w indexes
3028 */
3029 if (txq->available <= 3) {
3030 IPW_DEBUG_TX("no room in tx_queue\n");
3031 break;
3032 }
3033
3034 element = priv->msg_pend_list.next;
3035 list_del(element);
3036 DEC_STAT(&priv->msg_pend_stat);
3037
3038 packet = list_entry(element, struct ipw2100_tx_packet, list);
3039
3040 IPW_DEBUG_TX("using TBD at virt=%p, phys=%04X\n",
3041 &txq->drv[txq->next],
3042 (u32) (txq->nic + txq->next *
3043 sizeof(struct ipw2100_bd)));
3044
3045 packet->index = txq->next;
3046
3047 tbd = &txq->drv[txq->next];
3048
3049 /* initialize TBD */
3050 tbd->host_addr = packet->info.c_struct.cmd_phys;
3051 tbd->buf_length = sizeof(struct ipw2100_cmd_header);
3052 /* not marking number of fragments causes problems
3053 * with f/w debug version */
3054 tbd->num_fragments = 1;
3055 tbd->status.info.field =
3056 IPW_BD_STATUS_TX_FRAME_COMMAND |
3057 IPW_BD_STATUS_TX_INTERRUPT_ENABLE;
3058
3059 /* update TBD queue counters */
3060 txq->next++;
3061 txq->next %= txq->entries;
3062 txq->available--;
3063 DEC_STAT(&priv->txq_stat);
3064
3065 list_add_tail(element, &priv->fw_pend_list);
3066 INC_STAT(&priv->fw_pend_stat);
3067 }
3068
3069 if (txq->next != next) {
3070 /* kick off the DMA by notifying firmware the
3071 * write index has moved; make sure TBD stores are sync'd */
3072 wmb();
3073 write_register(priv->net_dev,
3074 IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
3075 txq->next);
3076 }
3077 }
3078
3079 /*
3080 * ipw2100_tx_send_data
3081 *
3082 */
3083 static void ipw2100_tx_send_data(struct ipw2100_priv *priv)
3084 {
3085 struct list_head *element;
3086 struct ipw2100_tx_packet *packet;
3087 struct ipw2100_bd_queue *txq = &priv->tx_queue;
3088 struct ipw2100_bd *tbd;
3089 int next = txq->next;
3090 int i = 0;
3091 struct ipw2100_data_header *ipw_hdr;
3092 struct libipw_hdr_3addr *hdr;
3093
3094 while (!list_empty(&priv->tx_pend_list)) {
3095 /* if there isn't enough space in TBD queue, then
3096 * don't stuff a new one in.
3097 * NOTE: 4 are needed as a data will take two,
3098 * and there is a minimum of 2 that must be
3099 * maintained between the r and w indexes
3100 */
3101 element = priv->tx_pend_list.next;
3102 packet = list_entry(element, struct ipw2100_tx_packet, list);
3103
3104 if (unlikely(1 + packet->info.d_struct.txb->nr_frags >
3105 IPW_MAX_BDS)) {
3106 /* TODO: Support merging buffers if more than
3107 * IPW_MAX_BDS are used */
3108 IPW_DEBUG_INFO("%s: Maximum BD threshold exceeded. "
3109 "Increase fragmentation level.\n",
3110 priv->net_dev->name);
3111 }
3112
3113 if (txq->available <= 3 + packet->info.d_struct.txb->nr_frags) {
3114 IPW_DEBUG_TX("no room in tx_queue\n");
3115 break;
3116 }
3117
3118 list_del(element);
3119 DEC_STAT(&priv->tx_pend_stat);
3120
3121 tbd = &txq->drv[txq->next];
3122
3123 packet->index = txq->next;
3124
3125 ipw_hdr = packet->info.d_struct.data;
3126 hdr = (struct libipw_hdr_3addr *)packet->info.d_struct.txb->
3127 fragments[0]->data;
3128
3129 if (priv->ieee->iw_mode == IW_MODE_INFRA) {
3130 /* To DS: Addr1 = BSSID, Addr2 = SA,
3131 Addr3 = DA */
3132 memcpy(ipw_hdr->src_addr, hdr->addr2, ETH_ALEN);
3133 memcpy(ipw_hdr->dst_addr, hdr->addr3, ETH_ALEN);
3134 } else if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
3135 /* not From/To DS: Addr1 = DA, Addr2 = SA,
3136 Addr3 = BSSID */
3137 memcpy(ipw_hdr->src_addr, hdr->addr2, ETH_ALEN);
3138 memcpy(ipw_hdr->dst_addr, hdr->addr1, ETH_ALEN);
3139 }
3140
3141 ipw_hdr->host_command_reg = SEND;
3142 ipw_hdr->host_command_reg1 = 0;
3143
3144 /* For now we only support host based encryption */
3145 ipw_hdr->needs_encryption = 0;
3146 ipw_hdr->encrypted = packet->info.d_struct.txb->encrypted;
3147 if (packet->info.d_struct.txb->nr_frags > 1)
3148 ipw_hdr->fragment_size =
3149 packet->info.d_struct.txb->frag_size -
3150 LIBIPW_3ADDR_LEN;
3151 else
3152 ipw_hdr->fragment_size = 0;
3153
3154 tbd->host_addr = packet->info.d_struct.data_phys;
3155 tbd->buf_length = sizeof(struct ipw2100_data_header);
3156 tbd->num_fragments = 1 + packet->info.d_struct.txb->nr_frags;
3157 tbd->status.info.field =
3158 IPW_BD_STATUS_TX_FRAME_802_3 |
3159 IPW_BD_STATUS_TX_FRAME_NOT_LAST_FRAGMENT;
3160 txq->next++;
3161 txq->next %= txq->entries;
3162
3163 IPW_DEBUG_TX("data header tbd TX%d P=%08x L=%d\n",
3164 packet->index, tbd->host_addr, tbd->buf_length);
3165 #ifdef CONFIG_IPW2100_DEBUG
3166 if (packet->info.d_struct.txb->nr_frags > 1)
3167 IPW_DEBUG_FRAG("fragment Tx: %d frames\n",
3168 packet->info.d_struct.txb->nr_frags);
3169 #endif
3170
3171 for (i = 0; i < packet->info.d_struct.txb->nr_frags; i++) {
3172 tbd = &txq->drv[txq->next];
3173 if (i == packet->info.d_struct.txb->nr_frags - 1)
3174 tbd->status.info.field =
3175 IPW_BD_STATUS_TX_FRAME_802_3 |
3176 IPW_BD_STATUS_TX_INTERRUPT_ENABLE;
3177 else
3178 tbd->status.info.field =
3179 IPW_BD_STATUS_TX_FRAME_802_3 |
3180 IPW_BD_STATUS_TX_FRAME_NOT_LAST_FRAGMENT;
3181
3182 tbd->buf_length = packet->info.d_struct.txb->
3183 fragments[i]->len - LIBIPW_3ADDR_LEN;
3184
3185 tbd->host_addr = pci_map_single(priv->pci_dev,
3186 packet->info.d_struct.
3187 txb->fragments[i]->
3188 data +
3189 LIBIPW_3ADDR_LEN,
3190 tbd->buf_length,
3191 PCI_DMA_TODEVICE);
3192
3193 IPW_DEBUG_TX("data frag tbd TX%d P=%08x L=%d\n",
3194 txq->next, tbd->host_addr,
3195 tbd->buf_length);
3196
3197 pci_dma_sync_single_for_device(priv->pci_dev,
3198 tbd->host_addr,
3199 tbd->buf_length,
3200 PCI_DMA_TODEVICE);
3201
3202 txq->next++;
3203 txq->next %= txq->entries;
3204 }
3205
3206 txq->available -= 1 + packet->info.d_struct.txb->nr_frags;
3207 SET_STAT(&priv->txq_stat, txq->available);
3208
3209 list_add_tail(element, &priv->fw_pend_list);
3210 INC_STAT(&priv->fw_pend_stat);
3211 }
3212
3213 if (txq->next != next) {
3214 /* kick off the DMA by notifying firmware the
3215 * write index has moved; make sure TBD stores are sync'd */
3216 write_register(priv->net_dev,
3217 IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
3218 txq->next);
3219 }
3220 }
3221
3222 static void ipw2100_irq_tasklet(struct ipw2100_priv *priv)
3223 {
3224 struct net_device *dev = priv->net_dev;
3225 unsigned long flags;
3226 u32 inta, tmp;
3227
3228 spin_lock_irqsave(&priv->low_lock, flags);
3229 ipw2100_disable_interrupts(priv);
3230
3231 read_register(dev, IPW_REG_INTA, &inta);
3232
3233 IPW_DEBUG_ISR("enter - INTA: 0x%08lX\n",
3234 (unsigned long)inta & IPW_INTERRUPT_MASK);
3235
3236 priv->in_isr++;
3237 priv->interrupts++;
3238
3239 /* We do not loop and keep polling for more interrupts as this
3240 * is frowned upon and doesn't play nicely with other potentially
3241 * chained IRQs */
3242 IPW_DEBUG_ISR("INTA: 0x%08lX\n",
3243 (unsigned long)inta & IPW_INTERRUPT_MASK);
3244
3245 if (inta & IPW2100_INTA_FATAL_ERROR) {
3246 printk(KERN_WARNING DRV_NAME
3247 ": Fatal interrupt. Scheduling firmware restart.\n");
3248 priv->inta_other++;
3249 write_register(dev, IPW_REG_INTA, IPW2100_INTA_FATAL_ERROR);
3250
3251 read_nic_dword(dev, IPW_NIC_FATAL_ERROR, &priv->fatal_error);
3252 IPW_DEBUG_INFO("%s: Fatal error value: 0x%08X\n",
3253 priv->net_dev->name, priv->fatal_error);
3254
3255 read_nic_dword(dev, IPW_ERROR_ADDR(priv->fatal_error), &tmp);
3256 IPW_DEBUG_INFO("%s: Fatal error address value: 0x%08X\n",
3257 priv->net_dev->name, tmp);
3258
3259 /* Wake up any sleeping jobs */
3260 schedule_reset(priv);
3261 }
3262
3263 if (inta & IPW2100_INTA_PARITY_ERROR) {
3264 printk(KERN_ERR DRV_NAME
3265 ": ***** PARITY ERROR INTERRUPT !!!!\n");
3266 priv->inta_other++;
3267 write_register(dev, IPW_REG_INTA, IPW2100_INTA_PARITY_ERROR);
3268 }
3269
3270 if (inta & IPW2100_INTA_RX_TRANSFER) {
3271 IPW_DEBUG_ISR("RX interrupt\n");
3272
3273 priv->rx_interrupts++;
3274
3275 write_register(dev, IPW_REG_INTA, IPW2100_INTA_RX_TRANSFER);
3276
3277 __ipw2100_rx_process(priv);
3278 __ipw2100_tx_complete(priv);
3279 }
3280
3281 if (inta & IPW2100_INTA_TX_TRANSFER) {
3282 IPW_DEBUG_ISR("TX interrupt\n");
3283
3284 priv->tx_interrupts++;
3285
3286 write_register(dev, IPW_REG_INTA, IPW2100_INTA_TX_TRANSFER);
3287
3288 __ipw2100_tx_complete(priv);
3289 ipw2100_tx_send_commands(priv);
3290 ipw2100_tx_send_data(priv);
3291 }
3292
3293 if (inta & IPW2100_INTA_TX_COMPLETE) {
3294 IPW_DEBUG_ISR("TX complete\n");
3295 priv->inta_other++;
3296 write_register(dev, IPW_REG_INTA, IPW2100_INTA_TX_COMPLETE);
3297
3298 __ipw2100_tx_complete(priv);
3299 }
3300
3301 if (inta & IPW2100_INTA_EVENT_INTERRUPT) {
3302 /* ipw2100_handle_event(dev); */
3303 priv->inta_other++;
3304 write_register(dev, IPW_REG_INTA, IPW2100_INTA_EVENT_INTERRUPT);
3305 }
3306
3307 if (inta & IPW2100_INTA_FW_INIT_DONE) {
3308 IPW_DEBUG_ISR("FW init done interrupt\n");
3309 priv->inta_other++;
3310
3311 read_register(dev, IPW_REG_INTA, &tmp);
3312 if (tmp & (IPW2100_INTA_FATAL_ERROR |
3313 IPW2100_INTA_PARITY_ERROR)) {
3314 write_register(dev, IPW_REG_INTA,
3315 IPW2100_INTA_FATAL_ERROR |
3316 IPW2100_INTA_PARITY_ERROR);
3317 }
3318
3319 write_register(dev, IPW_REG_INTA, IPW2100_INTA_FW_INIT_DONE);
3320 }
3321
3322 if (inta & IPW2100_INTA_STATUS_CHANGE) {
3323 IPW_DEBUG_ISR("Status change interrupt\n");
3324 priv->inta_other++;
3325 write_register(dev, IPW_REG_INTA, IPW2100_INTA_STATUS_CHANGE);
3326 }
3327
3328 if (inta & IPW2100_INTA_SLAVE_MODE_HOST_COMMAND_DONE) {
3329 IPW_DEBUG_ISR("slave host mode interrupt\n");
3330 priv->inta_other++;
3331 write_register(dev, IPW_REG_INTA,
3332 IPW2100_INTA_SLAVE_MODE_HOST_COMMAND_DONE);
3333 }
3334
3335 priv->in_isr--;
3336 ipw2100_enable_interrupts(priv);
3337
3338 spin_unlock_irqrestore(&priv->low_lock, flags);
3339
3340 IPW_DEBUG_ISR("exit\n");
3341 }
3342
3343 static irqreturn_t ipw2100_interrupt(int irq, void *data)
3344 {
3345 struct ipw2100_priv *priv = data;
3346 u32 inta, inta_mask;
3347
3348 if (!data)
3349 return IRQ_NONE;
3350
3351 spin_lock(&priv->low_lock);
3352
3353 /* We check to see if we should be ignoring interrupts before
3354 * we touch the hardware. During ucode load if we try and handle
3355 * an interrupt we can cause keyboard problems as well as cause
3356 * the ucode to fail to initialize */
3357 if (!(priv->status & STATUS_INT_ENABLED)) {
3358 /* Shared IRQ */
3359 goto none;
3360 }
3361
3362 read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask);
3363 read_register(priv->net_dev, IPW_REG_INTA, &inta);
3364
3365 if (inta == 0xFFFFFFFF) {
3366 /* Hardware disappeared */
3367 printk(KERN_WARNING DRV_NAME ": IRQ INTA == 0xFFFFFFFF\n");
3368 goto none;
3369 }
3370
3371 inta &= IPW_INTERRUPT_MASK;
3372
3373 if (!(inta & inta_mask)) {
3374 /* Shared interrupt */
3375 goto none;
3376 }
3377
3378 /* We disable the hardware interrupt here just to prevent unneeded
3379 * calls to be made. We disable this again within the actual
3380 * work tasklet, so if another part of the code re-enables the
3381 * interrupt, that is fine */
3382 ipw2100_disable_interrupts(priv);
3383
3384 tasklet_schedule(&priv->irq_tasklet);
3385 spin_unlock(&priv->low_lock);
3386
3387 return IRQ_HANDLED;
3388 none:
3389 spin_unlock(&priv->low_lock);
3390 return IRQ_NONE;
3391 }
3392
3393 static netdev_tx_t ipw2100_tx(struct libipw_txb *txb,
3394 struct net_device *dev, int pri)
3395 {
3396 struct ipw2100_priv *priv = libipw_priv(dev);
3397 struct list_head *element;
3398 struct ipw2100_tx_packet *packet;
3399 unsigned long flags;
3400
3401 spin_lock_irqsave(&priv->low_lock, flags);
3402
3403 if (!(priv->status & STATUS_ASSOCIATED)) {
3404 IPW_DEBUG_INFO("Can not transmit when not connected.\n");
3405 priv->net_dev->stats.tx_carrier_errors++;
3406 netif_stop_queue(dev);
3407 goto fail_unlock;
3408 }
3409
3410 if (list_empty(&priv->tx_free_list))
3411 goto fail_unlock;
3412
3413 element = priv->tx_free_list.next;
3414 packet = list_entry(element, struct ipw2100_tx_packet, list);
3415
3416 packet->info.d_struct.txb = txb;
3417
3418 IPW_DEBUG_TX("Sending fragment (%d bytes):\n", txb->fragments[0]->len);
3419 printk_buf(IPW_DL_TX, txb->fragments[0]->data, txb->fragments[0]->len);
3420
3421 packet->jiffy_start = jiffies;
3422
3423 list_del(element);
3424 DEC_STAT(&priv->tx_free_stat);
3425
3426 list_add_tail(element, &priv->tx_pend_list);
3427 INC_STAT(&priv->tx_pend_stat);
3428
3429 ipw2100_tx_send_data(priv);
3430
3431 spin_unlock_irqrestore(&priv->low_lock, flags);
3432 return NETDEV_TX_OK;
3433
3434 fail_unlock:
3435 netif_stop_queue(dev);
3436 spin_unlock_irqrestore(&priv->low_lock, flags);
3437 return NETDEV_TX_BUSY;
3438 }
3439
3440 static int ipw2100_msg_allocate(struct ipw2100_priv *priv)
3441 {
3442 int i, j, err = -EINVAL;
3443 void *v;
3444 dma_addr_t p;
3445
3446 priv->msg_buffers =
3447 kmalloc(IPW_COMMAND_POOL_SIZE * sizeof(struct ipw2100_tx_packet),
3448 GFP_KERNEL);
3449 if (!priv->msg_buffers)
3450 return -ENOMEM;
3451
3452 for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++) {
3453 v = pci_alloc_consistent(priv->pci_dev,
3454 sizeof(struct ipw2100_cmd_header), &p);
3455 if (!v) {
3456 printk(KERN_ERR DRV_NAME ": "
3457 "%s: PCI alloc failed for msg "
3458 "buffers.\n", priv->net_dev->name);
3459 err = -ENOMEM;
3460 break;
3461 }
3462
3463 memset(v, 0, sizeof(struct ipw2100_cmd_header));
3464
3465 priv->msg_buffers[i].type = COMMAND;
3466 priv->msg_buffers[i].info.c_struct.cmd =
3467 (struct ipw2100_cmd_header *)v;
3468 priv->msg_buffers[i].info.c_struct.cmd_phys = p;
3469 }
3470
3471 if (i == IPW_COMMAND_POOL_SIZE)
3472 return 0;
3473
3474 for (j = 0; j < i; j++) {
3475 pci_free_consistent(priv->pci_dev,
3476 sizeof(struct ipw2100_cmd_header),
3477 priv->msg_buffers[j].info.c_struct.cmd,
3478 priv->msg_buffers[j].info.c_struct.
3479 cmd_phys);
3480 }
3481
3482 kfree(priv->msg_buffers);
3483 priv->msg_buffers = NULL;
3484
3485 return err;
3486 }
3487
3488 static int ipw2100_msg_initialize(struct ipw2100_priv *priv)
3489 {
3490 int i;
3491
3492 INIT_LIST_HEAD(&priv->msg_free_list);
3493 INIT_LIST_HEAD(&priv->msg_pend_list);
3494
3495 for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++)
3496 list_add_tail(&priv->msg_buffers[i].list, &priv->msg_free_list);
3497 SET_STAT(&priv->msg_free_stat, i);
3498
3499 return 0;
3500 }
3501
3502 static void ipw2100_msg_free(struct ipw2100_priv *priv)
3503 {
3504 int i;
3505
3506 if (!priv->msg_buffers)
3507 return;
3508
3509 for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++) {
3510 pci_free_consistent(priv->pci_dev,
3511 sizeof(struct ipw2100_cmd_header),
3512 priv->msg_buffers[i].info.c_struct.cmd,
3513 priv->msg_buffers[i].info.c_struct.
3514 cmd_phys);
3515 }
3516
3517 kfree(priv->msg_buffers);
3518 priv->msg_buffers = NULL;
3519 }
3520
3521 static ssize_t show_pci(struct device *d, struct device_attribute *attr,
3522 char *buf)
3523 {
3524 struct pci_dev *pci_dev = container_of(d, struct pci_dev, dev);
3525 char *out = buf;
3526 int i, j;
3527 u32 val;
3528
3529 for (i = 0; i < 16; i++) {
3530 out += sprintf(out, "[%08X] ", i * 16);
3531 for (j = 0; j < 16; j += 4) {
3532 pci_read_config_dword(pci_dev, i * 16 + j, &val);
3533 out += sprintf(out, "%08X ", val);
3534 }
3535 out += sprintf(out, "\n");
3536 }
3537
3538 return out - buf;
3539 }
3540
3541 static DEVICE_ATTR(pci, S_IRUGO, show_pci, NULL);
3542
3543 static ssize_t show_cfg(struct device *d, struct device_attribute *attr,
3544 char *buf)
3545 {
3546 struct ipw2100_priv *p = dev_get_drvdata(d);
3547 return sprintf(buf, "0x%08x\n", (int)p->config);
3548 }
3549
3550 static DEVICE_ATTR(cfg, S_IRUGO, show_cfg, NULL);
3551
3552 static ssize_t show_status(struct device *d, struct device_attribute *attr,
3553 char *buf)
3554 {
3555 struct ipw2100_priv *p = dev_get_drvdata(d);
3556 return sprintf(buf, "0x%08x\n", (int)p->status);
3557 }
3558
3559 static DEVICE_ATTR(status, S_IRUGO, show_status, NULL);
3560
3561 static ssize_t show_capability(struct device *d, struct device_attribute *attr,
3562 char *buf)
3563 {
3564 struct ipw2100_priv *p = dev_get_drvdata(d);
3565 return sprintf(buf, "0x%08x\n", (int)p->capability);
3566 }
3567
3568 static DEVICE_ATTR(capability, S_IRUGO, show_capability, NULL);
3569
3570 #define IPW2100_REG(x) { IPW_ ##x, #x }
3571 static const struct {
3572 u32 addr;
3573 const char *name;
3574 } hw_data[] = {
3575 IPW2100_REG(REG_GP_CNTRL),
3576 IPW2100_REG(REG_GPIO),
3577 IPW2100_REG(REG_INTA),
3578 IPW2100_REG(REG_INTA_MASK), IPW2100_REG(REG_RESET_REG),};
3579 #define IPW2100_NIC(x, s) { x, #x, s }
3580 static const struct {
3581 u32 addr;
3582 const char *name;
3583 size_t size;
3584 } nic_data[] = {
3585 IPW2100_NIC(IPW2100_CONTROL_REG, 2),
3586 IPW2100_NIC(0x210014, 1), IPW2100_NIC(0x210000, 1),};
3587 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
3588 static const struct {
3589 u8 index;
3590 const char *name;
3591 const char *desc;
3592 } ord_data[] = {
3593 IPW2100_ORD(STAT_TX_HOST_REQUESTS, "requested Host Tx's (MSDU)"),
3594 IPW2100_ORD(STAT_TX_HOST_COMPLETE,
3595 "successful Host Tx's (MSDU)"),
3596 IPW2100_ORD(STAT_TX_DIR_DATA,
3597 "successful Directed Tx's (MSDU)"),
3598 IPW2100_ORD(STAT_TX_DIR_DATA1,
3599 "successful Directed Tx's (MSDU) @ 1MB"),
3600 IPW2100_ORD(STAT_TX_DIR_DATA2,
3601 "successful Directed Tx's (MSDU) @ 2MB"),
3602 IPW2100_ORD(STAT_TX_DIR_DATA5_5,
3603 "successful Directed Tx's (MSDU) @ 5_5MB"),
3604 IPW2100_ORD(STAT_TX_DIR_DATA11,
3605 "successful Directed Tx's (MSDU) @ 11MB"),
3606 IPW2100_ORD(STAT_TX_NODIR_DATA1,
3607 "successful Non_Directed Tx's (MSDU) @ 1MB"),
3608 IPW2100_ORD(STAT_TX_NODIR_DATA2,
3609 "successful Non_Directed Tx's (MSDU) @ 2MB"),
3610 IPW2100_ORD(STAT_TX_NODIR_DATA5_5,
3611 "successful Non_Directed Tx's (MSDU) @ 5.5MB"),
3612 IPW2100_ORD(STAT_TX_NODIR_DATA11,
3613 "successful Non_Directed Tx's (MSDU) @ 11MB"),
3614 IPW2100_ORD(STAT_NULL_DATA, "successful NULL data Tx's"),
3615 IPW2100_ORD(STAT_TX_RTS, "successful Tx RTS"),
3616 IPW2100_ORD(STAT_TX_CTS, "successful Tx CTS"),
3617 IPW2100_ORD(STAT_TX_ACK, "successful Tx ACK"),
3618 IPW2100_ORD(STAT_TX_ASSN, "successful Association Tx's"),
3619 IPW2100_ORD(STAT_TX_ASSN_RESP,
3620 "successful Association response Tx's"),
3621 IPW2100_ORD(STAT_TX_REASSN,
3622 "successful Reassociation Tx's"),
3623 IPW2100_ORD(STAT_TX_REASSN_RESP,
3624 "successful Reassociation response Tx's"),
3625 IPW2100_ORD(STAT_TX_PROBE,
3626 "probes successfully transmitted"),
3627 IPW2100_ORD(STAT_TX_PROBE_RESP,
3628 "probe responses successfully transmitted"),
3629 IPW2100_ORD(STAT_TX_BEACON, "tx beacon"),
3630 IPW2100_ORD(STAT_TX_ATIM, "Tx ATIM"),
3631 IPW2100_ORD(STAT_TX_DISASSN,
3632 "successful Disassociation TX"),
3633 IPW2100_ORD(STAT_TX_AUTH, "successful Authentication Tx"),
3634 IPW2100_ORD(STAT_TX_DEAUTH,
3635 "successful Deauthentication TX"),
3636 IPW2100_ORD(STAT_TX_TOTAL_BYTES,
3637 "Total successful Tx data bytes"),
3638 IPW2100_ORD(STAT_TX_RETRIES, "Tx retries"),
3639 IPW2100_ORD(STAT_TX_RETRY1, "Tx retries at 1MBPS"),
3640 IPW2100_ORD(STAT_TX_RETRY2, "Tx retries at 2MBPS"),
3641 IPW2100_ORD(STAT_TX_RETRY5_5, "Tx retries at 5.5MBPS"),
3642 IPW2100_ORD(STAT_TX_RETRY11, "Tx retries at 11MBPS"),
3643 IPW2100_ORD(STAT_TX_FAILURES, "Tx Failures"),
3644 IPW2100_ORD(STAT_TX_MAX_TRIES_IN_HOP,
3645 "times max tries in a hop failed"),
3646 IPW2100_ORD(STAT_TX_DISASSN_FAIL,
3647 "times disassociation failed"),
3648 IPW2100_ORD(STAT_TX_ERR_CTS, "missed/bad CTS frames"),
3649 IPW2100_ORD(STAT_TX_ERR_ACK, "tx err due to acks"),
3650 IPW2100_ORD(STAT_RX_HOST, "packets passed to host"),
3651 IPW2100_ORD(STAT_RX_DIR_DATA, "directed packets"),
3652 IPW2100_ORD(STAT_RX_DIR_DATA1, "directed packets at 1MB"),
3653 IPW2100_ORD(STAT_RX_DIR_DATA2, "directed packets at 2MB"),
3654 IPW2100_ORD(STAT_RX_DIR_DATA5_5,
3655 "directed packets at 5.5MB"),
3656 IPW2100_ORD(STAT_RX_DIR_DATA11, "directed packets at 11MB"),
3657 IPW2100_ORD(STAT_RX_NODIR_DATA, "nondirected packets"),
3658 IPW2100_ORD(STAT_RX_NODIR_DATA1,
3659 "nondirected packets at 1MB"),
3660 IPW2100_ORD(STAT_RX_NODIR_DATA2,
3661 "nondirected packets at 2MB"),
3662 IPW2100_ORD(STAT_RX_NODIR_DATA5_5,
3663 "nondirected packets at 5.5MB"),
3664 IPW2100_ORD(STAT_RX_NODIR_DATA11,
3665 "nondirected packets at 11MB"),
3666 IPW2100_ORD(STAT_RX_NULL_DATA, "null data rx's"),
3667 IPW2100_ORD(STAT_RX_RTS, "Rx RTS"), IPW2100_ORD(STAT_RX_CTS,
3668 "Rx CTS"),
3669 IPW2100_ORD(STAT_RX_ACK, "Rx ACK"),
3670 IPW2100_ORD(STAT_RX_CFEND, "Rx CF End"),
3671 IPW2100_ORD(STAT_RX_CFEND_ACK, "Rx CF End + CF Ack"),
3672 IPW2100_ORD(STAT_RX_ASSN, "Association Rx's"),
3673 IPW2100_ORD(STAT_RX_ASSN_RESP, "Association response Rx's"),
3674 IPW2100_ORD(STAT_RX_REASSN, "Reassociation Rx's"),
3675 IPW2100_ORD(STAT_RX_REASSN_RESP,
3676 "Reassociation response Rx's"),
3677 IPW2100_ORD(STAT_RX_PROBE, "probe Rx's"),
3678 IPW2100_ORD(STAT_RX_PROBE_RESP, "probe response Rx's"),
3679 IPW2100_ORD(STAT_RX_BEACON, "Rx beacon"),
3680 IPW2100_ORD(STAT_RX_ATIM, "Rx ATIM"),
3681 IPW2100_ORD(STAT_RX_DISASSN, "disassociation Rx"),
3682 IPW2100_ORD(STAT_RX_AUTH, "authentication Rx"),
3683 IPW2100_ORD(STAT_RX_DEAUTH, "deauthentication Rx"),
3684 IPW2100_ORD(STAT_RX_TOTAL_BYTES,
3685 "Total rx data bytes received"),
3686 IPW2100_ORD(STAT_RX_ERR_CRC, "packets with Rx CRC error"),
3687 IPW2100_ORD(STAT_RX_ERR_CRC1, "Rx CRC errors at 1MB"),
3688 IPW2100_ORD(STAT_RX_ERR_CRC2, "Rx CRC errors at 2MB"),
3689 IPW2100_ORD(STAT_RX_ERR_CRC5_5, "Rx CRC errors at 5.5MB"),
3690 IPW2100_ORD(STAT_RX_ERR_CRC11, "Rx CRC errors at 11MB"),
3691 IPW2100_ORD(STAT_RX_DUPLICATE1,
3692 "duplicate rx packets at 1MB"),
3693 IPW2100_ORD(STAT_RX_DUPLICATE2,
3694 "duplicate rx packets at 2MB"),
3695 IPW2100_ORD(STAT_RX_DUPLICATE5_5,
3696 "duplicate rx packets at 5.5MB"),
3697 IPW2100_ORD(STAT_RX_DUPLICATE11,
3698 "duplicate rx packets at 11MB"),
3699 IPW2100_ORD(STAT_RX_DUPLICATE, "duplicate rx packets"),
3700 IPW2100_ORD(PERS_DB_LOCK, "locking fw permanent db"),
3701 IPW2100_ORD(PERS_DB_SIZE, "size of fw permanent db"),
3702 IPW2100_ORD(PERS_DB_ADDR, "address of fw permanent db"),
3703 IPW2100_ORD(STAT_RX_INVALID_PROTOCOL,
3704 "rx frames with invalid protocol"),
3705 IPW2100_ORD(SYS_BOOT_TIME, "Boot time"),
3706 IPW2100_ORD(STAT_RX_NO_BUFFER,
3707 "rx frames rejected due to no buffer"),
3708 IPW2100_ORD(STAT_RX_MISSING_FRAG,
3709 "rx frames dropped due to missing fragment"),
3710 IPW2100_ORD(STAT_RX_ORPHAN_FRAG,
3711 "rx frames dropped due to non-sequential fragment"),
3712 IPW2100_ORD(STAT_RX_ORPHAN_FRAME,
3713 "rx frames dropped due to unmatched 1st frame"),
3714 IPW2100_ORD(STAT_RX_FRAG_AGEOUT,
3715 "rx frames dropped due to uncompleted frame"),
3716 IPW2100_ORD(STAT_RX_ICV_ERRORS,
3717 "ICV errors during decryption"),
3718 IPW2100_ORD(STAT_PSP_SUSPENSION, "times adapter suspended"),
3719 IPW2100_ORD(STAT_PSP_BCN_TIMEOUT, "beacon timeout"),
3720 IPW2100_ORD(STAT_PSP_POLL_TIMEOUT,
3721 "poll response timeouts"),
3722 IPW2100_ORD(STAT_PSP_NONDIR_TIMEOUT,
3723 "timeouts waiting for last {broad,multi}cast pkt"),
3724 IPW2100_ORD(STAT_PSP_RX_DTIMS, "PSP DTIMs received"),
3725 IPW2100_ORD(STAT_PSP_RX_TIMS, "PSP TIMs received"),
3726 IPW2100_ORD(STAT_PSP_STATION_ID, "PSP Station ID"),
3727 IPW2100_ORD(LAST_ASSN_TIME, "RTC time of last association"),
3728 IPW2100_ORD(STAT_PERCENT_MISSED_BCNS,
3729 "current calculation of % missed beacons"),
3730 IPW2100_ORD(STAT_PERCENT_RETRIES,
3731 "current calculation of % missed tx retries"),
3732 IPW2100_ORD(ASSOCIATED_AP_PTR,
3733 "0 if not associated, else pointer to AP table entry"),
3734 IPW2100_ORD(AVAILABLE_AP_CNT,
3735 "AP's decsribed in the AP table"),
3736 IPW2100_ORD(AP_LIST_PTR, "Ptr to list of available APs"),
3737 IPW2100_ORD(STAT_AP_ASSNS, "associations"),
3738 IPW2100_ORD(STAT_ASSN_FAIL, "association failures"),
3739 IPW2100_ORD(STAT_ASSN_RESP_FAIL,
3740 "failures due to response fail"),
3741 IPW2100_ORD(STAT_FULL_SCANS, "full scans"),
3742 IPW2100_ORD(CARD_DISABLED, "Card Disabled"),
3743 IPW2100_ORD(STAT_ROAM_INHIBIT,
3744 "times roaming was inhibited due to activity"),
3745 IPW2100_ORD(RSSI_AT_ASSN,
3746 "RSSI of associated AP at time of association"),
3747 IPW2100_ORD(STAT_ASSN_CAUSE1,
3748 "reassociation: no probe response or TX on hop"),
3749 IPW2100_ORD(STAT_ASSN_CAUSE2,
3750 "reassociation: poor tx/rx quality"),
3751 IPW2100_ORD(STAT_ASSN_CAUSE3,
3752 "reassociation: tx/rx quality (excessive AP load"),
3753 IPW2100_ORD(STAT_ASSN_CAUSE4,
3754 "reassociation: AP RSSI level"),
3755 IPW2100_ORD(STAT_ASSN_CAUSE5,
3756 "reassociations due to load leveling"),
3757 IPW2100_ORD(STAT_AUTH_FAIL, "times authentication failed"),
3758 IPW2100_ORD(STAT_AUTH_RESP_FAIL,
3759 "times authentication response failed"),
3760 IPW2100_ORD(STATION_TABLE_CNT,
3761 "entries in association table"),
3762 IPW2100_ORD(RSSI_AVG_CURR, "Current avg RSSI"),
3763 IPW2100_ORD(POWER_MGMT_MODE, "Power mode - 0=CAM, 1=PSP"),
3764 IPW2100_ORD(COUNTRY_CODE,
3765 "IEEE country code as recv'd from beacon"),
3766 IPW2100_ORD(COUNTRY_CHANNELS,
3767 "channels supported by country"),
3768 IPW2100_ORD(RESET_CNT, "adapter resets (warm)"),
3769 IPW2100_ORD(BEACON_INTERVAL, "Beacon interval"),
3770 IPW2100_ORD(ANTENNA_DIVERSITY,
3771 "TRUE if antenna diversity is disabled"),
3772 IPW2100_ORD(DTIM_PERIOD, "beacon intervals between DTIMs"),
3773 IPW2100_ORD(OUR_FREQ,
3774 "current radio freq lower digits - channel ID"),
3775 IPW2100_ORD(RTC_TIME, "current RTC time"),
3776 IPW2100_ORD(PORT_TYPE, "operating mode"),
3777 IPW2100_ORD(CURRENT_TX_RATE, "current tx rate"),
3778 IPW2100_ORD(SUPPORTED_RATES, "supported tx rates"),
3779 IPW2100_ORD(ATIM_WINDOW, "current ATIM Window"),
3780 IPW2100_ORD(BASIC_RATES, "basic tx rates"),
3781 IPW2100_ORD(NIC_HIGHEST_RATE, "NIC highest tx rate"),
3782 IPW2100_ORD(AP_HIGHEST_RATE, "AP highest tx rate"),
3783 IPW2100_ORD(CAPABILITIES,
3784 "Management frame capability field"),
3785 IPW2100_ORD(AUTH_TYPE, "Type of authentication"),
3786 IPW2100_ORD(RADIO_TYPE, "Adapter card platform type"),
3787 IPW2100_ORD(RTS_THRESHOLD,
3788 "Min packet length for RTS handshaking"),
3789 IPW2100_ORD(INT_MODE, "International mode"),
3790 IPW2100_ORD(FRAGMENTATION_THRESHOLD,
3791 "protocol frag threshold"),
3792 IPW2100_ORD(EEPROM_SRAM_DB_BLOCK_START_ADDRESS,
3793 "EEPROM offset in SRAM"),
3794 IPW2100_ORD(EEPROM_SRAM_DB_BLOCK_SIZE,
3795 "EEPROM size in SRAM"),
3796 IPW2100_ORD(EEPROM_SKU_CAPABILITY, "EEPROM SKU Capability"),
3797 IPW2100_ORD(EEPROM_IBSS_11B_CHANNELS,
3798 "EEPROM IBSS 11b channel set"),
3799 IPW2100_ORD(MAC_VERSION, "MAC Version"),
3800 IPW2100_ORD(MAC_REVISION, "MAC Revision"),
3801 IPW2100_ORD(RADIO_VERSION, "Radio Version"),
3802 IPW2100_ORD(NIC_MANF_DATE_TIME, "MANF Date/Time STAMP"),
3803 IPW2100_ORD(UCODE_VERSION, "Ucode Version"),};
3804
3805 static ssize_t show_registers(struct device *d, struct device_attribute *attr,
3806 char *buf)
3807 {
3808 int i;
3809 struct ipw2100_priv *priv = dev_get_drvdata(d);
3810 struct net_device *dev = priv->net_dev;
3811 char *out = buf;
3812 u32 val = 0;
3813
3814 out += sprintf(out, "%30s [Address ] : Hex\n", "Register");
3815
3816 for (i = 0; i < ARRAY_SIZE(hw_data); i++) {
3817 read_register(dev, hw_data[i].addr, &val);
3818 out += sprintf(out, "%30s [%08X] : %08X\n",
3819 hw_data[i].name, hw_data[i].addr, val);
3820 }
3821
3822 return out - buf;
3823 }
3824
3825 static DEVICE_ATTR(registers, S_IRUGO, show_registers, NULL);
3826
3827 static ssize_t show_hardware(struct device *d, struct device_attribute *attr,
3828 char *buf)
3829 {
3830 struct ipw2100_priv *priv = dev_get_drvdata(d);
3831 struct net_device *dev = priv->net_dev;
3832 char *out = buf;
3833 int i;
3834
3835 out += sprintf(out, "%30s [Address ] : Hex\n", "NIC entry");
3836
3837 for (i = 0; i < ARRAY_SIZE(nic_data); i++) {
3838 u8 tmp8;
3839 u16 tmp16;
3840 u32 tmp32;
3841
3842 switch (nic_data[i].size) {
3843 case 1:
3844 read_nic_byte(dev, nic_data[i].addr, &tmp8);
3845 out += sprintf(out, "%30s [%08X] : %02X\n",
3846 nic_data[i].name, nic_data[i].addr,
3847 tmp8);
3848 break;
3849 case 2:
3850 read_nic_word(dev, nic_data[i].addr, &tmp16);
3851 out += sprintf(out, "%30s [%08X] : %04X\n",
3852 nic_data[i].name, nic_data[i].addr,
3853 tmp16);
3854 break;
3855 case 4:
3856 read_nic_dword(dev, nic_data[i].addr, &tmp32);
3857 out += sprintf(out, "%30s [%08X] : %08X\n",
3858 nic_data[i].name, nic_data[i].addr,
3859 tmp32);
3860 break;
3861 }
3862 }
3863 return out - buf;
3864 }
3865
3866 static DEVICE_ATTR(hardware, S_IRUGO, show_hardware, NULL);
3867
3868 static ssize_t show_memory(struct device *d, struct device_attribute *attr,
3869 char *buf)
3870 {
3871 struct ipw2100_priv *priv = dev_get_drvdata(d);
3872 struct net_device *dev = priv->net_dev;
3873 static unsigned long loop = 0;
3874 int len = 0;
3875 u32 buffer[4];
3876 int i;
3877 char line[81];
3878
3879 if (loop >= 0x30000)
3880 loop = 0;
3881
3882 /* sysfs provides us PAGE_SIZE buffer */
3883 while (len < PAGE_SIZE - 128 && loop < 0x30000) {
3884
3885 if (priv->snapshot[0])
3886 for (i = 0; i < 4; i++)
3887 buffer[i] =
3888 *(u32 *) SNAPSHOT_ADDR(loop + i * 4);
3889 else
3890 for (i = 0; i < 4; i++)
3891 read_nic_dword(dev, loop + i * 4, &buffer[i]);
3892
3893 if (priv->dump_raw)
3894 len += sprintf(buf + len,
3895 "%c%c%c%c"
3896 "%c%c%c%c"
3897 "%c%c%c%c"
3898 "%c%c%c%c",
3899 ((u8 *) buffer)[0x0],
3900 ((u8 *) buffer)[0x1],
3901 ((u8 *) buffer)[0x2],
3902 ((u8 *) buffer)[0x3],
3903 ((u8 *) buffer)[0x4],
3904 ((u8 *) buffer)[0x5],
3905 ((u8 *) buffer)[0x6],
3906 ((u8 *) buffer)[0x7],
3907 ((u8 *) buffer)[0x8],
3908 ((u8 *) buffer)[0x9],
3909 ((u8 *) buffer)[0xa],
3910 ((u8 *) buffer)[0xb],
3911 ((u8 *) buffer)[0xc],
3912 ((u8 *) buffer)[0xd],
3913 ((u8 *) buffer)[0xe],
3914 ((u8 *) buffer)[0xf]);
3915 else
3916 len += sprintf(buf + len, "%s\n",
3917 snprint_line(line, sizeof(line),
3918 (u8 *) buffer, 16, loop));
3919 loop += 16;
3920 }
3921
3922 return len;
3923 }
3924
3925 static ssize_t store_memory(struct device *d, struct device_attribute *attr,
3926 const char *buf, size_t count)
3927 {
3928 struct ipw2100_priv *priv = dev_get_drvdata(d);
3929 struct net_device *dev = priv->net_dev;
3930 const char *p = buf;
3931
3932 (void)dev; /* kill unused-var warning for debug-only code */
3933
3934 if (count < 1)
3935 return count;
3936
3937 if (p[0] == '1' ||
3938 (count >= 2 && tolower(p[0]) == 'o' && tolower(p[1]) == 'n')) {
3939 IPW_DEBUG_INFO("%s: Setting memory dump to RAW mode.\n",
3940 dev->name);
3941 priv->dump_raw = 1;
3942
3943 } else if (p[0] == '0' || (count >= 2 && tolower(p[0]) == 'o' &&
3944 tolower(p[1]) == 'f')) {
3945 IPW_DEBUG_INFO("%s: Setting memory dump to HEX mode.\n",
3946 dev->name);
3947 priv->dump_raw = 0;
3948
3949 } else if (tolower(p[0]) == 'r') {
3950 IPW_DEBUG_INFO("%s: Resetting firmware snapshot.\n", dev->name);
3951 ipw2100_snapshot_free(priv);
3952
3953 } else
3954 IPW_DEBUG_INFO("%s: Usage: 0|on = HEX, 1|off = RAW, "
3955 "reset = clear memory snapshot\n", dev->name);
3956
3957 return count;
3958 }
3959
3960 static DEVICE_ATTR(memory, S_IWUSR | S_IRUGO, show_memory, store_memory);
3961
3962 static ssize_t show_ordinals(struct device *d, struct device_attribute *attr,
3963 char *buf)
3964 {
3965 struct ipw2100_priv *priv = dev_get_drvdata(d);
3966 u32 val = 0;
3967 int len = 0;
3968 u32 val_len;
3969 static int loop = 0;
3970
3971 if (priv->status & STATUS_RF_KILL_MASK)
3972 return 0;
3973
3974 if (loop >= ARRAY_SIZE(ord_data))
3975 loop = 0;
3976
3977 /* sysfs provides us PAGE_SIZE buffer */
3978 while (len < PAGE_SIZE - 128 && loop < ARRAY_SIZE(ord_data)) {
3979 val_len = sizeof(u32);
3980
3981 if (ipw2100_get_ordinal(priv, ord_data[loop].index, &val,
3982 &val_len))
3983 len += sprintf(buf + len, "[0x%02X] = ERROR %s\n",
3984 ord_data[loop].index,
3985 ord_data[loop].desc);
3986 else
3987 len += sprintf(buf + len, "[0x%02X] = 0x%08X %s\n",
3988 ord_data[loop].index, val,
3989 ord_data[loop].desc);
3990 loop++;
3991 }
3992
3993 return len;
3994 }
3995
3996 static DEVICE_ATTR(ordinals, S_IRUGO, show_ordinals, NULL);
3997
3998 static ssize_t show_stats(struct device *d, struct device_attribute *attr,
3999 char *buf)
4000 {
4001 struct ipw2100_priv *priv = dev_get_drvdata(d);
4002 char *out = buf;
4003
4004 out += sprintf(out, "interrupts: %d {tx: %d, rx: %d, other: %d}\n",
4005 priv->interrupts, priv->tx_interrupts,
4006 priv->rx_interrupts, priv->inta_other);
4007 out += sprintf(out, "firmware resets: %d\n", priv->resets);
4008 out += sprintf(out, "firmware hangs: %d\n", priv->hangs);
4009 #ifdef CONFIG_IPW2100_DEBUG
4010 out += sprintf(out, "packet mismatch image: %s\n",
4011 priv->snapshot[0] ? "YES" : "NO");
4012 #endif
4013
4014 return out - buf;
4015 }
4016
4017 static DEVICE_ATTR(stats, S_IRUGO, show_stats, NULL);
4018
4019 static int ipw2100_switch_mode(struct ipw2100_priv *priv, u32 mode)
4020 {
4021 int err;
4022
4023 if (mode == priv->ieee->iw_mode)
4024 return 0;
4025
4026 err = ipw2100_disable_adapter(priv);
4027 if (err) {
4028 printk(KERN_ERR DRV_NAME ": %s: Could not disable adapter %d\n",
4029 priv->net_dev->name, err);
4030 return err;
4031 }
4032
4033 switch (mode) {
4034 case IW_MODE_INFRA:
4035 priv->net_dev->type = ARPHRD_ETHER;
4036 break;
4037 case IW_MODE_ADHOC:
4038 priv->net_dev->type = ARPHRD_ETHER;
4039 break;
4040 #ifdef CONFIG_IPW2100_MONITOR
4041 case IW_MODE_MONITOR:
4042 priv->last_mode = priv->ieee->iw_mode;
4043 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP;
4044 break;
4045 #endif /* CONFIG_IPW2100_MONITOR */
4046 }
4047
4048 priv->ieee->iw_mode = mode;
4049
4050 #ifdef CONFIG_PM
4051 /* Indicate ipw2100_download_firmware download firmware
4052 * from disk instead of memory. */
4053 ipw2100_firmware.version = 0;
4054 #endif
4055
4056 printk(KERN_INFO "%s: Resetting on mode change.\n", priv->net_dev->name);
4057 priv->reset_backoff = 0;
4058 schedule_reset(priv);
4059
4060 return 0;
4061 }
4062
4063 static ssize_t show_internals(struct device *d, struct device_attribute *attr,
4064 char *buf)
4065 {
4066 struct ipw2100_priv *priv = dev_get_drvdata(d);
4067 int len = 0;
4068
4069 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
4070
4071 if (priv->status & STATUS_ASSOCIATED)
4072 len += sprintf(buf + len, "connected: %lu\n",
4073 get_seconds() - priv->connect_start);
4074 else
4075 len += sprintf(buf + len, "not connected\n");
4076
4077 DUMP_VAR(ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx], "p");
4078 DUMP_VAR(status, "08lx");
4079 DUMP_VAR(config, "08lx");
4080 DUMP_VAR(capability, "08lx");
4081
4082 len +=
4083 sprintf(buf + len, "last_rtc: %lu\n",
4084 (unsigned long)priv->last_rtc);
4085
4086 DUMP_VAR(fatal_error, "d");
4087 DUMP_VAR(stop_hang_check, "d");
4088 DUMP_VAR(stop_rf_kill, "d");
4089 DUMP_VAR(messages_sent, "d");
4090
4091 DUMP_VAR(tx_pend_stat.value, "d");
4092 DUMP_VAR(tx_pend_stat.hi, "d");
4093
4094 DUMP_VAR(tx_free_stat.value, "d");
4095 DUMP_VAR(tx_free_stat.lo, "d");
4096
4097 DUMP_VAR(msg_free_stat.value, "d");
4098 DUMP_VAR(msg_free_stat.lo, "d");
4099
4100 DUMP_VAR(msg_pend_stat.value, "d");
4101 DUMP_VAR(msg_pend_stat.hi, "d");
4102
4103 DUMP_VAR(fw_pend_stat.value, "d");
4104 DUMP_VAR(fw_pend_stat.hi, "d");
4105
4106 DUMP_VAR(txq_stat.value, "d");
4107 DUMP_VAR(txq_stat.lo, "d");
4108
4109 DUMP_VAR(ieee->scans, "d");
4110 DUMP_VAR(reset_backoff, "d");
4111
4112 return len;
4113 }
4114
4115 static DEVICE_ATTR(internals, S_IRUGO, show_internals, NULL);
4116
4117 static ssize_t show_bssinfo(struct device *d, struct device_attribute *attr,
4118 char *buf)
4119 {
4120 struct ipw2100_priv *priv = dev_get_drvdata(d);
4121 char essid[IW_ESSID_MAX_SIZE + 1];
4122 u8 bssid[ETH_ALEN];
4123 u32 chan = 0;
4124 char *out = buf;
4125 unsigned int length;
4126 int ret;
4127
4128 if (priv->status & STATUS_RF_KILL_MASK)
4129 return 0;
4130
4131 memset(essid, 0, sizeof(essid));
4132 memset(bssid, 0, sizeof(bssid));
4133
4134 length = IW_ESSID_MAX_SIZE;
4135 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_SSID, essid, &length);
4136 if (ret)
4137 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
4138 __LINE__);
4139
4140 length = sizeof(bssid);
4141 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID,
4142 bssid, &length);
4143 if (ret)
4144 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
4145 __LINE__);
4146
4147 length = sizeof(u32);
4148 ret = ipw2100_get_ordinal(priv, IPW_ORD_OUR_FREQ, &chan, &length);
4149 if (ret)
4150 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
4151 __LINE__);
4152
4153 out += sprintf(out, "ESSID: %s\n", essid);
4154 out += sprintf(out, "BSSID: %pM\n", bssid);
4155 out += sprintf(out, "Channel: %d\n", chan);
4156
4157 return out - buf;
4158 }
4159
4160 static DEVICE_ATTR(bssinfo, S_IRUGO, show_bssinfo, NULL);
4161
4162 #ifdef CONFIG_IPW2100_DEBUG
4163 static ssize_t show_debug_level(struct device_driver *d, char *buf)
4164 {
4165 return sprintf(buf, "0x%08X\n", ipw2100_debug_level);
4166 }
4167
4168 static ssize_t store_debug_level(struct device_driver *d,
4169 const char *buf, size_t count)
4170 {
4171 u32 val;
4172 int ret;
4173
4174 ret = kstrtou32(buf, 0, &val);
4175 if (ret)
4176 IPW_DEBUG_INFO(": %s is not in hex or decimal form.\n", buf);
4177 else
4178 ipw2100_debug_level = val;
4179
4180 return strnlen(buf, count);
4181 }
4182
4183 static DRIVER_ATTR(debug_level, S_IWUSR | S_IRUGO, show_debug_level,
4184 store_debug_level);
4185 #endif /* CONFIG_IPW2100_DEBUG */
4186
4187 static ssize_t show_fatal_error(struct device *d,
4188 struct device_attribute *attr, char *buf)
4189 {
4190 struct ipw2100_priv *priv = dev_get_drvdata(d);
4191 char *out = buf;
4192 int i;
4193
4194 if (priv->fatal_error)
4195 out += sprintf(out, "0x%08X\n", priv->fatal_error);
4196 else
4197 out += sprintf(out, "0\n");
4198
4199 for (i = 1; i <= IPW2100_ERROR_QUEUE; i++) {
4200 if (!priv->fatal_errors[(priv->fatal_index - i) %
4201 IPW2100_ERROR_QUEUE])
4202 continue;
4203
4204 out += sprintf(out, "%d. 0x%08X\n", i,
4205 priv->fatal_errors[(priv->fatal_index - i) %
4206 IPW2100_ERROR_QUEUE]);
4207 }
4208
4209 return out - buf;
4210 }
4211
4212 static ssize_t store_fatal_error(struct device *d,
4213 struct device_attribute *attr, const char *buf,
4214 size_t count)
4215 {
4216 struct ipw2100_priv *priv = dev_get_drvdata(d);
4217 schedule_reset(priv);
4218 return count;
4219 }
4220
4221 static DEVICE_ATTR(fatal_error, S_IWUSR | S_IRUGO, show_fatal_error,
4222 store_fatal_error);
4223
4224 static ssize_t show_scan_age(struct device *d, struct device_attribute *attr,
4225 char *buf)
4226 {
4227 struct ipw2100_priv *priv = dev_get_drvdata(d);
4228 return sprintf(buf, "%d\n", priv->ieee->scan_age);
4229 }
4230
4231 static ssize_t store_scan_age(struct device *d, struct device_attribute *attr,
4232 const char *buf, size_t count)
4233 {
4234 struct ipw2100_priv *priv = dev_get_drvdata(d);
4235 struct net_device *dev = priv->net_dev;
4236 unsigned long val;
4237 int ret;
4238
4239 (void)dev; /* kill unused-var warning for debug-only code */
4240
4241 IPW_DEBUG_INFO("enter\n");
4242
4243 ret = kstrtoul(buf, 0, &val);
4244 if (ret) {
4245 IPW_DEBUG_INFO("%s: user supplied invalid value.\n", dev->name);
4246 } else {
4247 priv->ieee->scan_age = val;
4248 IPW_DEBUG_INFO("set scan_age = %u\n", priv->ieee->scan_age);
4249 }
4250
4251 IPW_DEBUG_INFO("exit\n");
4252 return strnlen(buf, count);
4253 }
4254
4255 static DEVICE_ATTR(scan_age, S_IWUSR | S_IRUGO, show_scan_age, store_scan_age);
4256
4257 static ssize_t show_rf_kill(struct device *d, struct device_attribute *attr,
4258 char *buf)
4259 {
4260 /* 0 - RF kill not enabled
4261 1 - SW based RF kill active (sysfs)
4262 2 - HW based RF kill active
4263 3 - Both HW and SW baed RF kill active */
4264 struct ipw2100_priv *priv = dev_get_drvdata(d);
4265 int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) |
4266 (rf_kill_active(priv) ? 0x2 : 0x0);
4267 return sprintf(buf, "%i\n", val);
4268 }
4269
4270 static int ipw_radio_kill_sw(struct ipw2100_priv *priv, int disable_radio)
4271 {
4272 if ((disable_radio ? 1 : 0) ==
4273 (priv->status & STATUS_RF_KILL_SW ? 1 : 0))
4274 return 0;
4275
4276 IPW_DEBUG_RF_KILL("Manual SW RF Kill set to: RADIO %s\n",
4277 disable_radio ? "OFF" : "ON");
4278
4279 mutex_lock(&priv->action_mutex);
4280
4281 if (disable_radio) {
4282 priv->status |= STATUS_RF_KILL_SW;
4283 ipw2100_down(priv);
4284 } else {
4285 priv->status &= ~STATUS_RF_KILL_SW;
4286 if (rf_kill_active(priv)) {
4287 IPW_DEBUG_RF_KILL("Can not turn radio back on - "
4288 "disabled by HW switch\n");
4289 /* Make sure the RF_KILL check timer is running */
4290 priv->stop_rf_kill = 0;
4291 mod_delayed_work(system_wq, &priv->rf_kill,
4292 round_jiffies_relative(HZ));
4293 } else
4294 schedule_reset(priv);
4295 }
4296
4297 mutex_unlock(&priv->action_mutex);
4298 return 1;
4299 }
4300
4301 static ssize_t store_rf_kill(struct device *d, struct device_attribute *attr,
4302 const char *buf, size_t count)
4303 {
4304 struct ipw2100_priv *priv = dev_get_drvdata(d);
4305 ipw_radio_kill_sw(priv, buf[0] == '1');
4306 return count;
4307 }
4308
4309 static DEVICE_ATTR(rf_kill, S_IWUSR | S_IRUGO, show_rf_kill, store_rf_kill);
4310
4311 static struct attribute *ipw2100_sysfs_entries[] = {
4312 &dev_attr_hardware.attr,
4313 &dev_attr_registers.attr,
4314 &dev_attr_ordinals.attr,
4315 &dev_attr_pci.attr,
4316 &dev_attr_stats.attr,
4317 &dev_attr_internals.attr,
4318 &dev_attr_bssinfo.attr,
4319 &dev_attr_memory.attr,
4320 &dev_attr_scan_age.attr,
4321 &dev_attr_fatal_error.attr,
4322 &dev_attr_rf_kill.attr,
4323 &dev_attr_cfg.attr,
4324 &dev_attr_status.attr,
4325 &dev_attr_capability.attr,
4326 NULL,
4327 };
4328
4329 static struct attribute_group ipw2100_attribute_group = {
4330 .attrs = ipw2100_sysfs_entries,
4331 };
4332
4333 static int status_queue_allocate(struct ipw2100_priv *priv, int entries)
4334 {
4335 struct ipw2100_status_queue *q = &priv->status_queue;
4336
4337 IPW_DEBUG_INFO("enter\n");
4338
4339 q->size = entries * sizeof(struct ipw2100_status);
4340 q->drv =
4341 (struct ipw2100_status *)pci_alloc_consistent(priv->pci_dev,
4342 q->size, &q->nic);
4343 if (!q->drv) {
4344 IPW_DEBUG_WARNING("Can not allocate status queue.\n");
4345 return -ENOMEM;
4346 }
4347
4348 memset(q->drv, 0, q->size);
4349
4350 IPW_DEBUG_INFO("exit\n");
4351
4352 return 0;
4353 }
4354
4355 static void status_queue_free(struct ipw2100_priv *priv)
4356 {
4357 IPW_DEBUG_INFO("enter\n");
4358
4359 if (priv->status_queue.drv) {
4360 pci_free_consistent(priv->pci_dev, priv->status_queue.size,
4361 priv->status_queue.drv,
4362 priv->status_queue.nic);
4363 priv->status_queue.drv = NULL;
4364 }
4365
4366 IPW_DEBUG_INFO("exit\n");
4367 }
4368
4369 static int bd_queue_allocate(struct ipw2100_priv *priv,
4370 struct ipw2100_bd_queue *q, int entries)
4371 {
4372 IPW_DEBUG_INFO("enter\n");
4373
4374 memset(q, 0, sizeof(struct ipw2100_bd_queue));
4375
4376 q->entries = entries;
4377 q->size = entries * sizeof(struct ipw2100_bd);
4378 q->drv = pci_alloc_consistent(priv->pci_dev, q->size, &q->nic);
4379 if (!q->drv) {
4380 IPW_DEBUG_INFO
4381 ("can't allocate shared memory for buffer descriptors\n");
4382 return -ENOMEM;
4383 }
4384 memset(q->drv, 0, q->size);
4385
4386 IPW_DEBUG_INFO("exit\n");
4387
4388 return 0;
4389 }
4390
4391 static void bd_queue_free(struct ipw2100_priv *priv, struct ipw2100_bd_queue *q)
4392 {
4393 IPW_DEBUG_INFO("enter\n");
4394
4395 if (!q)
4396 return;
4397
4398 if (q->drv) {
4399 pci_free_consistent(priv->pci_dev, q->size, q->drv, q->nic);
4400 q->drv = NULL;
4401 }
4402
4403 IPW_DEBUG_INFO("exit\n");
4404 }
4405
4406 static void bd_queue_initialize(struct ipw2100_priv *priv,
4407 struct ipw2100_bd_queue *q, u32 base, u32 size,
4408 u32 r, u32 w)
4409 {
4410 IPW_DEBUG_INFO("enter\n");
4411
4412 IPW_DEBUG_INFO("initializing bd queue at virt=%p, phys=%08x\n", q->drv,
4413 (u32) q->nic);
4414
4415 write_register(priv->net_dev, base, q->nic);
4416 write_register(priv->net_dev, size, q->entries);
4417 write_register(priv->net_dev, r, q->oldest);
4418 write_register(priv->net_dev, w, q->next);
4419
4420 IPW_DEBUG_INFO("exit\n");
4421 }
4422
4423 static void ipw2100_kill_works(struct ipw2100_priv *priv)
4424 {
4425 priv->stop_rf_kill = 1;
4426 priv->stop_hang_check = 1;
4427 cancel_delayed_work_sync(&priv->reset_work);
4428 cancel_delayed_work_sync(&priv->security_work);
4429 cancel_delayed_work_sync(&priv->wx_event_work);
4430 cancel_delayed_work_sync(&priv->hang_check);
4431 cancel_delayed_work_sync(&priv->rf_kill);
4432 cancel_delayed_work_sync(&priv->scan_event);
4433 }
4434
4435 static int ipw2100_tx_allocate(struct ipw2100_priv *priv)
4436 {
4437 int i, j, err = -EINVAL;
4438 void *v;
4439 dma_addr_t p;
4440
4441 IPW_DEBUG_INFO("enter\n");
4442
4443 err = bd_queue_allocate(priv, &priv->tx_queue, TX_QUEUE_LENGTH);
4444 if (err) {
4445 IPW_DEBUG_ERROR("%s: failed bd_queue_allocate\n",
4446 priv->net_dev->name);
4447 return err;
4448 }
4449
4450 priv->tx_buffers = kmalloc_array(TX_PENDED_QUEUE_LENGTH,
4451 sizeof(struct ipw2100_tx_packet),
4452 GFP_ATOMIC);
4453 if (!priv->tx_buffers) {
4454 bd_queue_free(priv, &priv->tx_queue);
4455 return -ENOMEM;
4456 }
4457
4458 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4459 v = pci_alloc_consistent(priv->pci_dev,
4460 sizeof(struct ipw2100_data_header),
4461 &p);
4462 if (!v) {
4463 printk(KERN_ERR DRV_NAME
4464 ": %s: PCI alloc failed for tx " "buffers.\n",
4465 priv->net_dev->name);
4466 err = -ENOMEM;
4467 break;
4468 }
4469
4470 priv->tx_buffers[i].type = DATA;
4471 priv->tx_buffers[i].info.d_struct.data =
4472 (struct ipw2100_data_header *)v;
4473 priv->tx_buffers[i].info.d_struct.data_phys = p;
4474 priv->tx_buffers[i].info.d_struct.txb = NULL;
4475 }
4476
4477 if (i == TX_PENDED_QUEUE_LENGTH)
4478 return 0;
4479
4480 for (j = 0; j < i; j++) {
4481 pci_free_consistent(priv->pci_dev,
4482 sizeof(struct ipw2100_data_header),
4483 priv->tx_buffers[j].info.d_struct.data,
4484 priv->tx_buffers[j].info.d_struct.
4485 data_phys);
4486 }
4487
4488 kfree(priv->tx_buffers);
4489 priv->tx_buffers = NULL;
4490
4491 return err;
4492 }
4493
4494 static void ipw2100_tx_initialize(struct ipw2100_priv *priv)
4495 {
4496 int i;
4497
4498 IPW_DEBUG_INFO("enter\n");
4499
4500 /*
4501 * reinitialize packet info lists
4502 */
4503 INIT_LIST_HEAD(&priv->fw_pend_list);
4504 INIT_STAT(&priv->fw_pend_stat);
4505
4506 /*
4507 * reinitialize lists
4508 */
4509 INIT_LIST_HEAD(&priv->tx_pend_list);
4510 INIT_LIST_HEAD(&priv->tx_free_list);
4511 INIT_STAT(&priv->tx_pend_stat);
4512 INIT_STAT(&priv->tx_free_stat);
4513
4514 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4515 /* We simply drop any SKBs that have been queued for
4516 * transmit */
4517 if (priv->tx_buffers[i].info.d_struct.txb) {
4518 libipw_txb_free(priv->tx_buffers[i].info.d_struct.
4519 txb);
4520 priv->tx_buffers[i].info.d_struct.txb = NULL;
4521 }
4522
4523 list_add_tail(&priv->tx_buffers[i].list, &priv->tx_free_list);
4524 }
4525
4526 SET_STAT(&priv->tx_free_stat, i);
4527
4528 priv->tx_queue.oldest = 0;
4529 priv->tx_queue.available = priv->tx_queue.entries;
4530 priv->tx_queue.next = 0;
4531 INIT_STAT(&priv->txq_stat);
4532 SET_STAT(&priv->txq_stat, priv->tx_queue.available);
4533
4534 bd_queue_initialize(priv, &priv->tx_queue,
4535 IPW_MEM_HOST_SHARED_TX_QUEUE_BD_BASE,
4536 IPW_MEM_HOST_SHARED_TX_QUEUE_BD_SIZE,
4537 IPW_MEM_HOST_SHARED_TX_QUEUE_READ_INDEX,
4538 IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX);
4539
4540 IPW_DEBUG_INFO("exit\n");
4541
4542 }
4543
4544 static void ipw2100_tx_free(struct ipw2100_priv *priv)
4545 {
4546 int i;
4547
4548 IPW_DEBUG_INFO("enter\n");
4549
4550 bd_queue_free(priv, &priv->tx_queue);
4551
4552 if (!priv->tx_buffers)
4553 return;
4554
4555 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4556 if (priv->tx_buffers[i].info.d_struct.txb) {
4557 libipw_txb_free(priv->tx_buffers[i].info.d_struct.
4558 txb);
4559 priv->tx_buffers[i].info.d_struct.txb = NULL;
4560 }
4561 if (priv->tx_buffers[i].info.d_struct.data)
4562 pci_free_consistent(priv->pci_dev,
4563 sizeof(struct ipw2100_data_header),
4564 priv->tx_buffers[i].info.d_struct.
4565 data,
4566 priv->tx_buffers[i].info.d_struct.
4567 data_phys);
4568 }
4569
4570 kfree(priv->tx_buffers);
4571 priv->tx_buffers = NULL;
4572
4573 IPW_DEBUG_INFO("exit\n");
4574 }
4575
4576 static int ipw2100_rx_allocate(struct ipw2100_priv *priv)
4577 {
4578 int i, j, err = -EINVAL;
4579
4580 IPW_DEBUG_INFO("enter\n");
4581
4582 err = bd_queue_allocate(priv, &priv->rx_queue, RX_QUEUE_LENGTH);
4583 if (err) {
4584 IPW_DEBUG_INFO("failed bd_queue_allocate\n");
4585 return err;
4586 }
4587
4588 err = status_queue_allocate(priv, RX_QUEUE_LENGTH);
4589 if (err) {
4590 IPW_DEBUG_INFO("failed status_queue_allocate\n");
4591 bd_queue_free(priv, &priv->rx_queue);
4592 return err;
4593 }
4594
4595 /*
4596 * allocate packets
4597 */
4598 priv->rx_buffers = kmalloc(RX_QUEUE_LENGTH *
4599 sizeof(struct ipw2100_rx_packet),
4600 GFP_KERNEL);
4601 if (!priv->rx_buffers) {
4602 IPW_DEBUG_INFO("can't allocate rx packet buffer table\n");
4603
4604 bd_queue_free(priv, &priv->rx_queue);
4605
4606 status_queue_free(priv);
4607
4608 return -ENOMEM;
4609 }
4610
4611 for (i = 0; i < RX_QUEUE_LENGTH; i++) {
4612 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i];
4613
4614 err = ipw2100_alloc_skb(priv, packet);
4615 if (unlikely(err)) {
4616 err = -ENOMEM;
4617 break;
4618 }
4619
4620 /* The BD holds the cache aligned address */
4621 priv->rx_queue.drv[i].host_addr = packet->dma_addr;
4622 priv->rx_queue.drv[i].buf_length = IPW_RX_NIC_BUFFER_LENGTH;
4623 priv->status_queue.drv[i].status_fields = 0;
4624 }
4625
4626 if (i == RX_QUEUE_LENGTH)
4627 return 0;
4628
4629 for (j = 0; j < i; j++) {
4630 pci_unmap_single(priv->pci_dev, priv->rx_buffers[j].dma_addr,
4631 sizeof(struct ipw2100_rx_packet),
4632 PCI_DMA_FROMDEVICE);
4633 dev_kfree_skb(priv->rx_buffers[j].skb);
4634 }
4635
4636 kfree(priv->rx_buffers);
4637 priv->rx_buffers = NULL;
4638
4639 bd_queue_free(priv, &priv->rx_queue);
4640
4641 status_queue_free(priv);
4642
4643 return err;
4644 }
4645
4646 static void ipw2100_rx_initialize(struct ipw2100_priv *priv)
4647 {
4648 IPW_DEBUG_INFO("enter\n");
4649
4650 priv->rx_queue.oldest = 0;
4651 priv->rx_queue.available = priv->rx_queue.entries - 1;
4652 priv->rx_queue.next = priv->rx_queue.entries - 1;
4653
4654 INIT_STAT(&priv->rxq_stat);
4655 SET_STAT(&priv->rxq_stat, priv->rx_queue.available);
4656
4657 bd_queue_initialize(priv, &priv->rx_queue,
4658 IPW_MEM_HOST_SHARED_RX_BD_BASE,
4659 IPW_MEM_HOST_SHARED_RX_BD_SIZE,
4660 IPW_MEM_HOST_SHARED_RX_READ_INDEX,
4661 IPW_MEM_HOST_SHARED_RX_WRITE_INDEX);
4662
4663 /* set up the status queue */
4664 write_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_STATUS_BASE,
4665 priv->status_queue.nic);
4666
4667 IPW_DEBUG_INFO("exit\n");
4668 }
4669
4670 static void ipw2100_rx_free(struct ipw2100_priv *priv)
4671 {
4672 int i;
4673
4674 IPW_DEBUG_INFO("enter\n");
4675
4676 bd_queue_free(priv, &priv->rx_queue);
4677 status_queue_free(priv);
4678
4679 if (!priv->rx_buffers)
4680 return;
4681
4682 for (i = 0; i < RX_QUEUE_LENGTH; i++) {
4683 if (priv->rx_buffers[i].rxp) {
4684 pci_unmap_single(priv->pci_dev,
4685 priv->rx_buffers[i].dma_addr,
4686 sizeof(struct ipw2100_rx),
4687 PCI_DMA_FROMDEVICE);
4688 dev_kfree_skb(priv->rx_buffers[i].skb);
4689 }
4690 }
4691
4692 kfree(priv->rx_buffers);
4693 priv->rx_buffers = NULL;
4694
4695 IPW_DEBUG_INFO("exit\n");
4696 }
4697
4698 static int ipw2100_read_mac_address(struct ipw2100_priv *priv)
4699 {
4700 u32 length = ETH_ALEN;
4701 u8 addr[ETH_ALEN];
4702
4703 int err;
4704
4705 err = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ADAPTER_MAC, addr, &length);
4706 if (err) {
4707 IPW_DEBUG_INFO("MAC address read failed\n");
4708 return -EIO;
4709 }
4710
4711 memcpy(priv->net_dev->dev_addr, addr, ETH_ALEN);
4712 IPW_DEBUG_INFO("card MAC is %pM\n", priv->net_dev->dev_addr);
4713
4714 return 0;
4715 }
4716
4717 /********************************************************************
4718 *
4719 * Firmware Commands
4720 *
4721 ********************************************************************/
4722
4723 static int ipw2100_set_mac_address(struct ipw2100_priv *priv, int batch_mode)
4724 {
4725 struct host_command cmd = {
4726 .host_command = ADAPTER_ADDRESS,
4727 .host_command_sequence = 0,
4728 .host_command_length = ETH_ALEN
4729 };
4730 int err;
4731
4732 IPW_DEBUG_HC("SET_MAC_ADDRESS\n");
4733
4734 IPW_DEBUG_INFO("enter\n");
4735
4736 if (priv->config & CFG_CUSTOM_MAC) {
4737 memcpy(cmd.host_command_parameters, priv->mac_addr, ETH_ALEN);
4738 memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN);
4739 } else
4740 memcpy(cmd.host_command_parameters, priv->net_dev->dev_addr,
4741 ETH_ALEN);
4742
4743 err = ipw2100_hw_send_command(priv, &cmd);
4744
4745 IPW_DEBUG_INFO("exit\n");
4746 return err;
4747 }
4748
4749 static int ipw2100_set_port_type(struct ipw2100_priv *priv, u32 port_type,
4750 int batch_mode)
4751 {
4752 struct host_command cmd = {
4753 .host_command = PORT_TYPE,
4754 .host_command_sequence = 0,
4755 .host_command_length = sizeof(u32)
4756 };
4757 int err;
4758
4759 switch (port_type) {
4760 case IW_MODE_INFRA:
4761 cmd.host_command_parameters[0] = IPW_BSS;
4762 break;
4763 case IW_MODE_ADHOC:
4764 cmd.host_command_parameters[0] = IPW_IBSS;
4765 break;
4766 }
4767
4768 IPW_DEBUG_HC("PORT_TYPE: %s\n",
4769 port_type == IPW_IBSS ? "Ad-Hoc" : "Managed");
4770
4771 if (!batch_mode) {
4772 err = ipw2100_disable_adapter(priv);
4773 if (err) {
4774 printk(KERN_ERR DRV_NAME
4775 ": %s: Could not disable adapter %d\n",
4776 priv->net_dev->name, err);
4777 return err;
4778 }
4779 }
4780
4781 /* send cmd to firmware */
4782 err = ipw2100_hw_send_command(priv, &cmd);
4783
4784 if (!batch_mode)
4785 ipw2100_enable_adapter(priv);
4786
4787 return err;
4788 }
4789
4790 static int ipw2100_set_channel(struct ipw2100_priv *priv, u32 channel,
4791 int batch_mode)
4792 {
4793 struct host_command cmd = {
4794 .host_command = CHANNEL,
4795 .host_command_sequence = 0,
4796 .host_command_length = sizeof(u32)
4797 };
4798 int err;
4799
4800 cmd.host_command_parameters[0] = channel;
4801
4802 IPW_DEBUG_HC("CHANNEL: %d\n", channel);
4803
4804 /* If BSS then we don't support channel selection */
4805 if (priv->ieee->iw_mode == IW_MODE_INFRA)
4806 return 0;
4807
4808 if ((channel != 0) &&
4809 ((channel < REG_MIN_CHANNEL) || (channel > REG_MAX_CHANNEL)))
4810 return -EINVAL;
4811
4812 if (!batch_mode) {
4813 err = ipw2100_disable_adapter(priv);
4814 if (err)
4815 return err;
4816 }
4817
4818 err = ipw2100_hw_send_command(priv, &cmd);
4819 if (err) {
4820 IPW_DEBUG_INFO("Failed to set channel to %d", channel);
4821 return err;
4822 }
4823
4824 if (channel)
4825 priv->config |= CFG_STATIC_CHANNEL;
4826 else
4827 priv->config &= ~CFG_STATIC_CHANNEL;
4828
4829 priv->channel = channel;
4830
4831 if (!batch_mode) {
4832 err = ipw2100_enable_adapter(priv);
4833 if (err)
4834 return err;
4835 }
4836
4837 return 0;
4838 }
4839
4840 static int ipw2100_system_config(struct ipw2100_priv *priv, int batch_mode)
4841 {
4842 struct host_command cmd = {
4843 .host_command = SYSTEM_CONFIG,
4844 .host_command_sequence = 0,
4845 .host_command_length = 12,
4846 };
4847 u32 ibss_mask, len = sizeof(u32);
4848 int err;
4849
4850 /* Set system configuration */
4851
4852 if (!batch_mode) {
4853 err = ipw2100_disable_adapter(priv);
4854 if (err)
4855 return err;
4856 }
4857
4858 if (priv->ieee->iw_mode == IW_MODE_ADHOC)
4859 cmd.host_command_parameters[0] |= IPW_CFG_IBSS_AUTO_START;
4860
4861 cmd.host_command_parameters[0] |= IPW_CFG_IBSS_MASK |
4862 IPW_CFG_BSS_MASK | IPW_CFG_802_1x_ENABLE;
4863
4864 if (!(priv->config & CFG_LONG_PREAMBLE))
4865 cmd.host_command_parameters[0] |= IPW_CFG_PREAMBLE_AUTO;
4866
4867 err = ipw2100_get_ordinal(priv,
4868 IPW_ORD_EEPROM_IBSS_11B_CHANNELS,
4869 &ibss_mask, &len);
4870 if (err)
4871 ibss_mask = IPW_IBSS_11B_DEFAULT_MASK;
4872
4873 cmd.host_command_parameters[1] = REG_CHANNEL_MASK;
4874 cmd.host_command_parameters[2] = REG_CHANNEL_MASK & ibss_mask;
4875
4876 /* 11b only */
4877 /*cmd.host_command_parameters[0] |= DIVERSITY_ANTENNA_A; */
4878
4879 err = ipw2100_hw_send_command(priv, &cmd);
4880 if (err)
4881 return err;
4882
4883 /* If IPv6 is configured in the kernel then we don't want to filter out all
4884 * of the multicast packets as IPv6 needs some. */
4885 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
4886 cmd.host_command = ADD_MULTICAST;
4887 cmd.host_command_sequence = 0;
4888 cmd.host_command_length = 0;
4889
4890 ipw2100_hw_send_command(priv, &cmd);
4891 #endif
4892 if (!batch_mode) {
4893 err = ipw2100_enable_adapter(priv);
4894 if (err)
4895 return err;
4896 }
4897
4898 return 0;
4899 }
4900
4901 static int ipw2100_set_tx_rates(struct ipw2100_priv *priv, u32 rate,
4902 int batch_mode)
4903 {
4904 struct host_command cmd = {
4905 .host_command = BASIC_TX_RATES,
4906 .host_command_sequence = 0,
4907 .host_command_length = 4
4908 };
4909 int err;
4910
4911 cmd.host_command_parameters[0] = rate & TX_RATE_MASK;
4912
4913 if (!batch_mode) {
4914 err = ipw2100_disable_adapter(priv);
4915 if (err)
4916 return err;
4917 }
4918
4919 /* Set BASIC TX Rate first */
4920 ipw2100_hw_send_command(priv, &cmd);
4921
4922 /* Set TX Rate */
4923 cmd.host_command = TX_RATES;
4924 ipw2100_hw_send_command(priv, &cmd);
4925
4926 /* Set MSDU TX Rate */
4927 cmd.host_command = MSDU_TX_RATES;
4928 ipw2100_hw_send_command(priv, &cmd);
4929
4930 if (!batch_mode) {
4931 err = ipw2100_enable_adapter(priv);
4932 if (err)
4933 return err;
4934 }
4935
4936 priv->tx_rates = rate;
4937
4938 return 0;
4939 }
4940
4941 static int ipw2100_set_power_mode(struct ipw2100_priv *priv, int power_level)
4942 {
4943 struct host_command cmd = {
4944 .host_command = POWER_MODE,
4945 .host_command_sequence = 0,
4946 .host_command_length = 4
4947 };
4948 int err;
4949
4950 cmd.host_command_parameters[0] = power_level;
4951
4952 err = ipw2100_hw_send_command(priv, &cmd);
4953 if (err)
4954 return err;
4955
4956 if (power_level == IPW_POWER_MODE_CAM)
4957 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode);
4958 else
4959 priv->power_mode = IPW_POWER_ENABLED | power_level;
4960
4961 #ifdef IPW2100_TX_POWER
4962 if (priv->port_type == IBSS && priv->adhoc_power != DFTL_IBSS_TX_POWER) {
4963 /* Set beacon interval */
4964 cmd.host_command = TX_POWER_INDEX;
4965 cmd.host_command_parameters[0] = (u32) priv->adhoc_power;
4966
4967 err = ipw2100_hw_send_command(priv, &cmd);
4968 if (err)
4969 return err;
4970 }
4971 #endif
4972
4973 return 0;
4974 }
4975
4976 static int ipw2100_set_rts_threshold(struct ipw2100_priv *priv, u32 threshold)
4977 {
4978 struct host_command cmd = {
4979 .host_command = RTS_THRESHOLD,
4980 .host_command_sequence = 0,
4981 .host_command_length = 4
4982 };
4983 int err;
4984
4985 if (threshold & RTS_DISABLED)
4986 cmd.host_command_parameters[0] = MAX_RTS_THRESHOLD;
4987 else
4988 cmd.host_command_parameters[0] = threshold & ~RTS_DISABLED;
4989
4990 err = ipw2100_hw_send_command(priv, &cmd);
4991 if (err)
4992 return err;
4993
4994 priv->rts_threshold = threshold;
4995
4996 return 0;
4997 }
4998
4999 #if 0
5000 int ipw2100_set_fragmentation_threshold(struct ipw2100_priv *priv,
5001 u32 threshold, int batch_mode)
5002 {
5003 struct host_command cmd = {
5004 .host_command = FRAG_THRESHOLD,
5005 .host_command_sequence = 0,
5006 .host_command_length = 4,
5007 .host_command_parameters[0] = 0,
5008 };
5009 int err;
5010
5011 if (!batch_mode) {
5012 err = ipw2100_disable_adapter(priv);
5013 if (err)
5014 return err;
5015 }
5016
5017 if (threshold == 0)
5018 threshold = DEFAULT_FRAG_THRESHOLD;
5019 else {
5020 threshold = max(threshold, MIN_FRAG_THRESHOLD);
5021 threshold = min(threshold, MAX_FRAG_THRESHOLD);
5022 }
5023
5024 cmd.host_command_parameters[0] = threshold;
5025
5026 IPW_DEBUG_HC("FRAG_THRESHOLD: %u\n", threshold);
5027
5028 err = ipw2100_hw_send_command(priv, &cmd);
5029
5030 if (!batch_mode)
5031 ipw2100_enable_adapter(priv);
5032
5033 if (!err)
5034 priv->frag_threshold = threshold;
5035
5036 return err;
5037 }
5038 #endif
5039
5040 static int ipw2100_set_short_retry(struct ipw2100_priv *priv, u32 retry)
5041 {
5042 struct host_command cmd = {
5043 .host_command = SHORT_RETRY_LIMIT,
5044 .host_command_sequence = 0,
5045 .host_command_length = 4
5046 };
5047 int err;
5048
5049 cmd.host_command_parameters[0] = retry;
5050
5051 err = ipw2100_hw_send_command(priv, &cmd);
5052 if (err)
5053 return err;
5054
5055 priv->short_retry_limit = retry;
5056
5057 return 0;
5058 }
5059
5060 static int ipw2100_set_long_retry(struct ipw2100_priv *priv, u32 retry)
5061 {
5062 struct host_command cmd = {
5063 .host_command = LONG_RETRY_LIMIT,
5064 .host_command_sequence = 0,
5065 .host_command_length = 4
5066 };
5067 int err;
5068
5069 cmd.host_command_parameters[0] = retry;
5070
5071 err = ipw2100_hw_send_command(priv, &cmd);
5072 if (err)
5073 return err;
5074
5075 priv->long_retry_limit = retry;
5076
5077 return 0;
5078 }
5079
5080 static int ipw2100_set_mandatory_bssid(struct ipw2100_priv *priv, u8 * bssid,
5081 int batch_mode)
5082 {
5083 struct host_command cmd = {
5084 .host_command = MANDATORY_BSSID,
5085 .host_command_sequence = 0,
5086 .host_command_length = (bssid == NULL) ? 0 : ETH_ALEN
5087 };
5088 int err;
5089
5090 #ifdef CONFIG_IPW2100_DEBUG
5091 if (bssid != NULL)
5092 IPW_DEBUG_HC("MANDATORY_BSSID: %pM\n", bssid);
5093 else
5094 IPW_DEBUG_HC("MANDATORY_BSSID: <clear>\n");
5095 #endif
5096 /* if BSSID is empty then we disable mandatory bssid mode */
5097 if (bssid != NULL)
5098 memcpy(cmd.host_command_parameters, bssid, ETH_ALEN);
5099
5100 if (!batch_mode) {
5101 err = ipw2100_disable_adapter(priv);
5102 if (err)
5103 return err;
5104 }
5105
5106 err = ipw2100_hw_send_command(priv, &cmd);
5107
5108 if (!batch_mode)
5109 ipw2100_enable_adapter(priv);
5110
5111 return err;
5112 }
5113
5114 static int ipw2100_disassociate_bssid(struct ipw2100_priv *priv)
5115 {
5116 struct host_command cmd = {
5117 .host_command = DISASSOCIATION_BSSID,
5118 .host_command_sequence = 0,
5119 .host_command_length = ETH_ALEN
5120 };
5121 int err;
5122 int len;
5123
5124 IPW_DEBUG_HC("DISASSOCIATION_BSSID\n");
5125
5126 len = ETH_ALEN;
5127 /* The Firmware currently ignores the BSSID and just disassociates from
5128 * the currently associated AP -- but in the off chance that a future
5129 * firmware does use the BSSID provided here, we go ahead and try and
5130 * set it to the currently associated AP's BSSID */
5131 memcpy(cmd.host_command_parameters, priv->bssid, ETH_ALEN);
5132
5133 err = ipw2100_hw_send_command(priv, &cmd);
5134
5135 return err;
5136 }
5137
5138 static int ipw2100_set_wpa_ie(struct ipw2100_priv *,
5139 struct ipw2100_wpa_assoc_frame *, int)
5140 __attribute__ ((unused));
5141
5142 static int ipw2100_set_wpa_ie(struct ipw2100_priv *priv,
5143 struct ipw2100_wpa_assoc_frame *wpa_frame,
5144 int batch_mode)
5145 {
5146 struct host_command cmd = {
5147 .host_command = SET_WPA_IE,
5148 .host_command_sequence = 0,
5149 .host_command_length = sizeof(struct ipw2100_wpa_assoc_frame),
5150 };
5151 int err;
5152
5153 IPW_DEBUG_HC("SET_WPA_IE\n");
5154
5155 if (!batch_mode) {
5156 err = ipw2100_disable_adapter(priv);
5157 if (err)
5158 return err;
5159 }
5160
5161 memcpy(cmd.host_command_parameters, wpa_frame,
5162 sizeof(struct ipw2100_wpa_assoc_frame));
5163
5164 err = ipw2100_hw_send_command(priv, &cmd);
5165
5166 if (!batch_mode) {
5167 if (ipw2100_enable_adapter(priv))
5168 err = -EIO;
5169 }
5170
5171 return err;
5172 }
5173
5174 struct security_info_params {
5175 u32 allowed_ciphers;
5176 u16 version;
5177 u8 auth_mode;
5178 u8 replay_counters_number;
5179 u8 unicast_using_group;
5180 } __packed;
5181
5182 static int ipw2100_set_security_information(struct ipw2100_priv *priv,
5183 int auth_mode,
5184 int security_level,
5185 int unicast_using_group,
5186 int batch_mode)
5187 {
5188 struct host_command cmd = {
5189 .host_command = SET_SECURITY_INFORMATION,
5190 .host_command_sequence = 0,
5191 .host_command_length = sizeof(struct security_info_params)
5192 };
5193 struct security_info_params *security =
5194 (struct security_info_params *)&cmd.host_command_parameters;
5195 int err;
5196 memset(security, 0, sizeof(*security));
5197
5198 /* If shared key AP authentication is turned on, then we need to
5199 * configure the firmware to try and use it.
5200 *
5201 * Actual data encryption/decryption is handled by the host. */
5202 security->auth_mode = auth_mode;
5203 security->unicast_using_group = unicast_using_group;
5204
5205 switch (security_level) {
5206 default:
5207 case SEC_LEVEL_0:
5208 security->allowed_ciphers = IPW_NONE_CIPHER;
5209 break;
5210 case SEC_LEVEL_1:
5211 security->allowed_ciphers = IPW_WEP40_CIPHER |
5212 IPW_WEP104_CIPHER;
5213 break;
5214 case SEC_LEVEL_2:
5215 security->allowed_ciphers = IPW_WEP40_CIPHER |
5216 IPW_WEP104_CIPHER | IPW_TKIP_CIPHER;
5217 break;
5218 case SEC_LEVEL_2_CKIP:
5219 security->allowed_ciphers = IPW_WEP40_CIPHER |
5220 IPW_WEP104_CIPHER | IPW_CKIP_CIPHER;
5221 break;
5222 case SEC_LEVEL_3:
5223 security->allowed_ciphers = IPW_WEP40_CIPHER |
5224 IPW_WEP104_CIPHER | IPW_TKIP_CIPHER | IPW_CCMP_CIPHER;
5225 break;
5226 }
5227
5228 IPW_DEBUG_HC
5229 ("SET_SECURITY_INFORMATION: auth:%d cipher:0x%02X (level %d)\n",
5230 security->auth_mode, security->allowed_ciphers, security_level);
5231
5232 security->replay_counters_number = 0;
5233
5234 if (!batch_mode) {
5235 err = ipw2100_disable_adapter(priv);
5236 if (err)
5237 return err;
5238 }
5239
5240 err = ipw2100_hw_send_command(priv, &cmd);
5241
5242 if (!batch_mode)
5243 ipw2100_enable_adapter(priv);
5244
5245 return err;
5246 }
5247
5248 static int ipw2100_set_tx_power(struct ipw2100_priv *priv, u32 tx_power)
5249 {
5250 struct host_command cmd = {
5251 .host_command = TX_POWER_INDEX,
5252 .host_command_sequence = 0,
5253 .host_command_length = 4
5254 };
5255 int err = 0;
5256 u32 tmp = tx_power;
5257
5258 if (tx_power != IPW_TX_POWER_DEFAULT)
5259 tmp = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 /
5260 (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM);
5261
5262 cmd.host_command_parameters[0] = tmp;
5263
5264 if (priv->ieee->iw_mode == IW_MODE_ADHOC)
5265 err = ipw2100_hw_send_command(priv, &cmd);
5266 if (!err)
5267 priv->tx_power = tx_power;
5268
5269 return 0;
5270 }
5271
5272 static int ipw2100_set_ibss_beacon_interval(struct ipw2100_priv *priv,
5273 u32 interval, int batch_mode)
5274 {
5275 struct host_command cmd = {
5276 .host_command = BEACON_INTERVAL,
5277 .host_command_sequence = 0,
5278 .host_command_length = 4
5279 };
5280 int err;
5281
5282 cmd.host_command_parameters[0] = interval;
5283
5284 IPW_DEBUG_INFO("enter\n");
5285
5286 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5287 if (!batch_mode) {
5288 err = ipw2100_disable_adapter(priv);
5289 if (err)
5290 return err;
5291 }
5292
5293 ipw2100_hw_send_command(priv, &cmd);
5294
5295 if (!batch_mode) {
5296 err = ipw2100_enable_adapter(priv);
5297 if (err)
5298 return err;
5299 }
5300 }
5301
5302 IPW_DEBUG_INFO("exit\n");
5303
5304 return 0;
5305 }
5306
5307 static void ipw2100_queues_initialize(struct ipw2100_priv *priv)
5308 {
5309 ipw2100_tx_initialize(priv);
5310 ipw2100_rx_initialize(priv);
5311 ipw2100_msg_initialize(priv);
5312 }
5313
5314 static void ipw2100_queues_free(struct ipw2100_priv *priv)
5315 {
5316 ipw2100_tx_free(priv);
5317 ipw2100_rx_free(priv);
5318 ipw2100_msg_free(priv);
5319 }
5320
5321 static int ipw2100_queues_allocate(struct ipw2100_priv *priv)
5322 {
5323 if (ipw2100_tx_allocate(priv) ||
5324 ipw2100_rx_allocate(priv) || ipw2100_msg_allocate(priv))
5325 goto fail;
5326
5327 return 0;
5328
5329 fail:
5330 ipw2100_tx_free(priv);
5331 ipw2100_rx_free(priv);
5332 ipw2100_msg_free(priv);
5333 return -ENOMEM;
5334 }
5335
5336 #define IPW_PRIVACY_CAPABLE 0x0008
5337
5338 static int ipw2100_set_wep_flags(struct ipw2100_priv *priv, u32 flags,
5339 int batch_mode)
5340 {
5341 struct host_command cmd = {
5342 .host_command = WEP_FLAGS,
5343 .host_command_sequence = 0,
5344 .host_command_length = 4
5345 };
5346 int err;
5347
5348 cmd.host_command_parameters[0] = flags;
5349
5350 IPW_DEBUG_HC("WEP_FLAGS: flags = 0x%08X\n", flags);
5351
5352 if (!batch_mode) {
5353 err = ipw2100_disable_adapter(priv);
5354 if (err) {
5355 printk(KERN_ERR DRV_NAME
5356 ": %s: Could not disable adapter %d\n",
5357 priv->net_dev->name, err);
5358 return err;
5359 }
5360 }
5361
5362 /* send cmd to firmware */
5363 err = ipw2100_hw_send_command(priv, &cmd);
5364
5365 if (!batch_mode)
5366 ipw2100_enable_adapter(priv);
5367
5368 return err;
5369 }
5370
5371 struct ipw2100_wep_key {
5372 u8 idx;
5373 u8 len;
5374 u8 key[13];
5375 };
5376
5377 /* Macros to ease up priting WEP keys */
5378 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
5379 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
5380 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
5381 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
5382
5383 /**
5384 * Set a the wep key
5385 *
5386 * @priv: struct to work on
5387 * @idx: index of the key we want to set
5388 * @key: ptr to the key data to set
5389 * @len: length of the buffer at @key
5390 * @batch_mode: FIXME perform the operation in batch mode, not
5391 * disabling the device.
5392 *
5393 * @returns 0 if OK, < 0 errno code on error.
5394 *
5395 * Fill out a command structure with the new wep key, length an
5396 * index and send it down the wire.
5397 */
5398 static int ipw2100_set_key(struct ipw2100_priv *priv,
5399 int idx, char *key, int len, int batch_mode)
5400 {
5401 int keylen = len ? (len <= 5 ? 5 : 13) : 0;
5402 struct host_command cmd = {
5403 .host_command = WEP_KEY_INFO,
5404 .host_command_sequence = 0,
5405 .host_command_length = sizeof(struct ipw2100_wep_key),
5406 };
5407 struct ipw2100_wep_key *wep_key = (void *)cmd.host_command_parameters;
5408 int err;
5409
5410 IPW_DEBUG_HC("WEP_KEY_INFO: index = %d, len = %d/%d\n",
5411 idx, keylen, len);
5412
5413 /* NOTE: We don't check cached values in case the firmware was reset
5414 * or some other problem is occurring. If the user is setting the key,
5415 * then we push the change */
5416
5417 wep_key->idx = idx;
5418 wep_key->len = keylen;
5419
5420 if (keylen) {
5421 memcpy(wep_key->key, key, len);
5422 memset(wep_key->key + len, 0, keylen - len);
5423 }
5424
5425 /* Will be optimized out on debug not being configured in */
5426 if (keylen == 0)
5427 IPW_DEBUG_WEP("%s: Clearing key %d\n",
5428 priv->net_dev->name, wep_key->idx);
5429 else if (keylen == 5)
5430 IPW_DEBUG_WEP("%s: idx: %d, len: %d key: " WEP_FMT_64 "\n",
5431 priv->net_dev->name, wep_key->idx, wep_key->len,
5432 WEP_STR_64(wep_key->key));
5433 else
5434 IPW_DEBUG_WEP("%s: idx: %d, len: %d key: " WEP_FMT_128
5435 "\n",
5436 priv->net_dev->name, wep_key->idx, wep_key->len,
5437 WEP_STR_128(wep_key->key));
5438
5439 if (!batch_mode) {
5440 err = ipw2100_disable_adapter(priv);
5441 /* FIXME: IPG: shouldn't this prink be in _disable_adapter()? */
5442 if (err) {
5443 printk(KERN_ERR DRV_NAME
5444 ": %s: Could not disable adapter %d\n",
5445 priv->net_dev->name, err);
5446 return err;
5447 }
5448 }
5449
5450 /* send cmd to firmware */
5451 err = ipw2100_hw_send_command(priv, &cmd);
5452
5453 if (!batch_mode) {
5454 int err2 = ipw2100_enable_adapter(priv);
5455 if (err == 0)
5456 err = err2;
5457 }
5458 return err;
5459 }
5460
5461 static int ipw2100_set_key_index(struct ipw2100_priv *priv,
5462 int idx, int batch_mode)
5463 {
5464 struct host_command cmd = {
5465 .host_command = WEP_KEY_INDEX,
5466 .host_command_sequence = 0,
5467 .host_command_length = 4,
5468 .host_command_parameters = {idx},
5469 };
5470 int err;
5471
5472 IPW_DEBUG_HC("WEP_KEY_INDEX: index = %d\n", idx);
5473
5474 if (idx < 0 || idx > 3)
5475 return -EINVAL;
5476
5477 if (!batch_mode) {
5478 err = ipw2100_disable_adapter(priv);
5479 if (err) {
5480 printk(KERN_ERR DRV_NAME
5481 ": %s: Could not disable adapter %d\n",
5482 priv->net_dev->name, err);
5483 return err;
5484 }
5485 }
5486
5487 /* send cmd to firmware */
5488 err = ipw2100_hw_send_command(priv, &cmd);
5489
5490 if (!batch_mode)
5491 ipw2100_enable_adapter(priv);
5492
5493 return err;
5494 }
5495
5496 static int ipw2100_configure_security(struct ipw2100_priv *priv, int batch_mode)
5497 {
5498 int i, err, auth_mode, sec_level, use_group;
5499
5500 if (!(priv->status & STATUS_RUNNING))
5501 return 0;
5502
5503 if (!batch_mode) {
5504 err = ipw2100_disable_adapter(priv);
5505 if (err)
5506 return err;
5507 }
5508
5509 if (!priv->ieee->sec.enabled) {
5510 err =
5511 ipw2100_set_security_information(priv, IPW_AUTH_OPEN,
5512 SEC_LEVEL_0, 0, 1);
5513 } else {
5514 auth_mode = IPW_AUTH_OPEN;
5515 if (priv->ieee->sec.flags & SEC_AUTH_MODE) {
5516 if (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY)
5517 auth_mode = IPW_AUTH_SHARED;
5518 else if (priv->ieee->sec.auth_mode == WLAN_AUTH_LEAP)
5519 auth_mode = IPW_AUTH_LEAP_CISCO_ID;
5520 }
5521
5522 sec_level = SEC_LEVEL_0;
5523 if (priv->ieee->sec.flags & SEC_LEVEL)
5524 sec_level = priv->ieee->sec.level;
5525
5526 use_group = 0;
5527 if (priv->ieee->sec.flags & SEC_UNICAST_GROUP)
5528 use_group = priv->ieee->sec.unicast_uses_group;
5529
5530 err =
5531 ipw2100_set_security_information(priv, auth_mode, sec_level,
5532 use_group, 1);
5533 }
5534
5535 if (err)
5536 goto exit;
5537
5538 if (priv->ieee->sec.enabled) {
5539 for (i = 0; i < 4; i++) {
5540 if (!(priv->ieee->sec.flags & (1 << i))) {
5541 memset(priv->ieee->sec.keys[i], 0, WEP_KEY_LEN);
5542 priv->ieee->sec.key_sizes[i] = 0;
5543 } else {
5544 err = ipw2100_set_key(priv, i,
5545 priv->ieee->sec.keys[i],
5546 priv->ieee->sec.
5547 key_sizes[i], 1);
5548 if (err)
5549 goto exit;
5550 }
5551 }
5552
5553 ipw2100_set_key_index(priv, priv->ieee->crypt_info.tx_keyidx, 1);
5554 }
5555
5556 /* Always enable privacy so the Host can filter WEP packets if
5557 * encrypted data is sent up */
5558 err =
5559 ipw2100_set_wep_flags(priv,
5560 priv->ieee->sec.
5561 enabled ? IPW_PRIVACY_CAPABLE : 0, 1);
5562 if (err)
5563 goto exit;
5564
5565 priv->status &= ~STATUS_SECURITY_UPDATED;
5566
5567 exit:
5568 if (!batch_mode)
5569 ipw2100_enable_adapter(priv);
5570
5571 return err;
5572 }
5573
5574 static void ipw2100_security_work(struct work_struct *work)
5575 {
5576 struct ipw2100_priv *priv =
5577 container_of(work, struct ipw2100_priv, security_work.work);
5578
5579 /* If we happen to have reconnected before we get a chance to
5580 * process this, then update the security settings--which causes
5581 * a disassociation to occur */
5582 if (!(priv->status & STATUS_ASSOCIATED) &&
5583 priv->status & STATUS_SECURITY_UPDATED)
5584 ipw2100_configure_security(priv, 0);
5585 }
5586
5587 static void shim__set_security(struct net_device *dev,
5588 struct libipw_security *sec)
5589 {
5590 struct ipw2100_priv *priv = libipw_priv(dev);
5591 int i, force_update = 0;
5592
5593 mutex_lock(&priv->action_mutex);
5594 if (!(priv->status & STATUS_INITIALIZED))
5595 goto done;
5596
5597 for (i = 0; i < 4; i++) {
5598 if (sec->flags & (1 << i)) {
5599 priv->ieee->sec.key_sizes[i] = sec->key_sizes[i];
5600 if (sec->key_sizes[i] == 0)
5601 priv->ieee->sec.flags &= ~(1 << i);
5602 else
5603 memcpy(priv->ieee->sec.keys[i], sec->keys[i],
5604 sec->key_sizes[i]);
5605 if (sec->level == SEC_LEVEL_1) {
5606 priv->ieee->sec.flags |= (1 << i);
5607 priv->status |= STATUS_SECURITY_UPDATED;
5608 } else
5609 priv->ieee->sec.flags &= ~(1 << i);
5610 }
5611 }
5612
5613 if ((sec->flags & SEC_ACTIVE_KEY) &&
5614 priv->ieee->sec.active_key != sec->active_key) {
5615 if (sec->active_key <= 3) {
5616 priv->ieee->sec.active_key = sec->active_key;
5617 priv->ieee->sec.flags |= SEC_ACTIVE_KEY;
5618 } else
5619 priv->ieee->sec.flags &= ~SEC_ACTIVE_KEY;
5620
5621 priv->status |= STATUS_SECURITY_UPDATED;
5622 }
5623
5624 if ((sec->flags & SEC_AUTH_MODE) &&
5625 (priv->ieee->sec.auth_mode != sec->auth_mode)) {
5626 priv->ieee->sec.auth_mode = sec->auth_mode;
5627 priv->ieee->sec.flags |= SEC_AUTH_MODE;
5628 priv->status |= STATUS_SECURITY_UPDATED;
5629 }
5630
5631 if (sec->flags & SEC_ENABLED && priv->ieee->sec.enabled != sec->enabled) {
5632 priv->ieee->sec.flags |= SEC_ENABLED;
5633 priv->ieee->sec.enabled = sec->enabled;
5634 priv->status |= STATUS_SECURITY_UPDATED;
5635 force_update = 1;
5636 }
5637
5638 if (sec->flags & SEC_ENCRYPT)
5639 priv->ieee->sec.encrypt = sec->encrypt;
5640
5641 if (sec->flags & SEC_LEVEL && priv->ieee->sec.level != sec->level) {
5642 priv->ieee->sec.level = sec->level;
5643 priv->ieee->sec.flags |= SEC_LEVEL;
5644 priv->status |= STATUS_SECURITY_UPDATED;
5645 }
5646
5647 IPW_DEBUG_WEP("Security flags: %c %c%c%c%c %c%c%c%c\n",
5648 priv->ieee->sec.flags & (1 << 8) ? '1' : '0',
5649 priv->ieee->sec.flags & (1 << 7) ? '1' : '0',
5650 priv->ieee->sec.flags & (1 << 6) ? '1' : '0',
5651 priv->ieee->sec.flags & (1 << 5) ? '1' : '0',
5652 priv->ieee->sec.flags & (1 << 4) ? '1' : '0',
5653 priv->ieee->sec.flags & (1 << 3) ? '1' : '0',
5654 priv->ieee->sec.flags & (1 << 2) ? '1' : '0',
5655 priv->ieee->sec.flags & (1 << 1) ? '1' : '0',
5656 priv->ieee->sec.flags & (1 << 0) ? '1' : '0');
5657
5658 /* As a temporary work around to enable WPA until we figure out why
5659 * wpa_supplicant toggles the security capability of the driver, which
5660 * forces a disassocation with force_update...
5661 *
5662 * if (force_update || !(priv->status & STATUS_ASSOCIATED))*/
5663 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)))
5664 ipw2100_configure_security(priv, 0);
5665 done:
5666 mutex_unlock(&priv->action_mutex);
5667 }
5668
5669 static int ipw2100_adapter_setup(struct ipw2100_priv *priv)
5670 {
5671 int err;
5672 int batch_mode = 1;
5673 u8 *bssid;
5674
5675 IPW_DEBUG_INFO("enter\n");
5676
5677 err = ipw2100_disable_adapter(priv);
5678 if (err)
5679 return err;
5680 #ifdef CONFIG_IPW2100_MONITOR
5681 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
5682 err = ipw2100_set_channel(priv, priv->channel, batch_mode);
5683 if (err)
5684 return err;
5685
5686 IPW_DEBUG_INFO("exit\n");
5687
5688 return 0;
5689 }
5690 #endif /* CONFIG_IPW2100_MONITOR */
5691
5692 err = ipw2100_read_mac_address(priv);
5693 if (err)
5694 return -EIO;
5695
5696 err = ipw2100_set_mac_address(priv, batch_mode);
5697 if (err)
5698 return err;
5699
5700 err = ipw2100_set_port_type(priv, priv->ieee->iw_mode, batch_mode);
5701 if (err)
5702 return err;
5703
5704 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5705 err = ipw2100_set_channel(priv, priv->channel, batch_mode);
5706 if (err)
5707 return err;
5708 }
5709
5710 err = ipw2100_system_config(priv, batch_mode);
5711 if (err)
5712 return err;
5713
5714 err = ipw2100_set_tx_rates(priv, priv->tx_rates, batch_mode);
5715 if (err)
5716 return err;
5717
5718 /* Default to power mode OFF */
5719 err = ipw2100_set_power_mode(priv, IPW_POWER_MODE_CAM);
5720 if (err)
5721 return err;
5722
5723 err = ipw2100_set_rts_threshold(priv, priv->rts_threshold);
5724 if (err)
5725 return err;
5726
5727 if (priv->config & CFG_STATIC_BSSID)
5728 bssid = priv->bssid;
5729 else
5730 bssid = NULL;
5731 err = ipw2100_set_mandatory_bssid(priv, bssid, batch_mode);
5732 if (err)
5733 return err;
5734
5735 if (priv->config & CFG_STATIC_ESSID)
5736 err = ipw2100_set_essid(priv, priv->essid, priv->essid_len,
5737 batch_mode);
5738 else
5739 err = ipw2100_set_essid(priv, NULL, 0, batch_mode);
5740 if (err)
5741 return err;
5742
5743 err = ipw2100_configure_security(priv, batch_mode);
5744 if (err)
5745 return err;
5746
5747 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5748 err =
5749 ipw2100_set_ibss_beacon_interval(priv,
5750 priv->beacon_interval,
5751 batch_mode);
5752 if (err)
5753 return err;
5754
5755 err = ipw2100_set_tx_power(priv, priv->tx_power);
5756 if (err)
5757 return err;
5758 }
5759
5760 /*
5761 err = ipw2100_set_fragmentation_threshold(
5762 priv, priv->frag_threshold, batch_mode);
5763 if (err)
5764 return err;
5765 */
5766
5767 IPW_DEBUG_INFO("exit\n");
5768
5769 return 0;
5770 }
5771
5772 /*************************************************************************
5773 *
5774 * EXTERNALLY CALLED METHODS
5775 *
5776 *************************************************************************/
5777
5778 /* This method is called by the network layer -- not to be confused with
5779 * ipw2100_set_mac_address() declared above called by this driver (and this
5780 * method as well) to talk to the firmware */
5781 static int ipw2100_set_address(struct net_device *dev, void *p)
5782 {
5783 struct ipw2100_priv *priv = libipw_priv(dev);
5784 struct sockaddr *addr = p;
5785 int err = 0;
5786
5787 if (!is_valid_ether_addr(addr->sa_data))
5788 return -EADDRNOTAVAIL;
5789
5790 mutex_lock(&priv->action_mutex);
5791
5792 priv->config |= CFG_CUSTOM_MAC;
5793 memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN);
5794
5795 err = ipw2100_set_mac_address(priv, 0);
5796 if (err)
5797 goto done;
5798
5799 priv->reset_backoff = 0;
5800 mutex_unlock(&priv->action_mutex);
5801 ipw2100_reset_adapter(&priv->reset_work.work);
5802 return 0;
5803
5804 done:
5805 mutex_unlock(&priv->action_mutex);
5806 return err;
5807 }
5808
5809 static int ipw2100_open(struct net_device *dev)
5810 {
5811 struct ipw2100_priv *priv = libipw_priv(dev);
5812 unsigned long flags;
5813 IPW_DEBUG_INFO("dev->open\n");
5814
5815 spin_lock_irqsave(&priv->low_lock, flags);
5816 if (priv->status & STATUS_ASSOCIATED) {
5817 netif_carrier_on(dev);
5818 netif_start_queue(dev);
5819 }
5820 spin_unlock_irqrestore(&priv->low_lock, flags);
5821
5822 return 0;
5823 }
5824
5825 static int ipw2100_close(struct net_device *dev)
5826 {
5827 struct ipw2100_priv *priv = libipw_priv(dev);
5828 unsigned long flags;
5829 struct list_head *element;
5830 struct ipw2100_tx_packet *packet;
5831
5832 IPW_DEBUG_INFO("enter\n");
5833
5834 spin_lock_irqsave(&priv->low_lock, flags);
5835
5836 if (priv->status & STATUS_ASSOCIATED)
5837 netif_carrier_off(dev);
5838 netif_stop_queue(dev);
5839
5840 /* Flush the TX queue ... */
5841 while (!list_empty(&priv->tx_pend_list)) {
5842 element = priv->tx_pend_list.next;
5843 packet = list_entry(element, struct ipw2100_tx_packet, list);
5844
5845 list_del(element);
5846 DEC_STAT(&priv->tx_pend_stat);
5847
5848 libipw_txb_free(packet->info.d_struct.txb);
5849 packet->info.d_struct.txb = NULL;
5850
5851 list_add_tail(element, &priv->tx_free_list);
5852 INC_STAT(&priv->tx_free_stat);
5853 }
5854 spin_unlock_irqrestore(&priv->low_lock, flags);
5855
5856 IPW_DEBUG_INFO("exit\n");
5857
5858 return 0;
5859 }
5860
5861 /*
5862 * TODO: Fix this function... its just wrong
5863 */
5864 static void ipw2100_tx_timeout(struct net_device *dev)
5865 {
5866 struct ipw2100_priv *priv = libipw_priv(dev);
5867
5868 dev->stats.tx_errors++;
5869
5870 #ifdef CONFIG_IPW2100_MONITOR
5871 if (priv->ieee->iw_mode == IW_MODE_MONITOR)
5872 return;
5873 #endif
5874
5875 IPW_DEBUG_INFO("%s: TX timed out. Scheduling firmware restart.\n",
5876 dev->name);
5877 schedule_reset(priv);
5878 }
5879
5880 static int ipw2100_wpa_enable(struct ipw2100_priv *priv, int value)
5881 {
5882 /* This is called when wpa_supplicant loads and closes the driver
5883 * interface. */
5884 priv->ieee->wpa_enabled = value;
5885 return 0;
5886 }
5887
5888 static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value)
5889 {
5890
5891 struct libipw_device *ieee = priv->ieee;
5892 struct libipw_security sec = {
5893 .flags = SEC_AUTH_MODE,
5894 };
5895 int ret = 0;
5896
5897 if (value & IW_AUTH_ALG_SHARED_KEY) {
5898 sec.auth_mode = WLAN_AUTH_SHARED_KEY;
5899 ieee->open_wep = 0;
5900 } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) {
5901 sec.auth_mode = WLAN_AUTH_OPEN;
5902 ieee->open_wep = 1;
5903 } else if (value & IW_AUTH_ALG_LEAP) {
5904 sec.auth_mode = WLAN_AUTH_LEAP;
5905 ieee->open_wep = 1;
5906 } else
5907 return -EINVAL;
5908
5909 if (ieee->set_security)
5910 ieee->set_security(ieee->dev, &sec);
5911 else
5912 ret = -EOPNOTSUPP;
5913
5914 return ret;
5915 }
5916
5917 static void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv,
5918 char *wpa_ie, int wpa_ie_len)
5919 {
5920
5921 struct ipw2100_wpa_assoc_frame frame;
5922
5923 frame.fixed_ie_mask = 0;
5924
5925 /* copy WPA IE */
5926 memcpy(frame.var_ie, wpa_ie, wpa_ie_len);
5927 frame.var_ie_len = wpa_ie_len;
5928
5929 /* make sure WPA is enabled */
5930 ipw2100_wpa_enable(priv, 1);
5931 ipw2100_set_wpa_ie(priv, &frame, 0);
5932 }
5933
5934 static void ipw_ethtool_get_drvinfo(struct net_device *dev,
5935 struct ethtool_drvinfo *info)
5936 {
5937 struct ipw2100_priv *priv = libipw_priv(dev);
5938 char fw_ver[64], ucode_ver[64];
5939
5940 strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
5941 strlcpy(info->version, DRV_VERSION, sizeof(info->version));
5942
5943 ipw2100_get_fwversion(priv, fw_ver, sizeof(fw_ver));
5944 ipw2100_get_ucodeversion(priv, ucode_ver, sizeof(ucode_ver));
5945
5946 snprintf(info->fw_version, sizeof(info->fw_version), "%s:%d:%s",
5947 fw_ver, priv->eeprom_version, ucode_ver);
5948
5949 strlcpy(info->bus_info, pci_name(priv->pci_dev),
5950 sizeof(info->bus_info));
5951 }
5952
5953 static u32 ipw2100_ethtool_get_link(struct net_device *dev)
5954 {
5955 struct ipw2100_priv *priv = libipw_priv(dev);
5956 return (priv->status & STATUS_ASSOCIATED) ? 1 : 0;
5957 }
5958
5959 static const struct ethtool_ops ipw2100_ethtool_ops = {
5960 .get_link = ipw2100_ethtool_get_link,
5961 .get_drvinfo = ipw_ethtool_get_drvinfo,
5962 };
5963
5964 static void ipw2100_hang_check(struct work_struct *work)
5965 {
5966 struct ipw2100_priv *priv =
5967 container_of(work, struct ipw2100_priv, hang_check.work);
5968 unsigned long flags;
5969 u32 rtc = 0xa5a5a5a5;
5970 u32 len = sizeof(rtc);
5971 int restart = 0;
5972
5973 spin_lock_irqsave(&priv->low_lock, flags);
5974
5975 if (priv->fatal_error != 0) {
5976 /* If fatal_error is set then we need to restart */
5977 IPW_DEBUG_INFO("%s: Hardware fatal error detected.\n",
5978 priv->net_dev->name);
5979
5980 restart = 1;
5981 } else if (ipw2100_get_ordinal(priv, IPW_ORD_RTC_TIME, &rtc, &len) ||
5982 (rtc == priv->last_rtc)) {
5983 /* Check if firmware is hung */
5984 IPW_DEBUG_INFO("%s: Firmware RTC stalled.\n",
5985 priv->net_dev->name);
5986
5987 restart = 1;
5988 }
5989
5990 if (restart) {
5991 /* Kill timer */
5992 priv->stop_hang_check = 1;
5993 priv->hangs++;
5994
5995 /* Restart the NIC */
5996 schedule_reset(priv);
5997 }
5998
5999 priv->last_rtc = rtc;
6000
6001 if (!priv->stop_hang_check)
6002 schedule_delayed_work(&priv->hang_check, HZ / 2);
6003
6004 spin_unlock_irqrestore(&priv->low_lock, flags);
6005 }
6006
6007 static void ipw2100_rf_kill(struct work_struct *work)
6008 {
6009 struct ipw2100_priv *priv =
6010 container_of(work, struct ipw2100_priv, rf_kill.work);
6011 unsigned long flags;
6012
6013 spin_lock_irqsave(&priv->low_lock, flags);
6014
6015 if (rf_kill_active(priv)) {
6016 IPW_DEBUG_RF_KILL("RF Kill active, rescheduling GPIO check\n");
6017 if (!priv->stop_rf_kill)
6018 schedule_delayed_work(&priv->rf_kill,
6019 round_jiffies_relative(HZ));
6020 goto exit_unlock;
6021 }
6022
6023 /* RF Kill is now disabled, so bring the device back up */
6024
6025 if (!(priv->status & STATUS_RF_KILL_MASK)) {
6026 IPW_DEBUG_RF_KILL("HW RF Kill no longer active, restarting "
6027 "device\n");
6028 schedule_reset(priv);
6029 } else
6030 IPW_DEBUG_RF_KILL("HW RF Kill deactivated. SW RF Kill still "
6031 "enabled\n");
6032
6033 exit_unlock:
6034 spin_unlock_irqrestore(&priv->low_lock, flags);
6035 }
6036
6037 static void ipw2100_irq_tasklet(struct ipw2100_priv *priv);
6038
6039 static const struct net_device_ops ipw2100_netdev_ops = {
6040 .ndo_open = ipw2100_open,
6041 .ndo_stop = ipw2100_close,
6042 .ndo_start_xmit = libipw_xmit,
6043 .ndo_change_mtu = libipw_change_mtu,
6044 .ndo_tx_timeout = ipw2100_tx_timeout,
6045 .ndo_set_mac_address = ipw2100_set_address,
6046 .ndo_validate_addr = eth_validate_addr,
6047 };
6048
6049 /* Look into using netdev destructor to shutdown libipw? */
6050
6051 static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev,
6052 void __iomem * ioaddr)
6053 {
6054 struct ipw2100_priv *priv;
6055 struct net_device *dev;
6056
6057 dev = alloc_libipw(sizeof(struct ipw2100_priv), 0);
6058 if (!dev)
6059 return NULL;
6060 priv = libipw_priv(dev);
6061 priv->ieee = netdev_priv(dev);
6062 priv->pci_dev = pci_dev;
6063 priv->net_dev = dev;
6064 priv->ioaddr = ioaddr;
6065
6066 priv->ieee->hard_start_xmit = ipw2100_tx;
6067 priv->ieee->set_security = shim__set_security;
6068
6069 priv->ieee->perfect_rssi = -20;
6070 priv->ieee->worst_rssi = -85;
6071
6072 dev->netdev_ops = &ipw2100_netdev_ops;
6073 dev->ethtool_ops = &ipw2100_ethtool_ops;
6074 dev->wireless_handlers = &ipw2100_wx_handler_def;
6075 priv->wireless_data.libipw = priv->ieee;
6076 dev->wireless_data = &priv->wireless_data;
6077 dev->watchdog_timeo = 3 * HZ;
6078 dev->irq = 0;
6079
6080 /* NOTE: We don't use the wireless_handlers hook
6081 * in dev as the system will start throwing WX requests
6082 * to us before we're actually initialized and it just
6083 * ends up causing problems. So, we just handle
6084 * the WX extensions through the ipw2100_ioctl interface */
6085
6086 /* memset() puts everything to 0, so we only have explicitly set
6087 * those values that need to be something else */
6088
6089 /* If power management is turned on, default to AUTO mode */
6090 priv->power_mode = IPW_POWER_AUTO;
6091
6092 #ifdef CONFIG_IPW2100_MONITOR
6093 priv->config |= CFG_CRC_CHECK;
6094 #endif
6095 priv->ieee->wpa_enabled = 0;
6096 priv->ieee->drop_unencrypted = 0;
6097 priv->ieee->privacy_invoked = 0;
6098 priv->ieee->ieee802_1x = 1;
6099
6100 /* Set module parameters */
6101 switch (network_mode) {
6102 case 1:
6103 priv->ieee->iw_mode = IW_MODE_ADHOC;
6104 break;
6105 #ifdef CONFIG_IPW2100_MONITOR
6106 case 2:
6107 priv->ieee->iw_mode = IW_MODE_MONITOR;
6108 break;
6109 #endif
6110 default:
6111 case 0:
6112 priv->ieee->iw_mode = IW_MODE_INFRA;
6113 break;
6114 }
6115
6116 if (disable == 1)
6117 priv->status |= STATUS_RF_KILL_SW;
6118
6119 if (channel != 0 &&
6120 ((channel >= REG_MIN_CHANNEL) && (channel <= REG_MAX_CHANNEL))) {
6121 priv->config |= CFG_STATIC_CHANNEL;
6122 priv->channel = channel;
6123 }
6124
6125 if (associate)
6126 priv->config |= CFG_ASSOCIATE;
6127
6128 priv->beacon_interval = DEFAULT_BEACON_INTERVAL;
6129 priv->short_retry_limit = DEFAULT_SHORT_RETRY_LIMIT;
6130 priv->long_retry_limit = DEFAULT_LONG_RETRY_LIMIT;
6131 priv->rts_threshold = DEFAULT_RTS_THRESHOLD | RTS_DISABLED;
6132 priv->frag_threshold = DEFAULT_FTS | FRAG_DISABLED;
6133 priv->tx_power = IPW_TX_POWER_DEFAULT;
6134 priv->tx_rates = DEFAULT_TX_RATES;
6135
6136 strcpy(priv->nick, "ipw2100");
6137
6138 spin_lock_init(&priv->low_lock);
6139 mutex_init(&priv->action_mutex);
6140 mutex_init(&priv->adapter_mutex);
6141
6142 init_waitqueue_head(&priv->wait_command_queue);
6143
6144 netif_carrier_off(dev);
6145
6146 INIT_LIST_HEAD(&priv->msg_free_list);
6147 INIT_LIST_HEAD(&priv->msg_pend_list);
6148 INIT_STAT(&priv->msg_free_stat);
6149 INIT_STAT(&priv->msg_pend_stat);
6150
6151 INIT_LIST_HEAD(&priv->tx_free_list);
6152 INIT_LIST_HEAD(&priv->tx_pend_list);
6153 INIT_STAT(&priv->tx_free_stat);
6154 INIT_STAT(&priv->tx_pend_stat);
6155
6156 INIT_LIST_HEAD(&priv->fw_pend_list);
6157 INIT_STAT(&priv->fw_pend_stat);
6158
6159 INIT_DELAYED_WORK(&priv->reset_work, ipw2100_reset_adapter);
6160 INIT_DELAYED_WORK(&priv->security_work, ipw2100_security_work);
6161 INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work);
6162 INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check);
6163 INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill);
6164 INIT_DELAYED_WORK(&priv->scan_event, ipw2100_scan_event);
6165
6166 tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long))
6167 ipw2100_irq_tasklet, (unsigned long)priv);
6168
6169 /* NOTE: We do not start the deferred work for status checks yet */
6170 priv->stop_rf_kill = 1;
6171 priv->stop_hang_check = 1;
6172
6173 return dev;
6174 }
6175
6176 static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
6177 const struct pci_device_id *ent)
6178 {
6179 void __iomem *ioaddr;
6180 struct net_device *dev = NULL;
6181 struct ipw2100_priv *priv = NULL;
6182 int err = 0;
6183 int registered = 0;
6184 u32 val;
6185
6186 IPW_DEBUG_INFO("enter\n");
6187
6188 if (!(pci_resource_flags(pci_dev, 0) & IORESOURCE_MEM)) {
6189 IPW_DEBUG_INFO("weird - resource type is not memory\n");
6190 err = -ENODEV;
6191 goto out;
6192 }
6193
6194 ioaddr = pci_iomap(pci_dev, 0, 0);
6195 if (!ioaddr) {
6196 printk(KERN_WARNING DRV_NAME
6197 "Error calling ioremap_nocache.\n");
6198 err = -EIO;
6199 goto fail;
6200 }
6201
6202 /* allocate and initialize our net_device */
6203 dev = ipw2100_alloc_device(pci_dev, ioaddr);
6204 if (!dev) {
6205 printk(KERN_WARNING DRV_NAME
6206 "Error calling ipw2100_alloc_device.\n");
6207 err = -ENOMEM;
6208 goto fail;
6209 }
6210
6211 /* set up PCI mappings for device */
6212 err = pci_enable_device(pci_dev);
6213 if (err) {
6214 printk(KERN_WARNING DRV_NAME
6215 "Error calling pci_enable_device.\n");
6216 return err;
6217 }
6218
6219 priv = libipw_priv(dev);
6220
6221 pci_set_master(pci_dev);
6222 pci_set_drvdata(pci_dev, priv);
6223
6224 err = pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32));
6225 if (err) {
6226 printk(KERN_WARNING DRV_NAME
6227 "Error calling pci_set_dma_mask.\n");
6228 pci_disable_device(pci_dev);
6229 return err;
6230 }
6231
6232 err = pci_request_regions(pci_dev, DRV_NAME);
6233 if (err) {
6234 printk(KERN_WARNING DRV_NAME
6235 "Error calling pci_request_regions.\n");
6236 pci_disable_device(pci_dev);
6237 return err;
6238 }
6239
6240 /* We disable the RETRY_TIMEOUT register (0x41) to keep
6241 * PCI Tx retries from interfering with C3 CPU state */
6242 pci_read_config_dword(pci_dev, 0x40, &val);
6243 if ((val & 0x0000ff00) != 0)
6244 pci_write_config_dword(pci_dev, 0x40, val & 0xffff00ff);
6245
6246 if (!ipw2100_hw_is_adapter_in_system(dev)) {
6247 printk(KERN_WARNING DRV_NAME
6248 "Device not found via register read.\n");
6249 err = -ENODEV;
6250 goto fail;
6251 }
6252
6253 SET_NETDEV_DEV(dev, &pci_dev->dev);
6254
6255 /* Force interrupts to be shut off on the device */
6256 priv->status |= STATUS_INT_ENABLED;
6257 ipw2100_disable_interrupts(priv);
6258
6259 /* Allocate and initialize the Tx/Rx queues and lists */
6260 if (ipw2100_queues_allocate(priv)) {
6261 printk(KERN_WARNING DRV_NAME
6262 "Error calling ipw2100_queues_allocate.\n");
6263 err = -ENOMEM;
6264 goto fail;
6265 }
6266 ipw2100_queues_initialize(priv);
6267
6268 err = request_irq(pci_dev->irq,
6269 ipw2100_interrupt, IRQF_SHARED, dev->name, priv);
6270 if (err) {
6271 printk(KERN_WARNING DRV_NAME
6272 "Error calling request_irq: %d.\n", pci_dev->irq);
6273 goto fail;
6274 }
6275 dev->irq = pci_dev->irq;
6276
6277 IPW_DEBUG_INFO("Attempting to register device...\n");
6278
6279 printk(KERN_INFO DRV_NAME
6280 ": Detected Intel PRO/Wireless 2100 Network Connection\n");
6281
6282 err = ipw2100_up(priv, 1);
6283 if (err)
6284 goto fail;
6285
6286 err = ipw2100_wdev_init(dev);
6287 if (err)
6288 goto fail;
6289 registered = 1;
6290
6291 /* Bring up the interface. Pre 0.46, after we registered the
6292 * network device we would call ipw2100_up. This introduced a race
6293 * condition with newer hotplug configurations (network was coming
6294 * up and making calls before the device was initialized).
6295 */
6296 err = register_netdev(dev);
6297 if (err) {
6298 printk(KERN_WARNING DRV_NAME
6299 "Error calling register_netdev.\n");
6300 goto fail;
6301 }
6302 registered = 2;
6303
6304 mutex_lock(&priv->action_mutex);
6305
6306 IPW_DEBUG_INFO("%s: Bound to %s\n", dev->name, pci_name(pci_dev));
6307
6308 /* perform this after register_netdev so that dev->name is set */
6309 err = sysfs_create_group(&pci_dev->dev.kobj, &ipw2100_attribute_group);
6310 if (err)
6311 goto fail_unlock;
6312
6313 /* If the RF Kill switch is disabled, go ahead and complete the
6314 * startup sequence */
6315 if (!(priv->status & STATUS_RF_KILL_MASK)) {
6316 /* Enable the adapter - sends HOST_COMPLETE */
6317 if (ipw2100_enable_adapter(priv)) {
6318 printk(KERN_WARNING DRV_NAME
6319 ": %s: failed in call to enable adapter.\n",
6320 priv->net_dev->name);
6321 ipw2100_hw_stop_adapter(priv);
6322 err = -EIO;
6323 goto fail_unlock;
6324 }
6325
6326 /* Start a scan . . . */
6327 ipw2100_set_scan_options(priv);
6328 ipw2100_start_scan(priv);
6329 }
6330
6331 IPW_DEBUG_INFO("exit\n");
6332
6333 priv->status |= STATUS_INITIALIZED;
6334
6335 mutex_unlock(&priv->action_mutex);
6336 out:
6337 return err;
6338
6339 fail_unlock:
6340 mutex_unlock(&priv->action_mutex);
6341 fail:
6342 if (dev) {
6343 if (registered >= 2)
6344 unregister_netdev(dev);
6345
6346 if (registered) {
6347 wiphy_unregister(priv->ieee->wdev.wiphy);
6348 kfree(priv->ieee->bg_band.channels);
6349 }
6350
6351 ipw2100_hw_stop_adapter(priv);
6352
6353 ipw2100_disable_interrupts(priv);
6354
6355 if (dev->irq)
6356 free_irq(dev->irq, priv);
6357
6358 ipw2100_kill_works(priv);
6359
6360 /* These are safe to call even if they weren't allocated */
6361 ipw2100_queues_free(priv);
6362 sysfs_remove_group(&pci_dev->dev.kobj,
6363 &ipw2100_attribute_group);
6364
6365 free_libipw(dev, 0);
6366 }
6367
6368 pci_iounmap(pci_dev, ioaddr);
6369
6370 pci_release_regions(pci_dev);
6371 pci_disable_device(pci_dev);
6372 goto out;
6373 }
6374
6375 static void ipw2100_pci_remove_one(struct pci_dev *pci_dev)
6376 {
6377 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6378 struct net_device *dev = priv->net_dev;
6379
6380 mutex_lock(&priv->action_mutex);
6381
6382 priv->status &= ~STATUS_INITIALIZED;
6383
6384 sysfs_remove_group(&pci_dev->dev.kobj, &ipw2100_attribute_group);
6385
6386 #ifdef CONFIG_PM
6387 if (ipw2100_firmware.version)
6388 ipw2100_release_firmware(priv, &ipw2100_firmware);
6389 #endif
6390 /* Take down the hardware */
6391 ipw2100_down(priv);
6392
6393 /* Release the mutex so that the network subsystem can
6394 * complete any needed calls into the driver... */
6395 mutex_unlock(&priv->action_mutex);
6396
6397 /* Unregister the device first - this results in close()
6398 * being called if the device is open. If we free storage
6399 * first, then close() will crash.
6400 * FIXME: remove the comment above. */
6401 unregister_netdev(dev);
6402
6403 ipw2100_kill_works(priv);
6404
6405 ipw2100_queues_free(priv);
6406
6407 /* Free potential debugging firmware snapshot */
6408 ipw2100_snapshot_free(priv);
6409
6410 free_irq(dev->irq, priv);
6411
6412 pci_iounmap(pci_dev, priv->ioaddr);
6413
6414 /* wiphy_unregister needs to be here, before free_libipw */
6415 wiphy_unregister(priv->ieee->wdev.wiphy);
6416 kfree(priv->ieee->bg_band.channels);
6417 free_libipw(dev, 0);
6418
6419 pci_release_regions(pci_dev);
6420 pci_disable_device(pci_dev);
6421
6422 IPW_DEBUG_INFO("exit\n");
6423 }
6424
6425 #ifdef CONFIG_PM
6426 static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state)
6427 {
6428 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6429 struct net_device *dev = priv->net_dev;
6430
6431 IPW_DEBUG_INFO("%s: Going into suspend...\n", dev->name);
6432
6433 mutex_lock(&priv->action_mutex);
6434 if (priv->status & STATUS_INITIALIZED) {
6435 /* Take down the device; powers it off, etc. */
6436 ipw2100_down(priv);
6437 }
6438
6439 /* Remove the PRESENT state of the device */
6440 netif_device_detach(dev);
6441
6442 pci_save_state(pci_dev);
6443 pci_disable_device(pci_dev);
6444 pci_set_power_state(pci_dev, PCI_D3hot);
6445
6446 priv->suspend_at = get_seconds();
6447
6448 mutex_unlock(&priv->action_mutex);
6449
6450 return 0;
6451 }
6452
6453 static int ipw2100_resume(struct pci_dev *pci_dev)
6454 {
6455 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6456 struct net_device *dev = priv->net_dev;
6457 int err;
6458 u32 val;
6459
6460 if (IPW2100_PM_DISABLED)
6461 return 0;
6462
6463 mutex_lock(&priv->action_mutex);
6464
6465 IPW_DEBUG_INFO("%s: Coming out of suspend...\n", dev->name);
6466
6467 pci_set_power_state(pci_dev, PCI_D0);
6468 err = pci_enable_device(pci_dev);
6469 if (err) {
6470 printk(KERN_ERR "%s: pci_enable_device failed on resume\n",
6471 dev->name);
6472 mutex_unlock(&priv->action_mutex);
6473 return err;
6474 }
6475 pci_restore_state(pci_dev);
6476
6477 /*
6478 * Suspend/Resume resets the PCI configuration space, so we have to
6479 * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries
6480 * from interfering with C3 CPU state. pci_restore_state won't help
6481 * here since it only restores the first 64 bytes pci config header.
6482 */
6483 pci_read_config_dword(pci_dev, 0x40, &val);
6484 if ((val & 0x0000ff00) != 0)
6485 pci_write_config_dword(pci_dev, 0x40, val & 0xffff00ff);
6486
6487 /* Set the device back into the PRESENT state; this will also wake
6488 * the queue of needed */
6489 netif_device_attach(dev);
6490
6491 priv->suspend_time = get_seconds() - priv->suspend_at;
6492
6493 /* Bring the device back up */
6494 if (!(priv->status & STATUS_RF_KILL_SW))
6495 ipw2100_up(priv, 0);
6496
6497 mutex_unlock(&priv->action_mutex);
6498
6499 return 0;
6500 }
6501 #endif
6502
6503 static void ipw2100_shutdown(struct pci_dev *pci_dev)
6504 {
6505 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6506
6507 /* Take down the device; powers it off, etc. */
6508 ipw2100_down(priv);
6509
6510 pci_disable_device(pci_dev);
6511 }
6512
6513 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
6514
6515 static DEFINE_PCI_DEVICE_TABLE(ipw2100_pci_id_table) = {
6516 IPW2100_DEV_ID(0x2520), /* IN 2100A mPCI 3A */
6517 IPW2100_DEV_ID(0x2521), /* IN 2100A mPCI 3B */
6518 IPW2100_DEV_ID(0x2524), /* IN 2100A mPCI 3B */
6519 IPW2100_DEV_ID(0x2525), /* IN 2100A mPCI 3B */
6520 IPW2100_DEV_ID(0x2526), /* IN 2100A mPCI Gen A3 */
6521 IPW2100_DEV_ID(0x2522), /* IN 2100 mPCI 3B */
6522 IPW2100_DEV_ID(0x2523), /* IN 2100 mPCI 3A */
6523 IPW2100_DEV_ID(0x2527), /* IN 2100 mPCI 3B */
6524 IPW2100_DEV_ID(0x2528), /* IN 2100 mPCI 3B */
6525 IPW2100_DEV_ID(0x2529), /* IN 2100 mPCI 3B */
6526 IPW2100_DEV_ID(0x252B), /* IN 2100 mPCI 3A */
6527 IPW2100_DEV_ID(0x252C), /* IN 2100 mPCI 3A */
6528 IPW2100_DEV_ID(0x252D), /* IN 2100 mPCI 3A */
6529
6530 IPW2100_DEV_ID(0x2550), /* IB 2100A mPCI 3B */
6531 IPW2100_DEV_ID(0x2551), /* IB 2100 mPCI 3B */
6532 IPW2100_DEV_ID(0x2553), /* IB 2100 mPCI 3B */
6533 IPW2100_DEV_ID(0x2554), /* IB 2100 mPCI 3B */
6534 IPW2100_DEV_ID(0x2555), /* IB 2100 mPCI 3B */
6535
6536 IPW2100_DEV_ID(0x2560), /* DE 2100A mPCI 3A */
6537 IPW2100_DEV_ID(0x2562), /* DE 2100A mPCI 3A */
6538 IPW2100_DEV_ID(0x2563), /* DE 2100A mPCI 3A */
6539 IPW2100_DEV_ID(0x2561), /* DE 2100 mPCI 3A */
6540 IPW2100_DEV_ID(0x2565), /* DE 2100 mPCI 3A */
6541 IPW2100_DEV_ID(0x2566), /* DE 2100 mPCI 3A */
6542 IPW2100_DEV_ID(0x2567), /* DE 2100 mPCI 3A */
6543
6544 IPW2100_DEV_ID(0x2570), /* GA 2100 mPCI 3B */
6545
6546 IPW2100_DEV_ID(0x2580), /* TO 2100A mPCI 3B */
6547 IPW2100_DEV_ID(0x2582), /* TO 2100A mPCI 3B */
6548 IPW2100_DEV_ID(0x2583), /* TO 2100A mPCI 3B */
6549 IPW2100_DEV_ID(0x2581), /* TO 2100 mPCI 3B */
6550 IPW2100_DEV_ID(0x2585), /* TO 2100 mPCI 3B */
6551 IPW2100_DEV_ID(0x2586), /* TO 2100 mPCI 3B */
6552 IPW2100_DEV_ID(0x2587), /* TO 2100 mPCI 3B */
6553
6554 IPW2100_DEV_ID(0x2590), /* SO 2100A mPCI 3B */
6555 IPW2100_DEV_ID(0x2592), /* SO 2100A mPCI 3B */
6556 IPW2100_DEV_ID(0x2591), /* SO 2100 mPCI 3B */
6557 IPW2100_DEV_ID(0x2593), /* SO 2100 mPCI 3B */
6558 IPW2100_DEV_ID(0x2596), /* SO 2100 mPCI 3B */
6559 IPW2100_DEV_ID(0x2598), /* SO 2100 mPCI 3B */
6560
6561 IPW2100_DEV_ID(0x25A0), /* HP 2100 mPCI 3B */
6562 {0,},
6563 };
6564
6565 MODULE_DEVICE_TABLE(pci, ipw2100_pci_id_table);
6566
6567 static struct pci_driver ipw2100_pci_driver = {
6568 .name = DRV_NAME,
6569 .id_table = ipw2100_pci_id_table,
6570 .probe = ipw2100_pci_init_one,
6571 .remove = ipw2100_pci_remove_one,
6572 #ifdef CONFIG_PM
6573 .suspend = ipw2100_suspend,
6574 .resume = ipw2100_resume,
6575 #endif
6576 .shutdown = ipw2100_shutdown,
6577 };
6578
6579 /**
6580 * Initialize the ipw2100 driver/module
6581 *
6582 * @returns 0 if ok, < 0 errno node con error.
6583 *
6584 * Note: we cannot init the /proc stuff until the PCI driver is there,
6585 * or we risk an unlikely race condition on someone accessing
6586 * uninitialized data in the PCI dev struct through /proc.
6587 */
6588 static int __init ipw2100_init(void)
6589 {
6590 int ret;
6591
6592 printk(KERN_INFO DRV_NAME ": %s, %s\n", DRV_DESCRIPTION, DRV_VERSION);
6593 printk(KERN_INFO DRV_NAME ": %s\n", DRV_COPYRIGHT);
6594
6595 pm_qos_add_request(&ipw2100_pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
6596 PM_QOS_DEFAULT_VALUE);
6597
6598 ret = pci_register_driver(&ipw2100_pci_driver);
6599 if (ret)
6600 goto out;
6601
6602 #ifdef CONFIG_IPW2100_DEBUG
6603 ipw2100_debug_level = debug;
6604 ret = driver_create_file(&ipw2100_pci_driver.driver,
6605 &driver_attr_debug_level);
6606 #endif
6607
6608 out:
6609 return ret;
6610 }
6611
6612 /**
6613 * Cleanup ipw2100 driver registration
6614 */
6615 static void __exit ipw2100_exit(void)
6616 {
6617 /* FIXME: IPG: check that we have no instances of the devices open */
6618 #ifdef CONFIG_IPW2100_DEBUG
6619 driver_remove_file(&ipw2100_pci_driver.driver,
6620 &driver_attr_debug_level);
6621 #endif
6622 pci_unregister_driver(&ipw2100_pci_driver);
6623 pm_qos_remove_request(&ipw2100_pm_qos_req);
6624 }
6625
6626 module_init(ipw2100_init);
6627 module_exit(ipw2100_exit);
6628
6629 static int ipw2100_wx_get_name(struct net_device *dev,
6630 struct iw_request_info *info,
6631 union iwreq_data *wrqu, char *extra)
6632 {
6633 /*
6634 * This can be called at any time. No action lock required
6635 */
6636
6637 struct ipw2100_priv *priv = libipw_priv(dev);
6638 if (!(priv->status & STATUS_ASSOCIATED))
6639 strcpy(wrqu->name, "unassociated");
6640 else
6641 snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11b");
6642
6643 IPW_DEBUG_WX("Name: %s\n", wrqu->name);
6644 return 0;
6645 }
6646
6647 static int ipw2100_wx_set_freq(struct net_device *dev,
6648 struct iw_request_info *info,
6649 union iwreq_data *wrqu, char *extra)
6650 {
6651 struct ipw2100_priv *priv = libipw_priv(dev);
6652 struct iw_freq *fwrq = &wrqu->freq;
6653 int err = 0;
6654
6655 if (priv->ieee->iw_mode == IW_MODE_INFRA)
6656 return -EOPNOTSUPP;
6657
6658 mutex_lock(&priv->action_mutex);
6659 if (!(priv->status & STATUS_INITIALIZED)) {
6660 err = -EIO;
6661 goto done;
6662 }
6663
6664 /* if setting by freq convert to channel */
6665 if (fwrq->e == 1) {
6666 if ((fwrq->m >= (int)2.412e8 && fwrq->m <= (int)2.487e8)) {
6667 int f = fwrq->m / 100000;
6668 int c = 0;
6669
6670 while ((c < REG_MAX_CHANNEL) &&
6671 (f != ipw2100_frequencies[c]))
6672 c++;
6673
6674 /* hack to fall through */
6675 fwrq->e = 0;
6676 fwrq->m = c + 1;
6677 }
6678 }
6679
6680 if (fwrq->e > 0 || fwrq->m > 1000) {
6681 err = -EOPNOTSUPP;
6682 goto done;
6683 } else { /* Set the channel */
6684 IPW_DEBUG_WX("SET Freq/Channel -> %d\n", fwrq->m);
6685 err = ipw2100_set_channel(priv, fwrq->m, 0);
6686 }
6687
6688 done:
6689 mutex_unlock(&priv->action_mutex);
6690 return err;
6691 }
6692
6693 static int ipw2100_wx_get_freq(struct net_device *dev,
6694 struct iw_request_info *info,
6695 union iwreq_data *wrqu, char *extra)
6696 {
6697 /*
6698 * This can be called at any time. No action lock required
6699 */
6700
6701 struct ipw2100_priv *priv = libipw_priv(dev);
6702
6703 wrqu->freq.e = 0;
6704
6705 /* If we are associated, trying to associate, or have a statically
6706 * configured CHANNEL then return that; otherwise return ANY */
6707 if (priv->config & CFG_STATIC_CHANNEL ||
6708 priv->status & STATUS_ASSOCIATED)
6709 wrqu->freq.m = priv->channel;
6710 else
6711 wrqu->freq.m = 0;
6712
6713 IPW_DEBUG_WX("GET Freq/Channel -> %d\n", priv->channel);
6714 return 0;
6715
6716 }
6717
6718 static int ipw2100_wx_set_mode(struct net_device *dev,
6719 struct iw_request_info *info,
6720 union iwreq_data *wrqu, char *extra)
6721 {
6722 struct ipw2100_priv *priv = libipw_priv(dev);
6723 int err = 0;
6724
6725 IPW_DEBUG_WX("SET Mode -> %d\n", wrqu->mode);
6726
6727 if (wrqu->mode == priv->ieee->iw_mode)
6728 return 0;
6729
6730 mutex_lock(&priv->action_mutex);
6731 if (!(priv->status & STATUS_INITIALIZED)) {
6732 err = -EIO;
6733 goto done;
6734 }
6735
6736 switch (wrqu->mode) {
6737 #ifdef CONFIG_IPW2100_MONITOR
6738 case IW_MODE_MONITOR:
6739 err = ipw2100_switch_mode(priv, IW_MODE_MONITOR);
6740 break;
6741 #endif /* CONFIG_IPW2100_MONITOR */
6742 case IW_MODE_ADHOC:
6743 err = ipw2100_switch_mode(priv, IW_MODE_ADHOC);
6744 break;
6745 case IW_MODE_INFRA:
6746 case IW_MODE_AUTO:
6747 default:
6748 err = ipw2100_switch_mode(priv, IW_MODE_INFRA);
6749 break;
6750 }
6751
6752 done:
6753 mutex_unlock(&priv->action_mutex);
6754 return err;
6755 }
6756
6757 static int ipw2100_wx_get_mode(struct net_device *dev,
6758 struct iw_request_info *info,
6759 union iwreq_data *wrqu, char *extra)
6760 {
6761 /*
6762 * This can be called at any time. No action lock required
6763 */
6764
6765 struct ipw2100_priv *priv = libipw_priv(dev);
6766
6767 wrqu->mode = priv->ieee->iw_mode;
6768 IPW_DEBUG_WX("GET Mode -> %d\n", wrqu->mode);
6769
6770 return 0;
6771 }
6772
6773 #define POWER_MODES 5
6774
6775 /* Values are in microsecond */
6776 static const s32 timeout_duration[POWER_MODES] = {
6777 350000,
6778 250000,
6779 75000,
6780 37000,
6781 25000,
6782 };
6783
6784 static const s32 period_duration[POWER_MODES] = {
6785 400000,
6786 700000,
6787 1000000,
6788 1000000,
6789 1000000
6790 };
6791
6792 static int ipw2100_wx_get_range(struct net_device *dev,
6793 struct iw_request_info *info,
6794 union iwreq_data *wrqu, char *extra)
6795 {
6796 /*
6797 * This can be called at any time. No action lock required
6798 */
6799
6800 struct ipw2100_priv *priv = libipw_priv(dev);
6801 struct iw_range *range = (struct iw_range *)extra;
6802 u16 val;
6803 int i, level;
6804
6805 wrqu->data.length = sizeof(*range);
6806 memset(range, 0, sizeof(*range));
6807
6808 /* Let's try to keep this struct in the same order as in
6809 * linux/include/wireless.h
6810 */
6811
6812 /* TODO: See what values we can set, and remove the ones we can't
6813 * set, or fill them with some default data.
6814 */
6815
6816 /* ~5 Mb/s real (802.11b) */
6817 range->throughput = 5 * 1000 * 1000;
6818
6819 // range->sensitivity; /* signal level threshold range */
6820
6821 range->max_qual.qual = 100;
6822 /* TODO: Find real max RSSI and stick here */
6823 range->max_qual.level = 0;
6824 range->max_qual.noise = 0;
6825 range->max_qual.updated = 7; /* Updated all three */
6826
6827 range->avg_qual.qual = 70; /* > 8% missed beacons is 'bad' */
6828 /* TODO: Find real 'good' to 'bad' threshold value for RSSI */
6829 range->avg_qual.level = 20 + IPW2100_RSSI_TO_DBM;
6830 range->avg_qual.noise = 0;
6831 range->avg_qual.updated = 7; /* Updated all three */
6832
6833 range->num_bitrates = RATE_COUNT;
6834
6835 for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) {
6836 range->bitrate[i] = ipw2100_bg_rates[i].bitrate * 100 * 1000;
6837 }
6838
6839 range->min_rts = MIN_RTS_THRESHOLD;
6840 range->max_rts = MAX_RTS_THRESHOLD;
6841 range->min_frag = MIN_FRAG_THRESHOLD;
6842 range->max_frag = MAX_FRAG_THRESHOLD;
6843
6844 range->min_pmp = period_duration[0]; /* Minimal PM period */
6845 range->max_pmp = period_duration[POWER_MODES - 1]; /* Maximal PM period */
6846 range->min_pmt = timeout_duration[POWER_MODES - 1]; /* Minimal PM timeout */
6847 range->max_pmt = timeout_duration[0]; /* Maximal PM timeout */
6848
6849 /* How to decode max/min PM period */
6850 range->pmp_flags = IW_POWER_PERIOD;
6851 /* How to decode max/min PM period */
6852 range->pmt_flags = IW_POWER_TIMEOUT;
6853 /* What PM options are supported */
6854 range->pm_capa = IW_POWER_TIMEOUT | IW_POWER_PERIOD;
6855
6856 range->encoding_size[0] = 5;
6857 range->encoding_size[1] = 13; /* Different token sizes */
6858 range->num_encoding_sizes = 2; /* Number of entry in the list */
6859 range->max_encoding_tokens = WEP_KEYS; /* Max number of tokens */
6860 // range->encoding_login_index; /* token index for login token */
6861
6862 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
6863 range->txpower_capa = IW_TXPOW_DBM;
6864 range->num_txpower = IW_MAX_TXPOWER;
6865 for (i = 0, level = (IPW_TX_POWER_MAX_DBM * 16);
6866 i < IW_MAX_TXPOWER;
6867 i++, level -=
6868 ((IPW_TX_POWER_MAX_DBM -
6869 IPW_TX_POWER_MIN_DBM) * 16) / (IW_MAX_TXPOWER - 1))
6870 range->txpower[i] = level / 16;
6871 } else {
6872 range->txpower_capa = 0;
6873 range->num_txpower = 0;
6874 }
6875
6876 /* Set the Wireless Extension versions */
6877 range->we_version_compiled = WIRELESS_EXT;
6878 range->we_version_source = 18;
6879
6880 // range->retry_capa; /* What retry options are supported */
6881 // range->retry_flags; /* How to decode max/min retry limit */
6882 // range->r_time_flags; /* How to decode max/min retry life */
6883 // range->min_retry; /* Minimal number of retries */
6884 // range->max_retry; /* Maximal number of retries */
6885 // range->min_r_time; /* Minimal retry lifetime */
6886 // range->max_r_time; /* Maximal retry lifetime */
6887
6888 range->num_channels = FREQ_COUNT;
6889
6890 val = 0;
6891 for (i = 0; i < FREQ_COUNT; i++) {
6892 // TODO: Include only legal frequencies for some countries
6893 // if (local->channel_mask & (1 << i)) {
6894 range->freq[val].i = i + 1;
6895 range->freq[val].m = ipw2100_frequencies[i] * 100000;
6896 range->freq[val].e = 1;
6897 val++;
6898 // }
6899 if (val == IW_MAX_FREQUENCIES)
6900 break;
6901 }
6902 range->num_frequency = val;
6903
6904 /* Event capability (kernel + driver) */
6905 range->event_capa[0] = (IW_EVENT_CAPA_K_0 |
6906 IW_EVENT_CAPA_MASK(SIOCGIWAP));
6907 range->event_capa[1] = IW_EVENT_CAPA_K_1;
6908
6909 range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 |
6910 IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;
6911
6912 IPW_DEBUG_WX("GET Range\n");
6913
6914 return 0;
6915 }
6916
6917 static int ipw2100_wx_set_wap(struct net_device *dev,
6918 struct iw_request_info *info,
6919 union iwreq_data *wrqu, char *extra)
6920 {
6921 struct ipw2100_priv *priv = libipw_priv(dev);
6922 int err = 0;
6923
6924 // sanity checks
6925 if (wrqu->ap_addr.sa_family != ARPHRD_ETHER)
6926 return -EINVAL;
6927
6928 mutex_lock(&priv->action_mutex);
6929 if (!(priv->status & STATUS_INITIALIZED)) {
6930 err = -EIO;
6931 goto done;
6932 }
6933
6934 if (is_broadcast_ether_addr(wrqu->ap_addr.sa_data) ||
6935 is_zero_ether_addr(wrqu->ap_addr.sa_data)) {
6936 /* we disable mandatory BSSID association */
6937 IPW_DEBUG_WX("exit - disable mandatory BSSID\n");
6938 priv->config &= ~CFG_STATIC_BSSID;
6939 err = ipw2100_set_mandatory_bssid(priv, NULL, 0);
6940 goto done;
6941 }
6942
6943 priv->config |= CFG_STATIC_BSSID;
6944 memcpy(priv->mandatory_bssid_mac, wrqu->ap_addr.sa_data, ETH_ALEN);
6945
6946 err = ipw2100_set_mandatory_bssid(priv, wrqu->ap_addr.sa_data, 0);
6947
6948 IPW_DEBUG_WX("SET BSSID -> %pM\n", wrqu->ap_addr.sa_data);
6949
6950 done:
6951 mutex_unlock(&priv->action_mutex);
6952 return err;
6953 }
6954
6955 static int ipw2100_wx_get_wap(struct net_device *dev,
6956 struct iw_request_info *info,
6957 union iwreq_data *wrqu, char *extra)
6958 {
6959 /*
6960 * This can be called at any time. No action lock required
6961 */
6962
6963 struct ipw2100_priv *priv = libipw_priv(dev);
6964
6965 /* If we are associated, trying to associate, or have a statically
6966 * configured BSSID then return that; otherwise return ANY */
6967 if (priv->config & CFG_STATIC_BSSID || priv->status & STATUS_ASSOCIATED) {
6968 wrqu->ap_addr.sa_family = ARPHRD_ETHER;
6969 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN);
6970 } else
6971 memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);
6972
6973 IPW_DEBUG_WX("Getting WAP BSSID: %pM\n", wrqu->ap_addr.sa_data);
6974 return 0;
6975 }
6976
6977 static int ipw2100_wx_set_essid(struct net_device *dev,
6978 struct iw_request_info *info,
6979 union iwreq_data *wrqu, char *extra)
6980 {
6981 struct ipw2100_priv *priv = libipw_priv(dev);
6982 char *essid = ""; /* ANY */
6983 int length = 0;
6984 int err = 0;
6985 DECLARE_SSID_BUF(ssid);
6986
6987 mutex_lock(&priv->action_mutex);
6988 if (!(priv->status & STATUS_INITIALIZED)) {
6989 err = -EIO;
6990 goto done;
6991 }
6992
6993 if (wrqu->essid.flags && wrqu->essid.length) {
6994 length = wrqu->essid.length;
6995 essid = extra;
6996 }
6997
6998 if (length == 0) {
6999 IPW_DEBUG_WX("Setting ESSID to ANY\n");
7000 priv->config &= ~CFG_STATIC_ESSID;
7001 err = ipw2100_set_essid(priv, NULL, 0, 0);
7002 goto done;
7003 }
7004
7005 length = min(length, IW_ESSID_MAX_SIZE);
7006
7007 priv->config |= CFG_STATIC_ESSID;
7008
7009 if (priv->essid_len == length && !memcmp(priv->essid, extra, length)) {
7010 IPW_DEBUG_WX("ESSID set to current ESSID.\n");
7011 err = 0;
7012 goto done;
7013 }
7014
7015 IPW_DEBUG_WX("Setting ESSID: '%s' (%d)\n",
7016 print_ssid(ssid, essid, length), length);
7017
7018 priv->essid_len = length;
7019 memcpy(priv->essid, essid, priv->essid_len);
7020
7021 err = ipw2100_set_essid(priv, essid, length, 0);
7022
7023 done:
7024 mutex_unlock(&priv->action_mutex);
7025 return err;
7026 }
7027
7028 static int ipw2100_wx_get_essid(struct net_device *dev,
7029 struct iw_request_info *info,
7030 union iwreq_data *wrqu, char *extra)
7031 {
7032 /*
7033 * This can be called at any time. No action lock required
7034 */
7035
7036 struct ipw2100_priv *priv = libipw_priv(dev);
7037 DECLARE_SSID_BUF(ssid);
7038
7039 /* If we are associated, trying to associate, or have a statically
7040 * configured ESSID then return that; otherwise return ANY */
7041 if (priv->config & CFG_STATIC_ESSID || priv->status & STATUS_ASSOCIATED) {
7042 IPW_DEBUG_WX("Getting essid: '%s'\n",
7043 print_ssid(ssid, priv->essid, priv->essid_len));
7044 memcpy(extra, priv->essid, priv->essid_len);
7045 wrqu->essid.length = priv->essid_len;
7046 wrqu->essid.flags = 1; /* active */
7047 } else {
7048 IPW_DEBUG_WX("Getting essid: ANY\n");
7049 wrqu->essid.length = 0;
7050 wrqu->essid.flags = 0; /* active */
7051 }
7052
7053 return 0;
7054 }
7055
7056 static int ipw2100_wx_set_nick(struct net_device *dev,
7057 struct iw_request_info *info,
7058 union iwreq_data *wrqu, char *extra)
7059 {
7060 /*
7061 * This can be called at any time. No action lock required
7062 */
7063
7064 struct ipw2100_priv *priv = libipw_priv(dev);
7065
7066 if (wrqu->data.length > IW_ESSID_MAX_SIZE)
7067 return -E2BIG;
7068
7069 wrqu->data.length = min((size_t) wrqu->data.length, sizeof(priv->nick));
7070 memset(priv->nick, 0, sizeof(priv->nick));
7071 memcpy(priv->nick, extra, wrqu->data.length);
7072
7073 IPW_DEBUG_WX("SET Nickname -> %s\n", priv->nick);
7074
7075 return 0;
7076 }
7077
7078 static int ipw2100_wx_get_nick(struct net_device *dev,
7079 struct iw_request_info *info,
7080 union iwreq_data *wrqu, char *extra)
7081 {
7082 /*
7083 * This can be called at any time. No action lock required
7084 */
7085
7086 struct ipw2100_priv *priv = libipw_priv(dev);
7087
7088 wrqu->data.length = strlen(priv->nick);
7089 memcpy(extra, priv->nick, wrqu->data.length);
7090 wrqu->data.flags = 1; /* active */
7091
7092 IPW_DEBUG_WX("GET Nickname -> %s\n", extra);
7093
7094 return 0;
7095 }
7096
7097 static int ipw2100_wx_set_rate(struct net_device *dev,
7098 struct iw_request_info *info,
7099 union iwreq_data *wrqu, char *extra)
7100 {
7101 struct ipw2100_priv *priv = libipw_priv(dev);
7102 u32 target_rate = wrqu->bitrate.value;
7103 u32 rate;
7104 int err = 0;
7105
7106 mutex_lock(&priv->action_mutex);
7107 if (!(priv->status & STATUS_INITIALIZED)) {
7108 err = -EIO;
7109 goto done;
7110 }
7111
7112 rate = 0;
7113
7114 if (target_rate == 1000000 ||
7115 (!wrqu->bitrate.fixed && target_rate > 1000000))
7116 rate |= TX_RATE_1_MBIT;
7117 if (target_rate == 2000000 ||
7118 (!wrqu->bitrate.fixed && target_rate > 2000000))
7119 rate |= TX_RATE_2_MBIT;
7120 if (target_rate == 5500000 ||
7121 (!wrqu->bitrate.fixed && target_rate > 5500000))
7122 rate |= TX_RATE_5_5_MBIT;
7123 if (target_rate == 11000000 ||
7124 (!wrqu->bitrate.fixed && target_rate > 11000000))
7125 rate |= TX_RATE_11_MBIT;
7126 if (rate == 0)
7127 rate = DEFAULT_TX_RATES;
7128
7129 err = ipw2100_set_tx_rates(priv, rate, 0);
7130
7131 IPW_DEBUG_WX("SET Rate -> %04X\n", rate);
7132 done:
7133 mutex_unlock(&priv->action_mutex);
7134 return err;
7135 }
7136
7137 static int ipw2100_wx_get_rate(struct net_device *dev,
7138 struct iw_request_info *info,
7139 union iwreq_data *wrqu, char *extra)
7140 {
7141 struct ipw2100_priv *priv = libipw_priv(dev);
7142 int val;
7143 unsigned int len = sizeof(val);
7144 int err = 0;
7145
7146 if (!(priv->status & STATUS_ENABLED) ||
7147 priv->status & STATUS_RF_KILL_MASK ||
7148 !(priv->status & STATUS_ASSOCIATED)) {
7149 wrqu->bitrate.value = 0;
7150 return 0;
7151 }
7152
7153 mutex_lock(&priv->action_mutex);
7154 if (!(priv->status & STATUS_INITIALIZED)) {
7155 err = -EIO;
7156 goto done;
7157 }
7158
7159 err = ipw2100_get_ordinal(priv, IPW_ORD_CURRENT_TX_RATE, &val, &len);
7160 if (err) {
7161 IPW_DEBUG_WX("failed querying ordinals.\n");
7162 goto done;
7163 }
7164
7165 switch (val & TX_RATE_MASK) {
7166 case TX_RATE_1_MBIT:
7167 wrqu->bitrate.value = 1000000;
7168 break;
7169 case TX_RATE_2_MBIT:
7170 wrqu->bitrate.value = 2000000;
7171 break;
7172 case TX_RATE_5_5_MBIT:
7173 wrqu->bitrate.value = 5500000;
7174 break;
7175 case TX_RATE_11_MBIT:
7176 wrqu->bitrate.value = 11000000;
7177 break;
7178 default:
7179 wrqu->bitrate.value = 0;
7180 }
7181
7182 IPW_DEBUG_WX("GET Rate -> %d\n", wrqu->bitrate.value);
7183
7184 done:
7185 mutex_unlock(&priv->action_mutex);
7186 return err;
7187 }
7188
7189 static int ipw2100_wx_set_rts(struct net_device *dev,
7190 struct iw_request_info *info,
7191 union iwreq_data *wrqu, char *extra)
7192 {
7193 struct ipw2100_priv *priv = libipw_priv(dev);
7194 int value, err;
7195
7196 /* Auto RTS not yet supported */
7197 if (wrqu->rts.fixed == 0)
7198 return -EINVAL;
7199
7200 mutex_lock(&priv->action_mutex);
7201 if (!(priv->status & STATUS_INITIALIZED)) {
7202 err = -EIO;
7203 goto done;
7204 }
7205
7206 if (wrqu->rts.disabled)
7207 value = priv->rts_threshold | RTS_DISABLED;
7208 else {
7209 if (wrqu->rts.value < 1 || wrqu->rts.value > 2304) {
7210 err = -EINVAL;
7211 goto done;
7212 }
7213 value = wrqu->rts.value;
7214 }
7215
7216 err = ipw2100_set_rts_threshold(priv, value);
7217
7218 IPW_DEBUG_WX("SET RTS Threshold -> 0x%08X\n", value);
7219 done:
7220 mutex_unlock(&priv->action_mutex);
7221 return err;
7222 }
7223
7224 static int ipw2100_wx_get_rts(struct net_device *dev,
7225 struct iw_request_info *info,
7226 union iwreq_data *wrqu, char *extra)
7227 {
7228 /*
7229 * This can be called at any time. No action lock required
7230 */
7231
7232 struct ipw2100_priv *priv = libipw_priv(dev);
7233
7234 wrqu->rts.value = priv->rts_threshold & ~RTS_DISABLED;
7235 wrqu->rts.fixed = 1; /* no auto select */
7236
7237 /* If RTS is set to the default value, then it is disabled */
7238 wrqu->rts.disabled = (priv->rts_threshold & RTS_DISABLED) ? 1 : 0;
7239
7240 IPW_DEBUG_WX("GET RTS Threshold -> 0x%08X\n", wrqu->rts.value);
7241
7242 return 0;
7243 }
7244
7245 static int ipw2100_wx_set_txpow(struct net_device *dev,
7246 struct iw_request_info *info,
7247 union iwreq_data *wrqu, char *extra)
7248 {
7249 struct ipw2100_priv *priv = libipw_priv(dev);
7250 int err = 0, value;
7251
7252 if (ipw_radio_kill_sw(priv, wrqu->txpower.disabled))
7253 return -EINPROGRESS;
7254
7255 if (priv->ieee->iw_mode != IW_MODE_ADHOC)
7256 return 0;
7257
7258 if ((wrqu->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM)
7259 return -EINVAL;
7260
7261 if (wrqu->txpower.fixed == 0)
7262 value = IPW_TX_POWER_DEFAULT;
7263 else {
7264 if (wrqu->txpower.value < IPW_TX_POWER_MIN_DBM ||
7265 wrqu->txpower.value > IPW_TX_POWER_MAX_DBM)
7266 return -EINVAL;
7267
7268 value = wrqu->txpower.value;
7269 }
7270
7271 mutex_lock(&priv->action_mutex);
7272 if (!(priv->status & STATUS_INITIALIZED)) {
7273 err = -EIO;
7274 goto done;
7275 }
7276
7277 err = ipw2100_set_tx_power(priv, value);
7278
7279 IPW_DEBUG_WX("SET TX Power -> %d\n", value);
7280
7281 done:
7282 mutex_unlock(&priv->action_mutex);
7283 return err;
7284 }
7285
7286 static int ipw2100_wx_get_txpow(struct net_device *dev,
7287 struct iw_request_info *info,
7288 union iwreq_data *wrqu, char *extra)
7289 {
7290 /*
7291 * This can be called at any time. No action lock required
7292 */
7293
7294 struct ipw2100_priv *priv = libipw_priv(dev);
7295
7296 wrqu->txpower.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0;
7297
7298 if (priv->tx_power == IPW_TX_POWER_DEFAULT) {
7299 wrqu->txpower.fixed = 0;
7300 wrqu->txpower.value = IPW_TX_POWER_MAX_DBM;
7301 } else {
7302 wrqu->txpower.fixed = 1;
7303 wrqu->txpower.value = priv->tx_power;
7304 }
7305
7306 wrqu->txpower.flags = IW_TXPOW_DBM;
7307
7308 IPW_DEBUG_WX("GET TX Power -> %d\n", wrqu->txpower.value);
7309
7310 return 0;
7311 }
7312
7313 static int ipw2100_wx_set_frag(struct net_device *dev,
7314 struct iw_request_info *info,
7315 union iwreq_data *wrqu, char *extra)
7316 {
7317 /*
7318 * This can be called at any time. No action lock required
7319 */
7320
7321 struct ipw2100_priv *priv = libipw_priv(dev);
7322
7323 if (!wrqu->frag.fixed)
7324 return -EINVAL;
7325
7326 if (wrqu->frag.disabled) {
7327 priv->frag_threshold |= FRAG_DISABLED;
7328 priv->ieee->fts = DEFAULT_FTS;
7329 } else {
7330 if (wrqu->frag.value < MIN_FRAG_THRESHOLD ||
7331 wrqu->frag.value > MAX_FRAG_THRESHOLD)
7332 return -EINVAL;
7333
7334 priv->ieee->fts = wrqu->frag.value & ~0x1;
7335 priv->frag_threshold = priv->ieee->fts;
7336 }
7337
7338 IPW_DEBUG_WX("SET Frag Threshold -> %d\n", priv->ieee->fts);
7339
7340 return 0;
7341 }
7342
7343 static int ipw2100_wx_get_frag(struct net_device *dev,
7344 struct iw_request_info *info,
7345 union iwreq_data *wrqu, char *extra)
7346 {
7347 /*
7348 * This can be called at any time. No action lock required
7349 */
7350
7351 struct ipw2100_priv *priv = libipw_priv(dev);
7352 wrqu->frag.value = priv->frag_threshold & ~FRAG_DISABLED;
7353 wrqu->frag.fixed = 0; /* no auto select */
7354 wrqu->frag.disabled = (priv->frag_threshold & FRAG_DISABLED) ? 1 : 0;
7355
7356 IPW_DEBUG_WX("GET Frag Threshold -> %d\n", wrqu->frag.value);
7357
7358 return 0;
7359 }
7360
7361 static int ipw2100_wx_set_retry(struct net_device *dev,
7362 struct iw_request_info *info,
7363 union iwreq_data *wrqu, char *extra)
7364 {
7365 struct ipw2100_priv *priv = libipw_priv(dev);
7366 int err = 0;
7367
7368 if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled)
7369 return -EINVAL;
7370
7371 if (!(wrqu->retry.flags & IW_RETRY_LIMIT))
7372 return 0;
7373
7374 mutex_lock(&priv->action_mutex);
7375 if (!(priv->status & STATUS_INITIALIZED)) {
7376 err = -EIO;
7377 goto done;
7378 }
7379
7380 if (wrqu->retry.flags & IW_RETRY_SHORT) {
7381 err = ipw2100_set_short_retry(priv, wrqu->retry.value);
7382 IPW_DEBUG_WX("SET Short Retry Limit -> %d\n",
7383 wrqu->retry.value);
7384 goto done;
7385 }
7386
7387 if (wrqu->retry.flags & IW_RETRY_LONG) {
7388 err = ipw2100_set_long_retry(priv, wrqu->retry.value);
7389 IPW_DEBUG_WX("SET Long Retry Limit -> %d\n",
7390 wrqu->retry.value);
7391 goto done;
7392 }
7393
7394 err = ipw2100_set_short_retry(priv, wrqu->retry.value);
7395 if (!err)
7396 err = ipw2100_set_long_retry(priv, wrqu->retry.value);
7397
7398 IPW_DEBUG_WX("SET Both Retry Limits -> %d\n", wrqu->retry.value);
7399
7400 done:
7401 mutex_unlock(&priv->action_mutex);
7402 return err;
7403 }
7404
7405 static int ipw2100_wx_get_retry(struct net_device *dev,
7406 struct iw_request_info *info,
7407 union iwreq_data *wrqu, char *extra)
7408 {
7409 /*
7410 * This can be called at any time. No action lock required
7411 */
7412
7413 struct ipw2100_priv *priv = libipw_priv(dev);
7414
7415 wrqu->retry.disabled = 0; /* can't be disabled */
7416
7417 if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME)
7418 return -EINVAL;
7419
7420 if (wrqu->retry.flags & IW_RETRY_LONG) {
7421 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_LONG;
7422 wrqu->retry.value = priv->long_retry_limit;
7423 } else {
7424 wrqu->retry.flags =
7425 (priv->short_retry_limit !=
7426 priv->long_retry_limit) ?
7427 IW_RETRY_LIMIT | IW_RETRY_SHORT : IW_RETRY_LIMIT;
7428
7429 wrqu->retry.value = priv->short_retry_limit;
7430 }
7431
7432 IPW_DEBUG_WX("GET Retry -> %d\n", wrqu->retry.value);
7433
7434 return 0;
7435 }
7436
7437 static int ipw2100_wx_set_scan(struct net_device *dev,
7438 struct iw_request_info *info,
7439 union iwreq_data *wrqu, char *extra)
7440 {
7441 struct ipw2100_priv *priv = libipw_priv(dev);
7442 int err = 0;
7443
7444 mutex_lock(&priv->action_mutex);
7445 if (!(priv->status & STATUS_INITIALIZED)) {
7446 err = -EIO;
7447 goto done;
7448 }
7449
7450 IPW_DEBUG_WX("Initiating scan...\n");
7451
7452 priv->user_requested_scan = 1;
7453 if (ipw2100_set_scan_options(priv) || ipw2100_start_scan(priv)) {
7454 IPW_DEBUG_WX("Start scan failed.\n");
7455
7456 /* TODO: Mark a scan as pending so when hardware initialized
7457 * a scan starts */
7458 }
7459
7460 done:
7461 mutex_unlock(&priv->action_mutex);
7462 return err;
7463 }
7464
7465 static int ipw2100_wx_get_scan(struct net_device *dev,
7466 struct iw_request_info *info,
7467 union iwreq_data *wrqu, char *extra)
7468 {
7469 /*
7470 * This can be called at any time. No action lock required
7471 */
7472
7473 struct ipw2100_priv *priv = libipw_priv(dev);
7474 return libipw_wx_get_scan(priv->ieee, info, wrqu, extra);
7475 }
7476
7477 /*
7478 * Implementation based on code in hostap-driver v0.1.3 hostap_ioctl.c
7479 */
7480 static int ipw2100_wx_set_encode(struct net_device *dev,
7481 struct iw_request_info *info,
7482 union iwreq_data *wrqu, char *key)
7483 {
7484 /*
7485 * No check of STATUS_INITIALIZED required
7486 */
7487
7488 struct ipw2100_priv *priv = libipw_priv(dev);
7489 return libipw_wx_set_encode(priv->ieee, info, wrqu, key);
7490 }
7491
7492 static int ipw2100_wx_get_encode(struct net_device *dev,
7493 struct iw_request_info *info,
7494 union iwreq_data *wrqu, char *key)
7495 {
7496 /*
7497 * This can be called at any time. No action lock required
7498 */
7499
7500 struct ipw2100_priv *priv = libipw_priv(dev);
7501 return libipw_wx_get_encode(priv->ieee, info, wrqu, key);
7502 }
7503
7504 static int ipw2100_wx_set_power(struct net_device *dev,
7505 struct iw_request_info *info,
7506 union iwreq_data *wrqu, char *extra)
7507 {
7508 struct ipw2100_priv *priv = libipw_priv(dev);
7509 int err = 0;
7510
7511 mutex_lock(&priv->action_mutex);
7512 if (!(priv->status & STATUS_INITIALIZED)) {
7513 err = -EIO;
7514 goto done;
7515 }
7516
7517 if (wrqu->power.disabled) {
7518 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode);
7519 err = ipw2100_set_power_mode(priv, IPW_POWER_MODE_CAM);
7520 IPW_DEBUG_WX("SET Power Management Mode -> off\n");
7521 goto done;
7522 }
7523
7524 switch (wrqu->power.flags & IW_POWER_MODE) {
7525 case IW_POWER_ON: /* If not specified */
7526 case IW_POWER_MODE: /* If set all mask */
7527 case IW_POWER_ALL_R: /* If explicitly state all */
7528 break;
7529 default: /* Otherwise we don't support it */
7530 IPW_DEBUG_WX("SET PM Mode: %X not supported.\n",
7531 wrqu->power.flags);
7532 err = -EOPNOTSUPP;
7533 goto done;
7534 }
7535
7536 /* If the user hasn't specified a power management mode yet, default
7537 * to BATTERY */
7538 priv->power_mode = IPW_POWER_ENABLED | priv->power_mode;
7539 err = ipw2100_set_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode));
7540
7541 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode);
7542
7543 done:
7544 mutex_unlock(&priv->action_mutex);
7545 return err;
7546
7547 }
7548
7549 static int ipw2100_wx_get_power(struct net_device *dev,
7550 struct iw_request_info *info,
7551 union iwreq_data *wrqu, char *extra)
7552 {
7553 /*
7554 * This can be called at any time. No action lock required
7555 */
7556
7557 struct ipw2100_priv *priv = libipw_priv(dev);
7558
7559 if (!(priv->power_mode & IPW_POWER_ENABLED))
7560 wrqu->power.disabled = 1;
7561 else {
7562 wrqu->power.disabled = 0;
7563 wrqu->power.flags = 0;
7564 }
7565
7566 IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode);
7567
7568 return 0;
7569 }
7570
7571 /*
7572 * WE-18 WPA support
7573 */
7574
7575 /* SIOCSIWGENIE */
7576 static int ipw2100_wx_set_genie(struct net_device *dev,
7577 struct iw_request_info *info,
7578 union iwreq_data *wrqu, char *extra)
7579 {
7580
7581 struct ipw2100_priv *priv = libipw_priv(dev);
7582 struct libipw_device *ieee = priv->ieee;
7583 u8 *buf;
7584
7585 if (!ieee->wpa_enabled)
7586 return -EOPNOTSUPP;
7587
7588 if (wrqu->data.length > MAX_WPA_IE_LEN ||
7589 (wrqu->data.length && extra == NULL))
7590 return -EINVAL;
7591
7592 if (wrqu->data.length) {
7593 buf = kmemdup(extra, wrqu->data.length, GFP_KERNEL);
7594 if (buf == NULL)
7595 return -ENOMEM;
7596
7597 kfree(ieee->wpa_ie);
7598 ieee->wpa_ie = buf;
7599 ieee->wpa_ie_len = wrqu->data.length;
7600 } else {
7601 kfree(ieee->wpa_ie);
7602 ieee->wpa_ie = NULL;
7603 ieee->wpa_ie_len = 0;
7604 }
7605
7606 ipw2100_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len);
7607
7608 return 0;
7609 }
7610
7611 /* SIOCGIWGENIE */
7612 static int ipw2100_wx_get_genie(struct net_device *dev,
7613 struct iw_request_info *info,
7614 union iwreq_data *wrqu, char *extra)
7615 {
7616 struct ipw2100_priv *priv = libipw_priv(dev);
7617 struct libipw_device *ieee = priv->ieee;
7618
7619 if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) {
7620 wrqu->data.length = 0;
7621 return 0;
7622 }
7623
7624 if (wrqu->data.length < ieee->wpa_ie_len)
7625 return -E2BIG;
7626
7627 wrqu->data.length = ieee->wpa_ie_len;
7628 memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len);
7629
7630 return 0;
7631 }
7632
7633 /* SIOCSIWAUTH */
7634 static int ipw2100_wx_set_auth(struct net_device *dev,
7635 struct iw_request_info *info,
7636 union iwreq_data *wrqu, char *extra)
7637 {
7638 struct ipw2100_priv *priv = libipw_priv(dev);
7639 struct libipw_device *ieee = priv->ieee;
7640 struct iw_param *param = &wrqu->param;
7641 struct lib80211_crypt_data *crypt;
7642 unsigned long flags;
7643 int ret = 0;
7644
7645 switch (param->flags & IW_AUTH_INDEX) {
7646 case IW_AUTH_WPA_VERSION:
7647 case IW_AUTH_CIPHER_PAIRWISE:
7648 case IW_AUTH_CIPHER_GROUP:
7649 case IW_AUTH_KEY_MGMT:
7650 /*
7651 * ipw2200 does not use these parameters
7652 */
7653 break;
7654
7655 case IW_AUTH_TKIP_COUNTERMEASURES:
7656 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx];
7657 if (!crypt || !crypt->ops->set_flags || !crypt->ops->get_flags)
7658 break;
7659
7660 flags = crypt->ops->get_flags(crypt->priv);
7661
7662 if (param->value)
7663 flags |= IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
7664 else
7665 flags &= ~IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
7666
7667 crypt->ops->set_flags(flags, crypt->priv);
7668
7669 break;
7670
7671 case IW_AUTH_DROP_UNENCRYPTED:{
7672 /* HACK:
7673 *
7674 * wpa_supplicant calls set_wpa_enabled when the driver
7675 * is loaded and unloaded, regardless of if WPA is being
7676 * used. No other calls are made which can be used to
7677 * determine if encryption will be used or not prior to
7678 * association being expected. If encryption is not being
7679 * used, drop_unencrypted is set to false, else true -- we
7680 * can use this to determine if the CAP_PRIVACY_ON bit should
7681 * be set.
7682 */
7683 struct libipw_security sec = {
7684 .flags = SEC_ENABLED,
7685 .enabled = param->value,
7686 };
7687 priv->ieee->drop_unencrypted = param->value;
7688 /* We only change SEC_LEVEL for open mode. Others
7689 * are set by ipw_wpa_set_encryption.
7690 */
7691 if (!param->value) {
7692 sec.flags |= SEC_LEVEL;
7693 sec.level = SEC_LEVEL_0;
7694 } else {
7695 sec.flags |= SEC_LEVEL;
7696 sec.level = SEC_LEVEL_1;
7697 }
7698 if (priv->ieee->set_security)
7699 priv->ieee->set_security(priv->ieee->dev, &sec);
7700 break;
7701 }
7702
7703 case IW_AUTH_80211_AUTH_ALG:
7704 ret = ipw2100_wpa_set_auth_algs(priv, param->value);
7705 break;
7706
7707 case IW_AUTH_WPA_ENABLED:
7708 ret = ipw2100_wpa_enable(priv, param->value);
7709 break;
7710
7711 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
7712 ieee->ieee802_1x = param->value;
7713 break;
7714
7715 //case IW_AUTH_ROAMING_CONTROL:
7716 case IW_AUTH_PRIVACY_INVOKED:
7717 ieee->privacy_invoked = param->value;
7718 break;
7719
7720 default:
7721 return -EOPNOTSUPP;
7722 }
7723 return ret;
7724 }
7725
7726 /* SIOCGIWAUTH */
7727 static int ipw2100_wx_get_auth(struct net_device *dev,
7728 struct iw_request_info *info,
7729 union iwreq_data *wrqu, char *extra)
7730 {
7731 struct ipw2100_priv *priv = libipw_priv(dev);
7732 struct libipw_device *ieee = priv->ieee;
7733 struct lib80211_crypt_data *crypt;
7734 struct iw_param *param = &wrqu->param;
7735 int ret = 0;
7736
7737 switch (param->flags & IW_AUTH_INDEX) {
7738 case IW_AUTH_WPA_VERSION:
7739 case IW_AUTH_CIPHER_PAIRWISE:
7740 case IW_AUTH_CIPHER_GROUP:
7741 case IW_AUTH_KEY_MGMT:
7742 /*
7743 * wpa_supplicant will control these internally
7744 */
7745 ret = -EOPNOTSUPP;
7746 break;
7747
7748 case IW_AUTH_TKIP_COUNTERMEASURES:
7749 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx];
7750 if (!crypt || !crypt->ops->get_flags) {
7751 IPW_DEBUG_WARNING("Can't get TKIP countermeasures: "
7752 "crypt not set!\n");
7753 break;
7754 }
7755
7756 param->value = (crypt->ops->get_flags(crypt->priv) &
7757 IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) ? 1 : 0;
7758
7759 break;
7760
7761 case IW_AUTH_DROP_UNENCRYPTED:
7762 param->value = ieee->drop_unencrypted;
7763 break;
7764
7765 case IW_AUTH_80211_AUTH_ALG:
7766 param->value = priv->ieee->sec.auth_mode;
7767 break;
7768
7769 case IW_AUTH_WPA_ENABLED:
7770 param->value = ieee->wpa_enabled;
7771 break;
7772
7773 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
7774 param->value = ieee->ieee802_1x;
7775 break;
7776
7777 case IW_AUTH_ROAMING_CONTROL:
7778 case IW_AUTH_PRIVACY_INVOKED:
7779 param->value = ieee->privacy_invoked;
7780 break;
7781
7782 default:
7783 return -EOPNOTSUPP;
7784 }
7785 return 0;
7786 }
7787
7788 /* SIOCSIWENCODEEXT */
7789 static int ipw2100_wx_set_encodeext(struct net_device *dev,
7790 struct iw_request_info *info,
7791 union iwreq_data *wrqu, char *extra)
7792 {
7793 struct ipw2100_priv *priv = libipw_priv(dev);
7794 return libipw_wx_set_encodeext(priv->ieee, info, wrqu, extra);
7795 }
7796
7797 /* SIOCGIWENCODEEXT */
7798 static int ipw2100_wx_get_encodeext(struct net_device *dev,
7799 struct iw_request_info *info,
7800 union iwreq_data *wrqu, char *extra)
7801 {
7802 struct ipw2100_priv *priv = libipw_priv(dev);
7803 return libipw_wx_get_encodeext(priv->ieee, info, wrqu, extra);
7804 }
7805
7806 /* SIOCSIWMLME */
7807 static int ipw2100_wx_set_mlme(struct net_device *dev,
7808 struct iw_request_info *info,
7809 union iwreq_data *wrqu, char *extra)
7810 {
7811 struct ipw2100_priv *priv = libipw_priv(dev);
7812 struct iw_mlme *mlme = (struct iw_mlme *)extra;
7813 __le16 reason;
7814
7815 reason = cpu_to_le16(mlme->reason_code);
7816
7817 switch (mlme->cmd) {
7818 case IW_MLME_DEAUTH:
7819 // silently ignore
7820 break;
7821
7822 case IW_MLME_DISASSOC:
7823 ipw2100_disassociate_bssid(priv);
7824 break;
7825
7826 default:
7827 return -EOPNOTSUPP;
7828 }
7829 return 0;
7830 }
7831
7832 /*
7833 *
7834 * IWPRIV handlers
7835 *
7836 */
7837 #ifdef CONFIG_IPW2100_MONITOR
7838 static int ipw2100_wx_set_promisc(struct net_device *dev,
7839 struct iw_request_info *info,
7840 union iwreq_data *wrqu, char *extra)
7841 {
7842 struct ipw2100_priv *priv = libipw_priv(dev);
7843 int *parms = (int *)extra;
7844 int enable = (parms[0] > 0);
7845 int err = 0;
7846
7847 mutex_lock(&priv->action_mutex);
7848 if (!(priv->status & STATUS_INITIALIZED)) {
7849 err = -EIO;
7850 goto done;
7851 }
7852
7853 if (enable) {
7854 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
7855 err = ipw2100_set_channel(priv, parms[1], 0);
7856 goto done;
7857 }
7858 priv->channel = parms[1];
7859 err = ipw2100_switch_mode(priv, IW_MODE_MONITOR);
7860 } else {
7861 if (priv->ieee->iw_mode == IW_MODE_MONITOR)
7862 err = ipw2100_switch_mode(priv, priv->last_mode);
7863 }
7864 done:
7865 mutex_unlock(&priv->action_mutex);
7866 return err;
7867 }
7868
7869 static int ipw2100_wx_reset(struct net_device *dev,
7870 struct iw_request_info *info,
7871 union iwreq_data *wrqu, char *extra)
7872 {
7873 struct ipw2100_priv *priv = libipw_priv(dev);
7874 if (priv->status & STATUS_INITIALIZED)
7875 schedule_reset(priv);
7876 return 0;
7877 }
7878
7879 #endif
7880
7881 static int ipw2100_wx_set_powermode(struct net_device *dev,
7882 struct iw_request_info *info,
7883 union iwreq_data *wrqu, char *extra)
7884 {
7885 struct ipw2100_priv *priv = libipw_priv(dev);
7886 int err = 0, mode = *(int *)extra;
7887
7888 mutex_lock(&priv->action_mutex);
7889 if (!(priv->status & STATUS_INITIALIZED)) {
7890 err = -EIO;
7891 goto done;
7892 }
7893
7894 if ((mode < 0) || (mode > POWER_MODES))
7895 mode = IPW_POWER_AUTO;
7896
7897 if (IPW_POWER_LEVEL(priv->power_mode) != mode)
7898 err = ipw2100_set_power_mode(priv, mode);
7899 done:
7900 mutex_unlock(&priv->action_mutex);
7901 return err;
7902 }
7903
7904 #define MAX_POWER_STRING 80
7905 static int ipw2100_wx_get_powermode(struct net_device *dev,
7906 struct iw_request_info *info,
7907 union iwreq_data *wrqu, char *extra)
7908 {
7909 /*
7910 * This can be called at any time. No action lock required
7911 */
7912
7913 struct ipw2100_priv *priv = libipw_priv(dev);
7914 int level = IPW_POWER_LEVEL(priv->power_mode);
7915 s32 timeout, period;
7916
7917 if (!(priv->power_mode & IPW_POWER_ENABLED)) {
7918 snprintf(extra, MAX_POWER_STRING,
7919 "Power save level: %d (Off)", level);
7920 } else {
7921 switch (level) {
7922 case IPW_POWER_MODE_CAM:
7923 snprintf(extra, MAX_POWER_STRING,
7924 "Power save level: %d (None)", level);
7925 break;
7926 case IPW_POWER_AUTO:
7927 snprintf(extra, MAX_POWER_STRING,
7928 "Power save level: %d (Auto)", level);
7929 break;
7930 default:
7931 timeout = timeout_duration[level - 1] / 1000;
7932 period = period_duration[level - 1] / 1000;
7933 snprintf(extra, MAX_POWER_STRING,
7934 "Power save level: %d "
7935 "(Timeout %dms, Period %dms)",
7936 level, timeout, period);
7937 }
7938 }
7939
7940 wrqu->data.length = strlen(extra) + 1;
7941
7942 return 0;
7943 }
7944
7945 static int ipw2100_wx_set_preamble(struct net_device *dev,
7946 struct iw_request_info *info,
7947 union iwreq_data *wrqu, char *extra)
7948 {
7949 struct ipw2100_priv *priv = libipw_priv(dev);
7950 int err, mode = *(int *)extra;
7951
7952 mutex_lock(&priv->action_mutex);
7953 if (!(priv->status & STATUS_INITIALIZED)) {
7954 err = -EIO;
7955 goto done;
7956 }
7957
7958 if (mode == 1)
7959 priv->config |= CFG_LONG_PREAMBLE;
7960 else if (mode == 0)
7961 priv->config &= ~CFG_LONG_PREAMBLE;
7962 else {
7963 err = -EINVAL;
7964 goto done;
7965 }
7966
7967 err = ipw2100_system_config(priv, 0);
7968
7969 done:
7970 mutex_unlock(&priv->action_mutex);
7971 return err;
7972 }
7973
7974 static int ipw2100_wx_get_preamble(struct net_device *dev,
7975 struct iw_request_info *info,
7976 union iwreq_data *wrqu, char *extra)
7977 {
7978 /*
7979 * This can be called at any time. No action lock required
7980 */
7981
7982 struct ipw2100_priv *priv = libipw_priv(dev);
7983
7984 if (priv->config & CFG_LONG_PREAMBLE)
7985 snprintf(wrqu->name, IFNAMSIZ, "long (1)");
7986 else
7987 snprintf(wrqu->name, IFNAMSIZ, "auto (0)");
7988
7989 return 0;
7990 }
7991
7992 #ifdef CONFIG_IPW2100_MONITOR
7993 static int ipw2100_wx_set_crc_check(struct net_device *dev,
7994 struct iw_request_info *info,
7995 union iwreq_data *wrqu, char *extra)
7996 {
7997 struct ipw2100_priv *priv = libipw_priv(dev);
7998 int err, mode = *(int *)extra;
7999
8000 mutex_lock(&priv->action_mutex);
8001 if (!(priv->status & STATUS_INITIALIZED)) {
8002 err = -EIO;
8003 goto done;
8004 }
8005
8006 if (mode == 1)
8007 priv->config |= CFG_CRC_CHECK;
8008 else if (mode == 0)
8009 priv->config &= ~CFG_CRC_CHECK;
8010 else {
8011 err = -EINVAL;
8012 goto done;
8013 }
8014 err = 0;
8015
8016 done:
8017 mutex_unlock(&priv->action_mutex);
8018 return err;
8019 }
8020
8021 static int ipw2100_wx_get_crc_check(struct net_device *dev,
8022 struct iw_request_info *info,
8023 union iwreq_data *wrqu, char *extra)
8024 {
8025 /*
8026 * This can be called at any time. No action lock required
8027 */
8028
8029 struct ipw2100_priv *priv = libipw_priv(dev);
8030
8031 if (priv->config & CFG_CRC_CHECK)
8032 snprintf(wrqu->name, IFNAMSIZ, "CRC checked (1)");
8033 else
8034 snprintf(wrqu->name, IFNAMSIZ, "CRC ignored (0)");
8035
8036 return 0;
8037 }
8038 #endif /* CONFIG_IPW2100_MONITOR */
8039
8040 static iw_handler ipw2100_wx_handlers[] = {
8041 IW_HANDLER(SIOCGIWNAME, ipw2100_wx_get_name),
8042 IW_HANDLER(SIOCSIWFREQ, ipw2100_wx_set_freq),
8043 IW_HANDLER(SIOCGIWFREQ, ipw2100_wx_get_freq),
8044 IW_HANDLER(SIOCSIWMODE, ipw2100_wx_set_mode),
8045 IW_HANDLER(SIOCGIWMODE, ipw2100_wx_get_mode),
8046 IW_HANDLER(SIOCGIWRANGE, ipw2100_wx_get_range),
8047 IW_HANDLER(SIOCSIWAP, ipw2100_wx_set_wap),
8048 IW_HANDLER(SIOCGIWAP, ipw2100_wx_get_wap),
8049 IW_HANDLER(SIOCSIWMLME, ipw2100_wx_set_mlme),
8050 IW_HANDLER(SIOCSIWSCAN, ipw2100_wx_set_scan),
8051 IW_HANDLER(SIOCGIWSCAN, ipw2100_wx_get_scan),
8052 IW_HANDLER(SIOCSIWESSID, ipw2100_wx_set_essid),
8053 IW_HANDLER(SIOCGIWESSID, ipw2100_wx_get_essid),
8054 IW_HANDLER(SIOCSIWNICKN, ipw2100_wx_set_nick),
8055 IW_HANDLER(SIOCGIWNICKN, ipw2100_wx_get_nick),
8056 IW_HANDLER(SIOCSIWRATE, ipw2100_wx_set_rate),
8057 IW_HANDLER(SIOCGIWRATE, ipw2100_wx_get_rate),
8058 IW_HANDLER(SIOCSIWRTS, ipw2100_wx_set_rts),
8059 IW_HANDLER(SIOCGIWRTS, ipw2100_wx_get_rts),
8060 IW_HANDLER(SIOCSIWFRAG, ipw2100_wx_set_frag),
8061 IW_HANDLER(SIOCGIWFRAG, ipw2100_wx_get_frag),
8062 IW_HANDLER(SIOCSIWTXPOW, ipw2100_wx_set_txpow),
8063 IW_HANDLER(SIOCGIWTXPOW, ipw2100_wx_get_txpow),
8064 IW_HANDLER(SIOCSIWRETRY, ipw2100_wx_set_retry),
8065 IW_HANDLER(SIOCGIWRETRY, ipw2100_wx_get_retry),
8066 IW_HANDLER(SIOCSIWENCODE, ipw2100_wx_set_encode),
8067 IW_HANDLER(SIOCGIWENCODE, ipw2100_wx_get_encode),
8068 IW_HANDLER(SIOCSIWPOWER, ipw2100_wx_set_power),
8069 IW_HANDLER(SIOCGIWPOWER, ipw2100_wx_get_power),
8070 IW_HANDLER(SIOCSIWGENIE, ipw2100_wx_set_genie),
8071 IW_HANDLER(SIOCGIWGENIE, ipw2100_wx_get_genie),
8072 IW_HANDLER(SIOCSIWAUTH, ipw2100_wx_set_auth),
8073 IW_HANDLER(SIOCGIWAUTH, ipw2100_wx_get_auth),
8074 IW_HANDLER(SIOCSIWENCODEEXT, ipw2100_wx_set_encodeext),
8075 IW_HANDLER(SIOCGIWENCODEEXT, ipw2100_wx_get_encodeext),
8076 };
8077
8078 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
8079 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
8080 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
8081 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
8082 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
8083 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
8084 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
8085 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
8086
8087 static const struct iw_priv_args ipw2100_private_args[] = {
8088
8089 #ifdef CONFIG_IPW2100_MONITOR
8090 {
8091 IPW2100_PRIV_SET_MONITOR,
8092 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "monitor"},
8093 {
8094 IPW2100_PRIV_RESET,
8095 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, "reset"},
8096 #endif /* CONFIG_IPW2100_MONITOR */
8097
8098 {
8099 IPW2100_PRIV_SET_POWER,
8100 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_power"},
8101 {
8102 IPW2100_PRIV_GET_POWER,
8103 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | MAX_POWER_STRING,
8104 "get_power"},
8105 {
8106 IPW2100_PRIV_SET_LONGPREAMBLE,
8107 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_preamble"},
8108 {
8109 IPW2100_PRIV_GET_LONGPREAMBLE,
8110 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "get_preamble"},
8111 #ifdef CONFIG_IPW2100_MONITOR
8112 {
8113 IPW2100_PRIV_SET_CRC_CHECK,
8114 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_crc_check"},
8115 {
8116 IPW2100_PRIV_GET_CRC_CHECK,
8117 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "get_crc_check"},
8118 #endif /* CONFIG_IPW2100_MONITOR */
8119 };
8120
8121 static iw_handler ipw2100_private_handler[] = {
8122 #ifdef CONFIG_IPW2100_MONITOR
8123 ipw2100_wx_set_promisc,
8124 ipw2100_wx_reset,
8125 #else /* CONFIG_IPW2100_MONITOR */
8126 NULL,
8127 NULL,
8128 #endif /* CONFIG_IPW2100_MONITOR */
8129 ipw2100_wx_set_powermode,
8130 ipw2100_wx_get_powermode,
8131 ipw2100_wx_set_preamble,
8132 ipw2100_wx_get_preamble,
8133 #ifdef CONFIG_IPW2100_MONITOR
8134 ipw2100_wx_set_crc_check,
8135 ipw2100_wx_get_crc_check,
8136 #else /* CONFIG_IPW2100_MONITOR */
8137 NULL,
8138 NULL,
8139 #endif /* CONFIG_IPW2100_MONITOR */
8140 };
8141
8142 /*
8143 * Get wireless statistics.
8144 * Called by /proc/net/wireless
8145 * Also called by SIOCGIWSTATS
8146 */
8147 static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev)
8148 {
8149 enum {
8150 POOR = 30,
8151 FAIR = 60,
8152 GOOD = 80,
8153 VERY_GOOD = 90,
8154 EXCELLENT = 95,
8155 PERFECT = 100
8156 };
8157 int rssi_qual;
8158 int tx_qual;
8159 int beacon_qual;
8160 int quality;
8161
8162 struct ipw2100_priv *priv = libipw_priv(dev);
8163 struct iw_statistics *wstats;
8164 u32 rssi, tx_retries, missed_beacons, tx_failures;
8165 u32 ord_len = sizeof(u32);
8166
8167 if (!priv)
8168 return (struct iw_statistics *)NULL;
8169
8170 wstats = &priv->wstats;
8171
8172 /* if hw is disabled, then ipw2100_get_ordinal() can't be called.
8173 * ipw2100_wx_wireless_stats seems to be called before fw is
8174 * initialized. STATUS_ASSOCIATED will only be set if the hw is up
8175 * and associated; if not associcated, the values are all meaningless
8176 * anyway, so set them all to NULL and INVALID */
8177 if (!(priv->status & STATUS_ASSOCIATED)) {
8178 wstats->miss.beacon = 0;
8179 wstats->discard.retries = 0;
8180 wstats->qual.qual = 0;
8181 wstats->qual.level = 0;
8182 wstats->qual.noise = 0;
8183 wstats->qual.updated = 7;
8184 wstats->qual.updated |= IW_QUAL_NOISE_INVALID |
8185 IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_INVALID;
8186 return wstats;
8187 }
8188
8189 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_PERCENT_MISSED_BCNS,
8190 &missed_beacons, &ord_len))
8191 goto fail_get_ordinal;
8192
8193 /* If we don't have a connection the quality and level is 0 */
8194 if (!(priv->status & STATUS_ASSOCIATED)) {
8195 wstats->qual.qual = 0;
8196 wstats->qual.level = 0;
8197 } else {
8198 if (ipw2100_get_ordinal(priv, IPW_ORD_RSSI_AVG_CURR,
8199 &rssi, &ord_len))
8200 goto fail_get_ordinal;
8201 wstats->qual.level = rssi + IPW2100_RSSI_TO_DBM;
8202 if (rssi < 10)
8203 rssi_qual = rssi * POOR / 10;
8204 else if (rssi < 15)
8205 rssi_qual = (rssi - 10) * (FAIR - POOR) / 5 + POOR;
8206 else if (rssi < 20)
8207 rssi_qual = (rssi - 15) * (GOOD - FAIR) / 5 + FAIR;
8208 else if (rssi < 30)
8209 rssi_qual = (rssi - 20) * (VERY_GOOD - GOOD) /
8210 10 + GOOD;
8211 else
8212 rssi_qual = (rssi - 30) * (PERFECT - VERY_GOOD) /
8213 10 + VERY_GOOD;
8214
8215 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_PERCENT_RETRIES,
8216 &tx_retries, &ord_len))
8217 goto fail_get_ordinal;
8218
8219 if (tx_retries > 75)
8220 tx_qual = (90 - tx_retries) * POOR / 15;
8221 else if (tx_retries > 70)
8222 tx_qual = (75 - tx_retries) * (FAIR - POOR) / 5 + POOR;
8223 else if (tx_retries > 65)
8224 tx_qual = (70 - tx_retries) * (GOOD - FAIR) / 5 + FAIR;
8225 else if (tx_retries > 50)
8226 tx_qual = (65 - tx_retries) * (VERY_GOOD - GOOD) /
8227 15 + GOOD;
8228 else
8229 tx_qual = (50 - tx_retries) *
8230 (PERFECT - VERY_GOOD) / 50 + VERY_GOOD;
8231
8232 if (missed_beacons > 50)
8233 beacon_qual = (60 - missed_beacons) * POOR / 10;
8234 else if (missed_beacons > 40)
8235 beacon_qual = (50 - missed_beacons) * (FAIR - POOR) /
8236 10 + POOR;
8237 else if (missed_beacons > 32)
8238 beacon_qual = (40 - missed_beacons) * (GOOD - FAIR) /
8239 18 + FAIR;
8240 else if (missed_beacons > 20)
8241 beacon_qual = (32 - missed_beacons) *
8242 (VERY_GOOD - GOOD) / 20 + GOOD;
8243 else
8244 beacon_qual = (20 - missed_beacons) *
8245 (PERFECT - VERY_GOOD) / 20 + VERY_GOOD;
8246
8247 quality = min(tx_qual, rssi_qual);
8248 quality = min(beacon_qual, quality);
8249
8250 #ifdef CONFIG_IPW2100_DEBUG
8251 if (beacon_qual == quality)
8252 IPW_DEBUG_WX("Quality clamped by Missed Beacons\n");
8253 else if (tx_qual == quality)
8254 IPW_DEBUG_WX("Quality clamped by Tx Retries\n");
8255 else if (quality != 100)
8256 IPW_DEBUG_WX("Quality clamped by Signal Strength\n");
8257 else
8258 IPW_DEBUG_WX("Quality not clamped.\n");
8259 #endif
8260
8261 wstats->qual.qual = quality;
8262 wstats->qual.level = rssi + IPW2100_RSSI_TO_DBM;
8263 }
8264
8265 wstats->qual.noise = 0;
8266 wstats->qual.updated = 7;
8267 wstats->qual.updated |= IW_QUAL_NOISE_INVALID;
8268
8269 /* FIXME: this is percent and not a # */
8270 wstats->miss.beacon = missed_beacons;
8271
8272 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_TX_FAILURES,
8273 &tx_failures, &ord_len))
8274 goto fail_get_ordinal;
8275 wstats->discard.retries = tx_failures;
8276
8277 return wstats;
8278
8279 fail_get_ordinal:
8280 IPW_DEBUG_WX("failed querying ordinals.\n");
8281
8282 return (struct iw_statistics *)NULL;
8283 }
8284
8285 static struct iw_handler_def ipw2100_wx_handler_def = {
8286 .standard = ipw2100_wx_handlers,
8287 .num_standard = ARRAY_SIZE(ipw2100_wx_handlers),
8288 .num_private = ARRAY_SIZE(ipw2100_private_handler),
8289 .num_private_args = ARRAY_SIZE(ipw2100_private_args),
8290 .private = (iw_handler *) ipw2100_private_handler,
8291 .private_args = (struct iw_priv_args *)ipw2100_private_args,
8292 .get_wireless_stats = ipw2100_wx_wireless_stats,
8293 };
8294
8295 static void ipw2100_wx_event_work(struct work_struct *work)
8296 {
8297 struct ipw2100_priv *priv =
8298 container_of(work, struct ipw2100_priv, wx_event_work.work);
8299 union iwreq_data wrqu;
8300 unsigned int len = ETH_ALEN;
8301
8302 if (priv->status & STATUS_STOPPING)
8303 return;
8304
8305 mutex_lock(&priv->action_mutex);
8306
8307 IPW_DEBUG_WX("enter\n");
8308
8309 mutex_unlock(&priv->action_mutex);
8310
8311 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
8312
8313 /* Fetch BSSID from the hardware */
8314 if (!(priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) ||
8315 priv->status & STATUS_RF_KILL_MASK ||
8316 ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID,
8317 &priv->bssid, &len)) {
8318 memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
8319 } else {
8320 /* We now have the BSSID, so can finish setting to the full
8321 * associated state */
8322 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN);
8323 memcpy(priv->ieee->bssid, priv->bssid, ETH_ALEN);
8324 priv->status &= ~STATUS_ASSOCIATING;
8325 priv->status |= STATUS_ASSOCIATED;
8326 netif_carrier_on(priv->net_dev);
8327 netif_wake_queue(priv->net_dev);
8328 }
8329
8330 if (!(priv->status & STATUS_ASSOCIATED)) {
8331 IPW_DEBUG_WX("Configuring ESSID\n");
8332 mutex_lock(&priv->action_mutex);
8333 /* This is a disassociation event, so kick the firmware to
8334 * look for another AP */
8335 if (priv->config & CFG_STATIC_ESSID)
8336 ipw2100_set_essid(priv, priv->essid, priv->essid_len,
8337 0);
8338 else
8339 ipw2100_set_essid(priv, NULL, 0, 0);
8340 mutex_unlock(&priv->action_mutex);
8341 }
8342
8343 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
8344 }
8345
8346 #define IPW2100_FW_MAJOR_VERSION 1
8347 #define IPW2100_FW_MINOR_VERSION 3
8348
8349 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
8350 #define IPW2100_FW_MAJOR(x) (x & 0xff)
8351
8352 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
8353 IPW2100_FW_MAJOR_VERSION)
8354
8355 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
8356 "." __stringify(IPW2100_FW_MINOR_VERSION)
8357
8358 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
8359
8360 /*
8361
8362 BINARY FIRMWARE HEADER FORMAT
8363
8364 offset length desc
8365 0 2 version
8366 2 2 mode == 0:BSS,1:IBSS,2:MONITOR
8367 4 4 fw_len
8368 8 4 uc_len
8369 C fw_len firmware data
8370 12 + fw_len uc_len microcode data
8371
8372 */
8373
8374 struct ipw2100_fw_header {
8375 short version;
8376 short mode;
8377 unsigned int fw_size;
8378 unsigned int uc_size;
8379 } __packed;
8380
8381 static int ipw2100_mod_firmware_load(struct ipw2100_fw *fw)
8382 {
8383 struct ipw2100_fw_header *h =
8384 (struct ipw2100_fw_header *)fw->fw_entry->data;
8385
8386 if (IPW2100_FW_MAJOR(h->version) != IPW2100_FW_MAJOR_VERSION) {
8387 printk(KERN_WARNING DRV_NAME ": Firmware image not compatible "
8388 "(detected version id of %u). "
8389 "See Documentation/networking/README.ipw2100\n",
8390 h->version);
8391 return 1;
8392 }
8393
8394 fw->version = h->version;
8395 fw->fw.data = fw->fw_entry->data + sizeof(struct ipw2100_fw_header);
8396 fw->fw.size = h->fw_size;
8397 fw->uc.data = fw->fw.data + h->fw_size;
8398 fw->uc.size = h->uc_size;
8399
8400 return 0;
8401 }
8402
8403 static int ipw2100_get_firmware(struct ipw2100_priv *priv,
8404 struct ipw2100_fw *fw)
8405 {
8406 char *fw_name;
8407 int rc;
8408
8409 IPW_DEBUG_INFO("%s: Using hotplug firmware load.\n",
8410 priv->net_dev->name);
8411
8412 switch (priv->ieee->iw_mode) {
8413 case IW_MODE_ADHOC:
8414 fw_name = IPW2100_FW_NAME("-i");
8415 break;
8416 #ifdef CONFIG_IPW2100_MONITOR
8417 case IW_MODE_MONITOR:
8418 fw_name = IPW2100_FW_NAME("-p");
8419 break;
8420 #endif
8421 case IW_MODE_INFRA:
8422 default:
8423 fw_name = IPW2100_FW_NAME("");
8424 break;
8425 }
8426
8427 rc = request_firmware(&fw->fw_entry, fw_name, &priv->pci_dev->dev);
8428
8429 if (rc < 0) {
8430 printk(KERN_ERR DRV_NAME ": "
8431 "%s: Firmware '%s' not available or load failed.\n",
8432 priv->net_dev->name, fw_name);
8433 return rc;
8434 }
8435 IPW_DEBUG_INFO("firmware data %p size %zd\n", fw->fw_entry->data,
8436 fw->fw_entry->size);
8437
8438 ipw2100_mod_firmware_load(fw);
8439
8440 return 0;
8441 }
8442
8443 MODULE_FIRMWARE(IPW2100_FW_NAME("-i"));
8444 #ifdef CONFIG_IPW2100_MONITOR
8445 MODULE_FIRMWARE(IPW2100_FW_NAME("-p"));
8446 #endif
8447 MODULE_FIRMWARE(IPW2100_FW_NAME(""));
8448
8449 static void ipw2100_release_firmware(struct ipw2100_priv *priv,
8450 struct ipw2100_fw *fw)
8451 {
8452 fw->version = 0;
8453 release_firmware(fw->fw_entry);
8454 fw->fw_entry = NULL;
8455 }
8456
8457 static int ipw2100_get_fwversion(struct ipw2100_priv *priv, char *buf,
8458 size_t max)
8459 {
8460 char ver[MAX_FW_VERSION_LEN];
8461 u32 len = MAX_FW_VERSION_LEN;
8462 u32 tmp;
8463 int i;
8464 /* firmware version is an ascii string (max len of 14) */
8465 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_FW_VER_NUM, ver, &len))
8466 return -EIO;
8467 tmp = max;
8468 if (len >= max)
8469 len = max - 1;
8470 for (i = 0; i < len; i++)
8471 buf[i] = ver[i];
8472 buf[i] = '\0';
8473 return tmp;
8474 }
8475
8476 static int ipw2100_get_ucodeversion(struct ipw2100_priv *priv, char *buf,
8477 size_t max)
8478 {
8479 u32 ver;
8480 u32 len = sizeof(ver);
8481 /* microcode version is a 32 bit integer */
8482 if (ipw2100_get_ordinal(priv, IPW_ORD_UCODE_VERSION, &ver, &len))
8483 return -EIO;
8484 return snprintf(buf, max, "%08X", ver);
8485 }
8486
8487 /*
8488 * On exit, the firmware will have been freed from the fw list
8489 */
8490 static int ipw2100_fw_download(struct ipw2100_priv *priv, struct ipw2100_fw *fw)
8491 {
8492 /* firmware is constructed of N contiguous entries, each entry is
8493 * structured as:
8494 *
8495 * offset sie desc
8496 * 0 4 address to write to
8497 * 4 2 length of data run
8498 * 6 length data
8499 */
8500 unsigned int addr;
8501 unsigned short len;
8502
8503 const unsigned char *firmware_data = fw->fw.data;
8504 unsigned int firmware_data_left = fw->fw.size;
8505
8506 while (firmware_data_left > 0) {
8507 addr = *(u32 *) (firmware_data);
8508 firmware_data += 4;
8509 firmware_data_left -= 4;
8510
8511 len = *(u16 *) (firmware_data);
8512 firmware_data += 2;
8513 firmware_data_left -= 2;
8514
8515 if (len > 32) {
8516 printk(KERN_ERR DRV_NAME ": "
8517 "Invalid firmware run-length of %d bytes\n",
8518 len);
8519 return -EINVAL;
8520 }
8521
8522 write_nic_memory(priv->net_dev, addr, len, firmware_data);
8523 firmware_data += len;
8524 firmware_data_left -= len;
8525 }
8526
8527 return 0;
8528 }
8529
8530 struct symbol_alive_response {
8531 u8 cmd_id;
8532 u8 seq_num;
8533 u8 ucode_rev;
8534 u8 eeprom_valid;
8535 u16 valid_flags;
8536 u8 IEEE_addr[6];
8537 u16 flags;
8538 u16 pcb_rev;
8539 u16 clock_settle_time; // 1us LSB
8540 u16 powerup_settle_time; // 1us LSB
8541 u16 hop_settle_time; // 1us LSB
8542 u8 date[3]; // month, day, year
8543 u8 time[2]; // hours, minutes
8544 u8 ucode_valid;
8545 };
8546
8547 static int ipw2100_ucode_download(struct ipw2100_priv *priv,
8548 struct ipw2100_fw *fw)
8549 {
8550 struct net_device *dev = priv->net_dev;
8551 const unsigned char *microcode_data = fw->uc.data;
8552 unsigned int microcode_data_left = fw->uc.size;
8553 void __iomem *reg = priv->ioaddr;
8554
8555 struct symbol_alive_response response;
8556 int i, j;
8557 u8 data;
8558
8559 /* Symbol control */
8560 write_nic_word(dev, IPW2100_CONTROL_REG, 0x703);
8561 readl(reg);
8562 write_nic_word(dev, IPW2100_CONTROL_REG, 0x707);
8563 readl(reg);
8564
8565 /* HW config */
8566 write_nic_byte(dev, 0x210014, 0x72); /* fifo width =16 */
8567 readl(reg);
8568 write_nic_byte(dev, 0x210014, 0x72); /* fifo width =16 */
8569 readl(reg);
8570
8571 /* EN_CS_ACCESS bit to reset control store pointer */
8572 write_nic_byte(dev, 0x210000, 0x40);
8573 readl(reg);
8574 write_nic_byte(dev, 0x210000, 0x0);
8575 readl(reg);
8576 write_nic_byte(dev, 0x210000, 0x40);
8577 readl(reg);
8578
8579 /* copy microcode from buffer into Symbol */
8580
8581 while (microcode_data_left > 0) {
8582 write_nic_byte(dev, 0x210010, *microcode_data++);
8583 write_nic_byte(dev, 0x210010, *microcode_data++);
8584 microcode_data_left -= 2;
8585 }
8586
8587 /* EN_CS_ACCESS bit to reset the control store pointer */
8588 write_nic_byte(dev, 0x210000, 0x0);
8589 readl(reg);
8590
8591 /* Enable System (Reg 0)
8592 * first enable causes garbage in RX FIFO */
8593 write_nic_byte(dev, 0x210000, 0x0);
8594 readl(reg);
8595 write_nic_byte(dev, 0x210000, 0x80);
8596 readl(reg);
8597
8598 /* Reset External Baseband Reg */
8599 write_nic_word(dev, IPW2100_CONTROL_REG, 0x703);
8600 readl(reg);
8601 write_nic_word(dev, IPW2100_CONTROL_REG, 0x707);
8602 readl(reg);
8603
8604 /* HW Config (Reg 5) */
8605 write_nic_byte(dev, 0x210014, 0x72); // fifo width =16
8606 readl(reg);
8607 write_nic_byte(dev, 0x210014, 0x72); // fifo width =16
8608 readl(reg);
8609
8610 /* Enable System (Reg 0)
8611 * second enable should be OK */
8612 write_nic_byte(dev, 0x210000, 0x00); // clear enable system
8613 readl(reg);
8614 write_nic_byte(dev, 0x210000, 0x80); // set enable system
8615
8616 /* check Symbol is enabled - upped this from 5 as it wasn't always
8617 * catching the update */
8618 for (i = 0; i < 10; i++) {
8619 udelay(10);
8620
8621 /* check Dino is enabled bit */
8622 read_nic_byte(dev, 0x210000, &data);
8623 if (data & 0x1)
8624 break;
8625 }
8626
8627 if (i == 10) {
8628 printk(KERN_ERR DRV_NAME ": %s: Error initializing Symbol\n",
8629 dev->name);
8630 return -EIO;
8631 }
8632
8633 /* Get Symbol alive response */
8634 for (i = 0; i < 30; i++) {
8635 /* Read alive response structure */
8636 for (j = 0;
8637 j < (sizeof(struct symbol_alive_response) >> 1); j++)
8638 read_nic_word(dev, 0x210004, ((u16 *) & response) + j);
8639
8640 if ((response.cmd_id == 1) && (response.ucode_valid == 0x1))
8641 break;
8642 udelay(10);
8643 }
8644
8645 if (i == 30) {
8646 printk(KERN_ERR DRV_NAME
8647 ": %s: No response from Symbol - hw not alive\n",
8648 dev->name);
8649 printk_buf(IPW_DL_ERROR, (u8 *) & response, sizeof(response));
8650 return -EIO;
8651 }
8652
8653 return 0;
8654 }
8655
8656
8657
8658
8659
8660 /* LDV_COMMENT_BEGIN_MAIN */
8661 #ifdef LDV_MAIN0_sequence_infinite_withcheck_stateful
8662
8663 /*###########################################################################*/
8664
8665 /*############## Driver Environment Generator 0.2 output ####################*/
8666
8667 /*###########################################################################*/
8668
8669
8670
8671 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test if all kernel resources are correctly released by driver before driver will be unloaded. */
8672 void ldv_check_final_state(void);
8673
8674 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test correct return result. */
8675 void ldv_check_return_value(int res);
8676
8677 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test correct return result of probe() function. */
8678 void ldv_check_return_value_probe(int res);
8679
8680 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Initializes the model. */
8681 void ldv_initialize(void);
8682
8683 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Reinitializes the model between distinct model function calls. */
8684 void ldv_handler_precall(void);
8685
8686 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Returns arbitrary interger value. */
8687 int nondet_int(void);
8688
8689 /* LDV_COMMENT_VAR_DECLARE_LDV Special variable for LDV verifier. */
8690 int LDV_IN_INTERRUPT;
8691
8692 /* LDV_COMMENT_FUNCTION_MAIN Main function for LDV verifier. */
8693 void ldv_main0_sequence_infinite_withcheck_stateful(void) {
8694
8695
8696
8697 /* LDV_COMMENT_BEGIN_VARIABLE_DECLARATION_PART */
8698 /*============================= VARIABLE DECLARATION PART =============================*/
8699 /** STRUCT: struct type: ethtool_ops, struct name: ipw2100_ethtool_ops **/
8700 /* content: static u32 ipw2100_ethtool_get_link(struct net_device *dev)*/
8701 /* LDV_COMMENT_BEGIN_PREP */
8702 #define IPW2100_VERSION "git-1.2.2"
8703 #define DRV_NAME "ipw2100"
8704 #define DRV_VERSION IPW2100_VERSION
8705 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
8706 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
8707 #ifdef CONFIG_IPW2100_DEBUG
8708 #define IPW2100_RX_DEBUG
8709 #endif
8710 #ifdef CONFIG_PM
8711 #endif
8712 #ifdef CONFIG_IPW2100_DEBUG
8713 #define IPW_DEBUG(level, message...) \
8714 do { \
8715 if (ipw2100_debug_level & (level)) { \
8716 printk(KERN_DEBUG "ipw2100: %c %s ", \
8717 in_interrupt() ? 'I' : 'U', __func__); \
8718 printk(message); \
8719 } \
8720 } while (0)
8721 #else
8722 #define IPW_DEBUG(level, message...) do {} while (0)
8723 #endif
8724 #ifdef CONFIG_IPW2100_DEBUG
8725 #endif
8726 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
8727 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
8728 #define MAX_RESET_BACKOFF 10
8729 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
8730 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
8731 #ifndef CONFIG_PM
8732 #endif
8733 #ifdef CONFIG_PM
8734 #else
8735 #endif
8736 #ifndef CONFIG_PM
8737 #endif
8738 #define MAX_RF_KILL_CHECKS 5
8739 #define RF_KILL_CHECK_DELAY 40
8740 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
8741 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
8742 #define MAC_ASSOCIATION_READ_DELAY (HZ)
8743 #ifdef CONFIG_IPW2100_DEBUG
8744 #define IPW2100_HANDLER(v, f) { v, f, # v }
8745 #else
8746 #define IPW2100_HANDLER(v, f) { v, f }
8747 #endif
8748 #ifdef CONFIG_IPW2100_DEBUG
8749 #endif
8750 #ifdef CONFIG_IPW2100_DEBUG
8751 #endif
8752 #define SEARCH_ERROR 0xffffffff
8753 #define SEARCH_FAIL 0xfffffffe
8754 #define SEARCH_SUCCESS 0xfffffff0
8755 #define SEARCH_DISCARD 0
8756 #define SEARCH_SNAPSHOT 1
8757 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
8758 #ifdef IPW2100_DEBUG_C3
8759 #endif
8760 #ifdef IPW2100_RX_DEBUG
8761 #endif
8762 #ifdef IPW2100_DEBUG_C3
8763 #endif
8764 #ifdef IPW2100_DEBUG_C3
8765 #endif
8766 #ifdef IPW2100_RX_DEBUG
8767 #endif
8768 #ifdef IPW2100_RX_DEBUG
8769 #endif
8770 #ifdef CONFIG_IPW2100_MONITOR
8771 #endif
8772 #ifdef CONFIG_IPW2100_MONITOR
8773 #else
8774 #endif
8775 #ifdef CONFIG_IPW2100_MONITOR
8776 #endif
8777 #ifdef CONFIG_IPW2100_DEBUG
8778 #endif
8779 #ifdef CONFIG_IPW2100_DEBUG
8780 #endif
8781 #ifdef CONFIG_IPW2100_DEBUG
8782 #endif
8783 #define IPW2100_REG(x) { IPW_ ##x, #x }
8784 #define IPW2100_NIC(x, s) { x, #x, s }
8785 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
8786 #ifdef CONFIG_IPW2100_DEBUG
8787 #endif
8788 #ifdef CONFIG_IPW2100_MONITOR
8789 #endif
8790 #ifdef CONFIG_PM
8791 #endif
8792 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
8793 #ifdef CONFIG_IPW2100_DEBUG
8794 #endif
8795 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
8796 #endif
8797 #ifdef IPW2100_TX_POWER
8798 #endif
8799 #if 0
8800 #endif
8801 #ifdef CONFIG_IPW2100_DEBUG
8802 #endif
8803 #define IPW_PRIVACY_CAPABLE 0x0008
8804 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
8805 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
8806 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
8807 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
8808 #ifdef CONFIG_IPW2100_MONITOR
8809 #endif
8810 #ifdef CONFIG_IPW2100_MONITOR
8811 #endif
8812 /* LDV_COMMENT_END_PREP */
8813 /* LDV_COMMENT_VAR_DECLARE Variable declaration for function "ipw2100_ethtool_get_link" */
8814 struct net_device * var_group1;
8815 /* LDV_COMMENT_BEGIN_PREP */
8816 #ifdef CONFIG_IPW2100_MONITOR
8817 #endif
8818 #ifdef CONFIG_IPW2100_MONITOR
8819 #endif
8820 #ifdef CONFIG_PM
8821 #endif
8822 #ifdef CONFIG_PM
8823 #endif
8824 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
8825 #ifdef CONFIG_PM
8826 #endif
8827 #ifdef CONFIG_IPW2100_DEBUG
8828 #endif
8829 #ifdef CONFIG_IPW2100_DEBUG
8830 #endif
8831 #ifdef CONFIG_IPW2100_MONITOR
8832 #endif
8833 #define POWER_MODES 5
8834 #ifdef CONFIG_IPW2100_MONITOR
8835 #endif
8836 #define MAX_POWER_STRING 80
8837 #ifdef CONFIG_IPW2100_MONITOR
8838 #endif
8839 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
8840 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
8841 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
8842 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
8843 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
8844 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
8845 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
8846 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
8847 #ifdef CONFIG_IPW2100_MONITOR
8848 #endif
8849 #ifdef CONFIG_IPW2100_MONITOR
8850 #endif
8851 #ifdef CONFIG_IPW2100_MONITOR
8852 #else
8853 #endif
8854 #ifdef CONFIG_IPW2100_MONITOR
8855 #else
8856 #endif
8857 #ifdef CONFIG_IPW2100_DEBUG
8858 #endif
8859 #define IPW2100_FW_MAJOR_VERSION 1
8860 #define IPW2100_FW_MINOR_VERSION 3
8861 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
8862 #define IPW2100_FW_MAJOR(x) (x & 0xff)
8863 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
8864 IPW2100_FW_MAJOR_VERSION)
8865 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
8866 "." __stringify(IPW2100_FW_MINOR_VERSION)
8867 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
8868 #ifdef CONFIG_IPW2100_MONITOR
8869 #endif
8870 #ifdef CONFIG_IPW2100_MONITOR
8871 #endif
8872 /* LDV_COMMENT_END_PREP */
8873 /* content: static void ipw_ethtool_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)*/
8874 /* LDV_COMMENT_BEGIN_PREP */
8875 #define IPW2100_VERSION "git-1.2.2"
8876 #define DRV_NAME "ipw2100"
8877 #define DRV_VERSION IPW2100_VERSION
8878 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
8879 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
8880 #ifdef CONFIG_IPW2100_DEBUG
8881 #define IPW2100_RX_DEBUG
8882 #endif
8883 #ifdef CONFIG_PM
8884 #endif
8885 #ifdef CONFIG_IPW2100_DEBUG
8886 #define IPW_DEBUG(level, message...) \
8887 do { \
8888 if (ipw2100_debug_level & (level)) { \
8889 printk(KERN_DEBUG "ipw2100: %c %s ", \
8890 in_interrupt() ? 'I' : 'U', __func__); \
8891 printk(message); \
8892 } \
8893 } while (0)
8894 #else
8895 #define IPW_DEBUG(level, message...) do {} while (0)
8896 #endif
8897 #ifdef CONFIG_IPW2100_DEBUG
8898 #endif
8899 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
8900 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
8901 #define MAX_RESET_BACKOFF 10
8902 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
8903 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
8904 #ifndef CONFIG_PM
8905 #endif
8906 #ifdef CONFIG_PM
8907 #else
8908 #endif
8909 #ifndef CONFIG_PM
8910 #endif
8911 #define MAX_RF_KILL_CHECKS 5
8912 #define RF_KILL_CHECK_DELAY 40
8913 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
8914 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
8915 #define MAC_ASSOCIATION_READ_DELAY (HZ)
8916 #ifdef CONFIG_IPW2100_DEBUG
8917 #define IPW2100_HANDLER(v, f) { v, f, # v }
8918 #else
8919 #define IPW2100_HANDLER(v, f) { v, f }
8920 #endif
8921 #ifdef CONFIG_IPW2100_DEBUG
8922 #endif
8923 #ifdef CONFIG_IPW2100_DEBUG
8924 #endif
8925 #define SEARCH_ERROR 0xffffffff
8926 #define SEARCH_FAIL 0xfffffffe
8927 #define SEARCH_SUCCESS 0xfffffff0
8928 #define SEARCH_DISCARD 0
8929 #define SEARCH_SNAPSHOT 1
8930 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
8931 #ifdef IPW2100_DEBUG_C3
8932 #endif
8933 #ifdef IPW2100_RX_DEBUG
8934 #endif
8935 #ifdef IPW2100_DEBUG_C3
8936 #endif
8937 #ifdef IPW2100_DEBUG_C3
8938 #endif
8939 #ifdef IPW2100_RX_DEBUG
8940 #endif
8941 #ifdef IPW2100_RX_DEBUG
8942 #endif
8943 #ifdef CONFIG_IPW2100_MONITOR
8944 #endif
8945 #ifdef CONFIG_IPW2100_MONITOR
8946 #else
8947 #endif
8948 #ifdef CONFIG_IPW2100_MONITOR
8949 #endif
8950 #ifdef CONFIG_IPW2100_DEBUG
8951 #endif
8952 #ifdef CONFIG_IPW2100_DEBUG
8953 #endif
8954 #ifdef CONFIG_IPW2100_DEBUG
8955 #endif
8956 #define IPW2100_REG(x) { IPW_ ##x, #x }
8957 #define IPW2100_NIC(x, s) { x, #x, s }
8958 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
8959 #ifdef CONFIG_IPW2100_DEBUG
8960 #endif
8961 #ifdef CONFIG_IPW2100_MONITOR
8962 #endif
8963 #ifdef CONFIG_PM
8964 #endif
8965 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
8966 #ifdef CONFIG_IPW2100_DEBUG
8967 #endif
8968 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
8969 #endif
8970 #ifdef IPW2100_TX_POWER
8971 #endif
8972 #if 0
8973 #endif
8974 #ifdef CONFIG_IPW2100_DEBUG
8975 #endif
8976 #define IPW_PRIVACY_CAPABLE 0x0008
8977 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
8978 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
8979 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
8980 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
8981 #ifdef CONFIG_IPW2100_MONITOR
8982 #endif
8983 #ifdef CONFIG_IPW2100_MONITOR
8984 #endif
8985 /* LDV_COMMENT_END_PREP */
8986 /* LDV_COMMENT_VAR_DECLARE Variable declaration for function "ipw_ethtool_get_drvinfo" */
8987 struct ethtool_drvinfo * var_group2;
8988 /* LDV_COMMENT_BEGIN_PREP */
8989 #ifdef CONFIG_IPW2100_MONITOR
8990 #endif
8991 #ifdef CONFIG_IPW2100_MONITOR
8992 #endif
8993 #ifdef CONFIG_PM
8994 #endif
8995 #ifdef CONFIG_PM
8996 #endif
8997 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
8998 #ifdef CONFIG_PM
8999 #endif
9000 #ifdef CONFIG_IPW2100_DEBUG
9001 #endif
9002 #ifdef CONFIG_IPW2100_DEBUG
9003 #endif
9004 #ifdef CONFIG_IPW2100_MONITOR
9005 #endif
9006 #define POWER_MODES 5
9007 #ifdef CONFIG_IPW2100_MONITOR
9008 #endif
9009 #define MAX_POWER_STRING 80
9010 #ifdef CONFIG_IPW2100_MONITOR
9011 #endif
9012 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
9013 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
9014 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
9015 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
9016 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
9017 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
9018 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
9019 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
9020 #ifdef CONFIG_IPW2100_MONITOR
9021 #endif
9022 #ifdef CONFIG_IPW2100_MONITOR
9023 #endif
9024 #ifdef CONFIG_IPW2100_MONITOR
9025 #else
9026 #endif
9027 #ifdef CONFIG_IPW2100_MONITOR
9028 #else
9029 #endif
9030 #ifdef CONFIG_IPW2100_DEBUG
9031 #endif
9032 #define IPW2100_FW_MAJOR_VERSION 1
9033 #define IPW2100_FW_MINOR_VERSION 3
9034 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
9035 #define IPW2100_FW_MAJOR(x) (x & 0xff)
9036 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
9037 IPW2100_FW_MAJOR_VERSION)
9038 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
9039 "." __stringify(IPW2100_FW_MINOR_VERSION)
9040 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
9041 #ifdef CONFIG_IPW2100_MONITOR
9042 #endif
9043 #ifdef CONFIG_IPW2100_MONITOR
9044 #endif
9045 /* LDV_COMMENT_END_PREP */
9046
9047 /** STRUCT: struct type: net_device_ops, struct name: ipw2100_netdev_ops **/
9048 /* content: static int ipw2100_open(struct net_device *dev)*/
9049 /* LDV_COMMENT_BEGIN_PREP */
9050 #define IPW2100_VERSION "git-1.2.2"
9051 #define DRV_NAME "ipw2100"
9052 #define DRV_VERSION IPW2100_VERSION
9053 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
9054 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
9055 #ifdef CONFIG_IPW2100_DEBUG
9056 #define IPW2100_RX_DEBUG
9057 #endif
9058 #ifdef CONFIG_PM
9059 #endif
9060 #ifdef CONFIG_IPW2100_DEBUG
9061 #define IPW_DEBUG(level, message...) \
9062 do { \
9063 if (ipw2100_debug_level & (level)) { \
9064 printk(KERN_DEBUG "ipw2100: %c %s ", \
9065 in_interrupt() ? 'I' : 'U', __func__); \
9066 printk(message); \
9067 } \
9068 } while (0)
9069 #else
9070 #define IPW_DEBUG(level, message...) do {} while (0)
9071 #endif
9072 #ifdef CONFIG_IPW2100_DEBUG
9073 #endif
9074 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
9075 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
9076 #define MAX_RESET_BACKOFF 10
9077 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
9078 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
9079 #ifndef CONFIG_PM
9080 #endif
9081 #ifdef CONFIG_PM
9082 #else
9083 #endif
9084 #ifndef CONFIG_PM
9085 #endif
9086 #define MAX_RF_KILL_CHECKS 5
9087 #define RF_KILL_CHECK_DELAY 40
9088 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
9089 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
9090 #define MAC_ASSOCIATION_READ_DELAY (HZ)
9091 #ifdef CONFIG_IPW2100_DEBUG
9092 #define IPW2100_HANDLER(v, f) { v, f, # v }
9093 #else
9094 #define IPW2100_HANDLER(v, f) { v, f }
9095 #endif
9096 #ifdef CONFIG_IPW2100_DEBUG
9097 #endif
9098 #ifdef CONFIG_IPW2100_DEBUG
9099 #endif
9100 #define SEARCH_ERROR 0xffffffff
9101 #define SEARCH_FAIL 0xfffffffe
9102 #define SEARCH_SUCCESS 0xfffffff0
9103 #define SEARCH_DISCARD 0
9104 #define SEARCH_SNAPSHOT 1
9105 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
9106 #ifdef IPW2100_DEBUG_C3
9107 #endif
9108 #ifdef IPW2100_RX_DEBUG
9109 #endif
9110 #ifdef IPW2100_DEBUG_C3
9111 #endif
9112 #ifdef IPW2100_DEBUG_C3
9113 #endif
9114 #ifdef IPW2100_RX_DEBUG
9115 #endif
9116 #ifdef IPW2100_RX_DEBUG
9117 #endif
9118 #ifdef CONFIG_IPW2100_MONITOR
9119 #endif
9120 #ifdef CONFIG_IPW2100_MONITOR
9121 #else
9122 #endif
9123 #ifdef CONFIG_IPW2100_MONITOR
9124 #endif
9125 #ifdef CONFIG_IPW2100_DEBUG
9126 #endif
9127 #ifdef CONFIG_IPW2100_DEBUG
9128 #endif
9129 #ifdef CONFIG_IPW2100_DEBUG
9130 #endif
9131 #define IPW2100_REG(x) { IPW_ ##x, #x }
9132 #define IPW2100_NIC(x, s) { x, #x, s }
9133 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
9134 #ifdef CONFIG_IPW2100_DEBUG
9135 #endif
9136 #ifdef CONFIG_IPW2100_MONITOR
9137 #endif
9138 #ifdef CONFIG_PM
9139 #endif
9140 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
9141 #ifdef CONFIG_IPW2100_DEBUG
9142 #endif
9143 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
9144 #endif
9145 #ifdef IPW2100_TX_POWER
9146 #endif
9147 #if 0
9148 #endif
9149 #ifdef CONFIG_IPW2100_DEBUG
9150 #endif
9151 #define IPW_PRIVACY_CAPABLE 0x0008
9152 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
9153 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
9154 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
9155 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
9156 #ifdef CONFIG_IPW2100_MONITOR
9157 #endif
9158 /* LDV_COMMENT_END_PREP */
9159 /* LDV_COMMENT_VAR_DECLARE Variable declaration for test return result from function call "ipw2100_open" */
9160 static int res_ipw2100_open_136;
9161 /* LDV_COMMENT_BEGIN_PREP */
9162 #ifdef CONFIG_IPW2100_MONITOR
9163 #endif
9164 #ifdef CONFIG_IPW2100_MONITOR
9165 #endif
9166 #ifdef CONFIG_IPW2100_MONITOR
9167 #endif
9168 #ifdef CONFIG_PM
9169 #endif
9170 #ifdef CONFIG_PM
9171 #endif
9172 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
9173 #ifdef CONFIG_PM
9174 #endif
9175 #ifdef CONFIG_IPW2100_DEBUG
9176 #endif
9177 #ifdef CONFIG_IPW2100_DEBUG
9178 #endif
9179 #ifdef CONFIG_IPW2100_MONITOR
9180 #endif
9181 #define POWER_MODES 5
9182 #ifdef CONFIG_IPW2100_MONITOR
9183 #endif
9184 #define MAX_POWER_STRING 80
9185 #ifdef CONFIG_IPW2100_MONITOR
9186 #endif
9187 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
9188 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
9189 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
9190 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
9191 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
9192 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
9193 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
9194 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
9195 #ifdef CONFIG_IPW2100_MONITOR
9196 #endif
9197 #ifdef CONFIG_IPW2100_MONITOR
9198 #endif
9199 #ifdef CONFIG_IPW2100_MONITOR
9200 #else
9201 #endif
9202 #ifdef CONFIG_IPW2100_MONITOR
9203 #else
9204 #endif
9205 #ifdef CONFIG_IPW2100_DEBUG
9206 #endif
9207 #define IPW2100_FW_MAJOR_VERSION 1
9208 #define IPW2100_FW_MINOR_VERSION 3
9209 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
9210 #define IPW2100_FW_MAJOR(x) (x & 0xff)
9211 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
9212 IPW2100_FW_MAJOR_VERSION)
9213 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
9214 "." __stringify(IPW2100_FW_MINOR_VERSION)
9215 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
9216 #ifdef CONFIG_IPW2100_MONITOR
9217 #endif
9218 #ifdef CONFIG_IPW2100_MONITOR
9219 #endif
9220 /* LDV_COMMENT_END_PREP */
9221 /* content: static int ipw2100_close(struct net_device *dev)*/
9222 /* LDV_COMMENT_BEGIN_PREP */
9223 #define IPW2100_VERSION "git-1.2.2"
9224 #define DRV_NAME "ipw2100"
9225 #define DRV_VERSION IPW2100_VERSION
9226 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
9227 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
9228 #ifdef CONFIG_IPW2100_DEBUG
9229 #define IPW2100_RX_DEBUG
9230 #endif
9231 #ifdef CONFIG_PM
9232 #endif
9233 #ifdef CONFIG_IPW2100_DEBUG
9234 #define IPW_DEBUG(level, message...) \
9235 do { \
9236 if (ipw2100_debug_level & (level)) { \
9237 printk(KERN_DEBUG "ipw2100: %c %s ", \
9238 in_interrupt() ? 'I' : 'U', __func__); \
9239 printk(message); \
9240 } \
9241 } while (0)
9242 #else
9243 #define IPW_DEBUG(level, message...) do {} while (0)
9244 #endif
9245 #ifdef CONFIG_IPW2100_DEBUG
9246 #endif
9247 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
9248 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
9249 #define MAX_RESET_BACKOFF 10
9250 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
9251 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
9252 #ifndef CONFIG_PM
9253 #endif
9254 #ifdef CONFIG_PM
9255 #else
9256 #endif
9257 #ifndef CONFIG_PM
9258 #endif
9259 #define MAX_RF_KILL_CHECKS 5
9260 #define RF_KILL_CHECK_DELAY 40
9261 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
9262 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
9263 #define MAC_ASSOCIATION_READ_DELAY (HZ)
9264 #ifdef CONFIG_IPW2100_DEBUG
9265 #define IPW2100_HANDLER(v, f) { v, f, # v }
9266 #else
9267 #define IPW2100_HANDLER(v, f) { v, f }
9268 #endif
9269 #ifdef CONFIG_IPW2100_DEBUG
9270 #endif
9271 #ifdef CONFIG_IPW2100_DEBUG
9272 #endif
9273 #define SEARCH_ERROR 0xffffffff
9274 #define SEARCH_FAIL 0xfffffffe
9275 #define SEARCH_SUCCESS 0xfffffff0
9276 #define SEARCH_DISCARD 0
9277 #define SEARCH_SNAPSHOT 1
9278 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
9279 #ifdef IPW2100_DEBUG_C3
9280 #endif
9281 #ifdef IPW2100_RX_DEBUG
9282 #endif
9283 #ifdef IPW2100_DEBUG_C3
9284 #endif
9285 #ifdef IPW2100_DEBUG_C3
9286 #endif
9287 #ifdef IPW2100_RX_DEBUG
9288 #endif
9289 #ifdef IPW2100_RX_DEBUG
9290 #endif
9291 #ifdef CONFIG_IPW2100_MONITOR
9292 #endif
9293 #ifdef CONFIG_IPW2100_MONITOR
9294 #else
9295 #endif
9296 #ifdef CONFIG_IPW2100_MONITOR
9297 #endif
9298 #ifdef CONFIG_IPW2100_DEBUG
9299 #endif
9300 #ifdef CONFIG_IPW2100_DEBUG
9301 #endif
9302 #ifdef CONFIG_IPW2100_DEBUG
9303 #endif
9304 #define IPW2100_REG(x) { IPW_ ##x, #x }
9305 #define IPW2100_NIC(x, s) { x, #x, s }
9306 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
9307 #ifdef CONFIG_IPW2100_DEBUG
9308 #endif
9309 #ifdef CONFIG_IPW2100_MONITOR
9310 #endif
9311 #ifdef CONFIG_PM
9312 #endif
9313 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
9314 #ifdef CONFIG_IPW2100_DEBUG
9315 #endif
9316 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
9317 #endif
9318 #ifdef IPW2100_TX_POWER
9319 #endif
9320 #if 0
9321 #endif
9322 #ifdef CONFIG_IPW2100_DEBUG
9323 #endif
9324 #define IPW_PRIVACY_CAPABLE 0x0008
9325 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
9326 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
9327 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
9328 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
9329 #ifdef CONFIG_IPW2100_MONITOR
9330 #endif
9331 /* LDV_COMMENT_END_PREP */
9332 /* LDV_COMMENT_VAR_DECLARE Variable declaration for test return result from function call "ipw2100_close" */
9333 static int res_ipw2100_close_137;
9334 /* LDV_COMMENT_BEGIN_PREP */
9335 #ifdef CONFIG_IPW2100_MONITOR
9336 #endif
9337 #ifdef CONFIG_IPW2100_MONITOR
9338 #endif
9339 #ifdef CONFIG_IPW2100_MONITOR
9340 #endif
9341 #ifdef CONFIG_PM
9342 #endif
9343 #ifdef CONFIG_PM
9344 #endif
9345 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
9346 #ifdef CONFIG_PM
9347 #endif
9348 #ifdef CONFIG_IPW2100_DEBUG
9349 #endif
9350 #ifdef CONFIG_IPW2100_DEBUG
9351 #endif
9352 #ifdef CONFIG_IPW2100_MONITOR
9353 #endif
9354 #define POWER_MODES 5
9355 #ifdef CONFIG_IPW2100_MONITOR
9356 #endif
9357 #define MAX_POWER_STRING 80
9358 #ifdef CONFIG_IPW2100_MONITOR
9359 #endif
9360 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
9361 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
9362 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
9363 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
9364 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
9365 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
9366 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
9367 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
9368 #ifdef CONFIG_IPW2100_MONITOR
9369 #endif
9370 #ifdef CONFIG_IPW2100_MONITOR
9371 #endif
9372 #ifdef CONFIG_IPW2100_MONITOR
9373 #else
9374 #endif
9375 #ifdef CONFIG_IPW2100_MONITOR
9376 #else
9377 #endif
9378 #ifdef CONFIG_IPW2100_DEBUG
9379 #endif
9380 #define IPW2100_FW_MAJOR_VERSION 1
9381 #define IPW2100_FW_MINOR_VERSION 3
9382 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
9383 #define IPW2100_FW_MAJOR(x) (x & 0xff)
9384 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
9385 IPW2100_FW_MAJOR_VERSION)
9386 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
9387 "." __stringify(IPW2100_FW_MINOR_VERSION)
9388 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
9389 #ifdef CONFIG_IPW2100_MONITOR
9390 #endif
9391 #ifdef CONFIG_IPW2100_MONITOR
9392 #endif
9393 /* LDV_COMMENT_END_PREP */
9394 /* content: static void ipw2100_tx_timeout(struct net_device *dev)*/
9395 /* LDV_COMMENT_BEGIN_PREP */
9396 #define IPW2100_VERSION "git-1.2.2"
9397 #define DRV_NAME "ipw2100"
9398 #define DRV_VERSION IPW2100_VERSION
9399 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
9400 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
9401 #ifdef CONFIG_IPW2100_DEBUG
9402 #define IPW2100_RX_DEBUG
9403 #endif
9404 #ifdef CONFIG_PM
9405 #endif
9406 #ifdef CONFIG_IPW2100_DEBUG
9407 #define IPW_DEBUG(level, message...) \
9408 do { \
9409 if (ipw2100_debug_level & (level)) { \
9410 printk(KERN_DEBUG "ipw2100: %c %s ", \
9411 in_interrupt() ? 'I' : 'U', __func__); \
9412 printk(message); \
9413 } \
9414 } while (0)
9415 #else
9416 #define IPW_DEBUG(level, message...) do {} while (0)
9417 #endif
9418 #ifdef CONFIG_IPW2100_DEBUG
9419 #endif
9420 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
9421 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
9422 #define MAX_RESET_BACKOFF 10
9423 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
9424 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
9425 #ifndef CONFIG_PM
9426 #endif
9427 #ifdef CONFIG_PM
9428 #else
9429 #endif
9430 #ifndef CONFIG_PM
9431 #endif
9432 #define MAX_RF_KILL_CHECKS 5
9433 #define RF_KILL_CHECK_DELAY 40
9434 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
9435 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
9436 #define MAC_ASSOCIATION_READ_DELAY (HZ)
9437 #ifdef CONFIG_IPW2100_DEBUG
9438 #define IPW2100_HANDLER(v, f) { v, f, # v }
9439 #else
9440 #define IPW2100_HANDLER(v, f) { v, f }
9441 #endif
9442 #ifdef CONFIG_IPW2100_DEBUG
9443 #endif
9444 #ifdef CONFIG_IPW2100_DEBUG
9445 #endif
9446 #define SEARCH_ERROR 0xffffffff
9447 #define SEARCH_FAIL 0xfffffffe
9448 #define SEARCH_SUCCESS 0xfffffff0
9449 #define SEARCH_DISCARD 0
9450 #define SEARCH_SNAPSHOT 1
9451 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
9452 #ifdef IPW2100_DEBUG_C3
9453 #endif
9454 #ifdef IPW2100_RX_DEBUG
9455 #endif
9456 #ifdef IPW2100_DEBUG_C3
9457 #endif
9458 #ifdef IPW2100_DEBUG_C3
9459 #endif
9460 #ifdef IPW2100_RX_DEBUG
9461 #endif
9462 #ifdef IPW2100_RX_DEBUG
9463 #endif
9464 #ifdef CONFIG_IPW2100_MONITOR
9465 #endif
9466 #ifdef CONFIG_IPW2100_MONITOR
9467 #else
9468 #endif
9469 #ifdef CONFIG_IPW2100_MONITOR
9470 #endif
9471 #ifdef CONFIG_IPW2100_DEBUG
9472 #endif
9473 #ifdef CONFIG_IPW2100_DEBUG
9474 #endif
9475 #ifdef CONFIG_IPW2100_DEBUG
9476 #endif
9477 #define IPW2100_REG(x) { IPW_ ##x, #x }
9478 #define IPW2100_NIC(x, s) { x, #x, s }
9479 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
9480 #ifdef CONFIG_IPW2100_DEBUG
9481 #endif
9482 #ifdef CONFIG_IPW2100_MONITOR
9483 #endif
9484 #ifdef CONFIG_PM
9485 #endif
9486 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
9487 #ifdef CONFIG_IPW2100_DEBUG
9488 #endif
9489 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
9490 #endif
9491 #ifdef IPW2100_TX_POWER
9492 #endif
9493 #if 0
9494 #endif
9495 #ifdef CONFIG_IPW2100_DEBUG
9496 #endif
9497 #define IPW_PRIVACY_CAPABLE 0x0008
9498 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
9499 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
9500 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
9501 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
9502 #ifdef CONFIG_IPW2100_MONITOR
9503 #endif
9504 /* LDV_COMMENT_END_PREP */
9505 /* LDV_COMMENT_BEGIN_PREP */
9506 #ifdef CONFIG_IPW2100_MONITOR
9507 #endif
9508 #ifdef CONFIG_IPW2100_MONITOR
9509 #endif
9510 #ifdef CONFIG_PM
9511 #endif
9512 #ifdef CONFIG_PM
9513 #endif
9514 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
9515 #ifdef CONFIG_PM
9516 #endif
9517 #ifdef CONFIG_IPW2100_DEBUG
9518 #endif
9519 #ifdef CONFIG_IPW2100_DEBUG
9520 #endif
9521 #ifdef CONFIG_IPW2100_MONITOR
9522 #endif
9523 #define POWER_MODES 5
9524 #ifdef CONFIG_IPW2100_MONITOR
9525 #endif
9526 #define MAX_POWER_STRING 80
9527 #ifdef CONFIG_IPW2100_MONITOR
9528 #endif
9529 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
9530 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
9531 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
9532 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
9533 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
9534 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
9535 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
9536 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
9537 #ifdef CONFIG_IPW2100_MONITOR
9538 #endif
9539 #ifdef CONFIG_IPW2100_MONITOR
9540 #endif
9541 #ifdef CONFIG_IPW2100_MONITOR
9542 #else
9543 #endif
9544 #ifdef CONFIG_IPW2100_MONITOR
9545 #else
9546 #endif
9547 #ifdef CONFIG_IPW2100_DEBUG
9548 #endif
9549 #define IPW2100_FW_MAJOR_VERSION 1
9550 #define IPW2100_FW_MINOR_VERSION 3
9551 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
9552 #define IPW2100_FW_MAJOR(x) (x & 0xff)
9553 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
9554 IPW2100_FW_MAJOR_VERSION)
9555 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
9556 "." __stringify(IPW2100_FW_MINOR_VERSION)
9557 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
9558 #ifdef CONFIG_IPW2100_MONITOR
9559 #endif
9560 #ifdef CONFIG_IPW2100_MONITOR
9561 #endif
9562 /* LDV_COMMENT_END_PREP */
9563 /* content: static int ipw2100_set_address(struct net_device *dev, void *p)*/
9564 /* LDV_COMMENT_BEGIN_PREP */
9565 #define IPW2100_VERSION "git-1.2.2"
9566 #define DRV_NAME "ipw2100"
9567 #define DRV_VERSION IPW2100_VERSION
9568 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
9569 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
9570 #ifdef CONFIG_IPW2100_DEBUG
9571 #define IPW2100_RX_DEBUG
9572 #endif
9573 #ifdef CONFIG_PM
9574 #endif
9575 #ifdef CONFIG_IPW2100_DEBUG
9576 #define IPW_DEBUG(level, message...) \
9577 do { \
9578 if (ipw2100_debug_level & (level)) { \
9579 printk(KERN_DEBUG "ipw2100: %c %s ", \
9580 in_interrupt() ? 'I' : 'U', __func__); \
9581 printk(message); \
9582 } \
9583 } while (0)
9584 #else
9585 #define IPW_DEBUG(level, message...) do {} while (0)
9586 #endif
9587 #ifdef CONFIG_IPW2100_DEBUG
9588 #endif
9589 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
9590 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
9591 #define MAX_RESET_BACKOFF 10
9592 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
9593 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
9594 #ifndef CONFIG_PM
9595 #endif
9596 #ifdef CONFIG_PM
9597 #else
9598 #endif
9599 #ifndef CONFIG_PM
9600 #endif
9601 #define MAX_RF_KILL_CHECKS 5
9602 #define RF_KILL_CHECK_DELAY 40
9603 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
9604 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
9605 #define MAC_ASSOCIATION_READ_DELAY (HZ)
9606 #ifdef CONFIG_IPW2100_DEBUG
9607 #define IPW2100_HANDLER(v, f) { v, f, # v }
9608 #else
9609 #define IPW2100_HANDLER(v, f) { v, f }
9610 #endif
9611 #ifdef CONFIG_IPW2100_DEBUG
9612 #endif
9613 #ifdef CONFIG_IPW2100_DEBUG
9614 #endif
9615 #define SEARCH_ERROR 0xffffffff
9616 #define SEARCH_FAIL 0xfffffffe
9617 #define SEARCH_SUCCESS 0xfffffff0
9618 #define SEARCH_DISCARD 0
9619 #define SEARCH_SNAPSHOT 1
9620 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
9621 #ifdef IPW2100_DEBUG_C3
9622 #endif
9623 #ifdef IPW2100_RX_DEBUG
9624 #endif
9625 #ifdef IPW2100_DEBUG_C3
9626 #endif
9627 #ifdef IPW2100_DEBUG_C3
9628 #endif
9629 #ifdef IPW2100_RX_DEBUG
9630 #endif
9631 #ifdef IPW2100_RX_DEBUG
9632 #endif
9633 #ifdef CONFIG_IPW2100_MONITOR
9634 #endif
9635 #ifdef CONFIG_IPW2100_MONITOR
9636 #else
9637 #endif
9638 #ifdef CONFIG_IPW2100_MONITOR
9639 #endif
9640 #ifdef CONFIG_IPW2100_DEBUG
9641 #endif
9642 #ifdef CONFIG_IPW2100_DEBUG
9643 #endif
9644 #ifdef CONFIG_IPW2100_DEBUG
9645 #endif
9646 #define IPW2100_REG(x) { IPW_ ##x, #x }
9647 #define IPW2100_NIC(x, s) { x, #x, s }
9648 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
9649 #ifdef CONFIG_IPW2100_DEBUG
9650 #endif
9651 #ifdef CONFIG_IPW2100_MONITOR
9652 #endif
9653 #ifdef CONFIG_PM
9654 #endif
9655 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
9656 #ifdef CONFIG_IPW2100_DEBUG
9657 #endif
9658 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
9659 #endif
9660 #ifdef IPW2100_TX_POWER
9661 #endif
9662 #if 0
9663 #endif
9664 #ifdef CONFIG_IPW2100_DEBUG
9665 #endif
9666 #define IPW_PRIVACY_CAPABLE 0x0008
9667 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
9668 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
9669 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
9670 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
9671 #ifdef CONFIG_IPW2100_MONITOR
9672 #endif
9673 /* LDV_COMMENT_END_PREP */
9674 /* LDV_COMMENT_VAR_DECLARE Variable declaration for function "ipw2100_set_address" */
9675 void * var_ipw2100_set_address_135_p1;
9676 /* LDV_COMMENT_BEGIN_PREP */
9677 #ifdef CONFIG_IPW2100_MONITOR
9678 #endif
9679 #ifdef CONFIG_IPW2100_MONITOR
9680 #endif
9681 #ifdef CONFIG_IPW2100_MONITOR
9682 #endif
9683 #ifdef CONFIG_PM
9684 #endif
9685 #ifdef CONFIG_PM
9686 #endif
9687 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
9688 #ifdef CONFIG_PM
9689 #endif
9690 #ifdef CONFIG_IPW2100_DEBUG
9691 #endif
9692 #ifdef CONFIG_IPW2100_DEBUG
9693 #endif
9694 #ifdef CONFIG_IPW2100_MONITOR
9695 #endif
9696 #define POWER_MODES 5
9697 #ifdef CONFIG_IPW2100_MONITOR
9698 #endif
9699 #define MAX_POWER_STRING 80
9700 #ifdef CONFIG_IPW2100_MONITOR
9701 #endif
9702 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
9703 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
9704 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
9705 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
9706 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
9707 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
9708 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
9709 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
9710 #ifdef CONFIG_IPW2100_MONITOR
9711 #endif
9712 #ifdef CONFIG_IPW2100_MONITOR
9713 #endif
9714 #ifdef CONFIG_IPW2100_MONITOR
9715 #else
9716 #endif
9717 #ifdef CONFIG_IPW2100_MONITOR
9718 #else
9719 #endif
9720 #ifdef CONFIG_IPW2100_DEBUG
9721 #endif
9722 #define IPW2100_FW_MAJOR_VERSION 1
9723 #define IPW2100_FW_MINOR_VERSION 3
9724 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
9725 #define IPW2100_FW_MAJOR(x) (x & 0xff)
9726 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
9727 IPW2100_FW_MAJOR_VERSION)
9728 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
9729 "." __stringify(IPW2100_FW_MINOR_VERSION)
9730 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
9731 #ifdef CONFIG_IPW2100_MONITOR
9732 #endif
9733 #ifdef CONFIG_IPW2100_MONITOR
9734 #endif
9735 /* LDV_COMMENT_END_PREP */
9736
9737 /** STRUCT: struct type: pci_driver, struct name: ipw2100_pci_driver **/
9738 /* content: static int ipw2100_pci_init_one(struct pci_dev *pci_dev, const struct pci_device_id *ent)*/
9739 /* LDV_COMMENT_BEGIN_PREP */
9740 #define IPW2100_VERSION "git-1.2.2"
9741 #define DRV_NAME "ipw2100"
9742 #define DRV_VERSION IPW2100_VERSION
9743 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
9744 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
9745 #ifdef CONFIG_IPW2100_DEBUG
9746 #define IPW2100_RX_DEBUG
9747 #endif
9748 #ifdef CONFIG_PM
9749 #endif
9750 #ifdef CONFIG_IPW2100_DEBUG
9751 #define IPW_DEBUG(level, message...) \
9752 do { \
9753 if (ipw2100_debug_level & (level)) { \
9754 printk(KERN_DEBUG "ipw2100: %c %s ", \
9755 in_interrupt() ? 'I' : 'U', __func__); \
9756 printk(message); \
9757 } \
9758 } while (0)
9759 #else
9760 #define IPW_DEBUG(level, message...) do {} while (0)
9761 #endif
9762 #ifdef CONFIG_IPW2100_DEBUG
9763 #endif
9764 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
9765 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
9766 #define MAX_RESET_BACKOFF 10
9767 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
9768 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
9769 #ifndef CONFIG_PM
9770 #endif
9771 #ifdef CONFIG_PM
9772 #else
9773 #endif
9774 #ifndef CONFIG_PM
9775 #endif
9776 #define MAX_RF_KILL_CHECKS 5
9777 #define RF_KILL_CHECK_DELAY 40
9778 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
9779 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
9780 #define MAC_ASSOCIATION_READ_DELAY (HZ)
9781 #ifdef CONFIG_IPW2100_DEBUG
9782 #define IPW2100_HANDLER(v, f) { v, f, # v }
9783 #else
9784 #define IPW2100_HANDLER(v, f) { v, f }
9785 #endif
9786 #ifdef CONFIG_IPW2100_DEBUG
9787 #endif
9788 #ifdef CONFIG_IPW2100_DEBUG
9789 #endif
9790 #define SEARCH_ERROR 0xffffffff
9791 #define SEARCH_FAIL 0xfffffffe
9792 #define SEARCH_SUCCESS 0xfffffff0
9793 #define SEARCH_DISCARD 0
9794 #define SEARCH_SNAPSHOT 1
9795 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
9796 #ifdef IPW2100_DEBUG_C3
9797 #endif
9798 #ifdef IPW2100_RX_DEBUG
9799 #endif
9800 #ifdef IPW2100_DEBUG_C3
9801 #endif
9802 #ifdef IPW2100_DEBUG_C3
9803 #endif
9804 #ifdef IPW2100_RX_DEBUG
9805 #endif
9806 #ifdef IPW2100_RX_DEBUG
9807 #endif
9808 #ifdef CONFIG_IPW2100_MONITOR
9809 #endif
9810 #ifdef CONFIG_IPW2100_MONITOR
9811 #else
9812 #endif
9813 #ifdef CONFIG_IPW2100_MONITOR
9814 #endif
9815 #ifdef CONFIG_IPW2100_DEBUG
9816 #endif
9817 #ifdef CONFIG_IPW2100_DEBUG
9818 #endif
9819 #ifdef CONFIG_IPW2100_DEBUG
9820 #endif
9821 #define IPW2100_REG(x) { IPW_ ##x, #x }
9822 #define IPW2100_NIC(x, s) { x, #x, s }
9823 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
9824 #ifdef CONFIG_IPW2100_DEBUG
9825 #endif
9826 #ifdef CONFIG_IPW2100_MONITOR
9827 #endif
9828 #ifdef CONFIG_PM
9829 #endif
9830 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
9831 #ifdef CONFIG_IPW2100_DEBUG
9832 #endif
9833 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
9834 #endif
9835 #ifdef IPW2100_TX_POWER
9836 #endif
9837 #if 0
9838 #endif
9839 #ifdef CONFIG_IPW2100_DEBUG
9840 #endif
9841 #define IPW_PRIVACY_CAPABLE 0x0008
9842 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
9843 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
9844 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
9845 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
9846 #ifdef CONFIG_IPW2100_MONITOR
9847 #endif
9848 #ifdef CONFIG_IPW2100_MONITOR
9849 #endif
9850 #ifdef CONFIG_IPW2100_MONITOR
9851 #endif
9852 #ifdef CONFIG_IPW2100_MONITOR
9853 #endif
9854 /* LDV_COMMENT_END_PREP */
9855 /* LDV_COMMENT_VAR_DECLARE Variable declaration for function "ipw2100_pci_init_one" */
9856 struct pci_dev * var_group3;
9857 /* LDV_COMMENT_VAR_DECLARE Variable declaration for function "ipw2100_pci_init_one" */
9858 const struct pci_device_id * var_ipw2100_pci_init_one_147_p1;
9859 /* LDV_COMMENT_VAR_DECLARE Variable declaration for test return result from function call "ipw2100_pci_init_one" */
9860 static int res_ipw2100_pci_init_one_147;
9861 /* LDV_COMMENT_BEGIN_PREP */
9862 #ifdef CONFIG_PM
9863 #endif
9864 #ifdef CONFIG_PM
9865 #endif
9866 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
9867 #ifdef CONFIG_PM
9868 #endif
9869 #ifdef CONFIG_IPW2100_DEBUG
9870 #endif
9871 #ifdef CONFIG_IPW2100_DEBUG
9872 #endif
9873 #ifdef CONFIG_IPW2100_MONITOR
9874 #endif
9875 #define POWER_MODES 5
9876 #ifdef CONFIG_IPW2100_MONITOR
9877 #endif
9878 #define MAX_POWER_STRING 80
9879 #ifdef CONFIG_IPW2100_MONITOR
9880 #endif
9881 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
9882 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
9883 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
9884 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
9885 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
9886 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
9887 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
9888 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
9889 #ifdef CONFIG_IPW2100_MONITOR
9890 #endif
9891 #ifdef CONFIG_IPW2100_MONITOR
9892 #endif
9893 #ifdef CONFIG_IPW2100_MONITOR
9894 #else
9895 #endif
9896 #ifdef CONFIG_IPW2100_MONITOR
9897 #else
9898 #endif
9899 #ifdef CONFIG_IPW2100_DEBUG
9900 #endif
9901 #define IPW2100_FW_MAJOR_VERSION 1
9902 #define IPW2100_FW_MINOR_VERSION 3
9903 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
9904 #define IPW2100_FW_MAJOR(x) (x & 0xff)
9905 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
9906 IPW2100_FW_MAJOR_VERSION)
9907 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
9908 "." __stringify(IPW2100_FW_MINOR_VERSION)
9909 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
9910 #ifdef CONFIG_IPW2100_MONITOR
9911 #endif
9912 #ifdef CONFIG_IPW2100_MONITOR
9913 #endif
9914 /* LDV_COMMENT_END_PREP */
9915 /* content: static void ipw2100_pci_remove_one(struct pci_dev *pci_dev)*/
9916 /* LDV_COMMENT_BEGIN_PREP */
9917 #define IPW2100_VERSION "git-1.2.2"
9918 #define DRV_NAME "ipw2100"
9919 #define DRV_VERSION IPW2100_VERSION
9920 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
9921 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
9922 #ifdef CONFIG_IPW2100_DEBUG
9923 #define IPW2100_RX_DEBUG
9924 #endif
9925 #ifdef CONFIG_PM
9926 #endif
9927 #ifdef CONFIG_IPW2100_DEBUG
9928 #define IPW_DEBUG(level, message...) \
9929 do { \
9930 if (ipw2100_debug_level & (level)) { \
9931 printk(KERN_DEBUG "ipw2100: %c %s ", \
9932 in_interrupt() ? 'I' : 'U', __func__); \
9933 printk(message); \
9934 } \
9935 } while (0)
9936 #else
9937 #define IPW_DEBUG(level, message...) do {} while (0)
9938 #endif
9939 #ifdef CONFIG_IPW2100_DEBUG
9940 #endif
9941 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
9942 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
9943 #define MAX_RESET_BACKOFF 10
9944 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
9945 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
9946 #ifndef CONFIG_PM
9947 #endif
9948 #ifdef CONFIG_PM
9949 #else
9950 #endif
9951 #ifndef CONFIG_PM
9952 #endif
9953 #define MAX_RF_KILL_CHECKS 5
9954 #define RF_KILL_CHECK_DELAY 40
9955 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
9956 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
9957 #define MAC_ASSOCIATION_READ_DELAY (HZ)
9958 #ifdef CONFIG_IPW2100_DEBUG
9959 #define IPW2100_HANDLER(v, f) { v, f, # v }
9960 #else
9961 #define IPW2100_HANDLER(v, f) { v, f }
9962 #endif
9963 #ifdef CONFIG_IPW2100_DEBUG
9964 #endif
9965 #ifdef CONFIG_IPW2100_DEBUG
9966 #endif
9967 #define SEARCH_ERROR 0xffffffff
9968 #define SEARCH_FAIL 0xfffffffe
9969 #define SEARCH_SUCCESS 0xfffffff0
9970 #define SEARCH_DISCARD 0
9971 #define SEARCH_SNAPSHOT 1
9972 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
9973 #ifdef IPW2100_DEBUG_C3
9974 #endif
9975 #ifdef IPW2100_RX_DEBUG
9976 #endif
9977 #ifdef IPW2100_DEBUG_C3
9978 #endif
9979 #ifdef IPW2100_DEBUG_C3
9980 #endif
9981 #ifdef IPW2100_RX_DEBUG
9982 #endif
9983 #ifdef IPW2100_RX_DEBUG
9984 #endif
9985 #ifdef CONFIG_IPW2100_MONITOR
9986 #endif
9987 #ifdef CONFIG_IPW2100_MONITOR
9988 #else
9989 #endif
9990 #ifdef CONFIG_IPW2100_MONITOR
9991 #endif
9992 #ifdef CONFIG_IPW2100_DEBUG
9993 #endif
9994 #ifdef CONFIG_IPW2100_DEBUG
9995 #endif
9996 #ifdef CONFIG_IPW2100_DEBUG
9997 #endif
9998 #define IPW2100_REG(x) { IPW_ ##x, #x }
9999 #define IPW2100_NIC(x, s) { x, #x, s }
10000 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
10001 #ifdef CONFIG_IPW2100_DEBUG
10002 #endif
10003 #ifdef CONFIG_IPW2100_MONITOR
10004 #endif
10005 #ifdef CONFIG_PM
10006 #endif
10007 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
10008 #ifdef CONFIG_IPW2100_DEBUG
10009 #endif
10010 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
10011 #endif
10012 #ifdef IPW2100_TX_POWER
10013 #endif
10014 #if 0
10015 #endif
10016 #ifdef CONFIG_IPW2100_DEBUG
10017 #endif
10018 #define IPW_PRIVACY_CAPABLE 0x0008
10019 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
10020 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
10021 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
10022 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
10023 #ifdef CONFIG_IPW2100_MONITOR
10024 #endif
10025 #ifdef CONFIG_IPW2100_MONITOR
10026 #endif
10027 #ifdef CONFIG_IPW2100_MONITOR
10028 #endif
10029 #ifdef CONFIG_IPW2100_MONITOR
10030 #endif
10031 /* LDV_COMMENT_END_PREP */
10032 /* LDV_COMMENT_BEGIN_PREP */
10033 #ifdef CONFIG_PM
10034 #endif
10035 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
10036 #ifdef CONFIG_PM
10037 #endif
10038 #ifdef CONFIG_IPW2100_DEBUG
10039 #endif
10040 #ifdef CONFIG_IPW2100_DEBUG
10041 #endif
10042 #ifdef CONFIG_IPW2100_MONITOR
10043 #endif
10044 #define POWER_MODES 5
10045 #ifdef CONFIG_IPW2100_MONITOR
10046 #endif
10047 #define MAX_POWER_STRING 80
10048 #ifdef CONFIG_IPW2100_MONITOR
10049 #endif
10050 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
10051 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
10052 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
10053 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
10054 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
10055 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
10056 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
10057 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
10058 #ifdef CONFIG_IPW2100_MONITOR
10059 #endif
10060 #ifdef CONFIG_IPW2100_MONITOR
10061 #endif
10062 #ifdef CONFIG_IPW2100_MONITOR
10063 #else
10064 #endif
10065 #ifdef CONFIG_IPW2100_MONITOR
10066 #else
10067 #endif
10068 #ifdef CONFIG_IPW2100_DEBUG
10069 #endif
10070 #define IPW2100_FW_MAJOR_VERSION 1
10071 #define IPW2100_FW_MINOR_VERSION 3
10072 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
10073 #define IPW2100_FW_MAJOR(x) (x & 0xff)
10074 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
10075 IPW2100_FW_MAJOR_VERSION)
10076 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
10077 "." __stringify(IPW2100_FW_MINOR_VERSION)
10078 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
10079 #ifdef CONFIG_IPW2100_MONITOR
10080 #endif
10081 #ifdef CONFIG_IPW2100_MONITOR
10082 #endif
10083 /* LDV_COMMENT_END_PREP */
10084 /* content: static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state)*/
10085 /* LDV_COMMENT_BEGIN_PREP */
10086 #define IPW2100_VERSION "git-1.2.2"
10087 #define DRV_NAME "ipw2100"
10088 #define DRV_VERSION IPW2100_VERSION
10089 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
10090 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
10091 #ifdef CONFIG_IPW2100_DEBUG
10092 #define IPW2100_RX_DEBUG
10093 #endif
10094 #ifdef CONFIG_PM
10095 #endif
10096 #ifdef CONFIG_IPW2100_DEBUG
10097 #define IPW_DEBUG(level, message...) \
10098 do { \
10099 if (ipw2100_debug_level & (level)) { \
10100 printk(KERN_DEBUG "ipw2100: %c %s ", \
10101 in_interrupt() ? 'I' : 'U', __func__); \
10102 printk(message); \
10103 } \
10104 } while (0)
10105 #else
10106 #define IPW_DEBUG(level, message...) do {} while (0)
10107 #endif
10108 #ifdef CONFIG_IPW2100_DEBUG
10109 #endif
10110 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
10111 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
10112 #define MAX_RESET_BACKOFF 10
10113 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
10114 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
10115 #ifndef CONFIG_PM
10116 #endif
10117 #ifdef CONFIG_PM
10118 #else
10119 #endif
10120 #ifndef CONFIG_PM
10121 #endif
10122 #define MAX_RF_KILL_CHECKS 5
10123 #define RF_KILL_CHECK_DELAY 40
10124 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
10125 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
10126 #define MAC_ASSOCIATION_READ_DELAY (HZ)
10127 #ifdef CONFIG_IPW2100_DEBUG
10128 #define IPW2100_HANDLER(v, f) { v, f, # v }
10129 #else
10130 #define IPW2100_HANDLER(v, f) { v, f }
10131 #endif
10132 #ifdef CONFIG_IPW2100_DEBUG
10133 #endif
10134 #ifdef CONFIG_IPW2100_DEBUG
10135 #endif
10136 #define SEARCH_ERROR 0xffffffff
10137 #define SEARCH_FAIL 0xfffffffe
10138 #define SEARCH_SUCCESS 0xfffffff0
10139 #define SEARCH_DISCARD 0
10140 #define SEARCH_SNAPSHOT 1
10141 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
10142 #ifdef IPW2100_DEBUG_C3
10143 #endif
10144 #ifdef IPW2100_RX_DEBUG
10145 #endif
10146 #ifdef IPW2100_DEBUG_C3
10147 #endif
10148 #ifdef IPW2100_DEBUG_C3
10149 #endif
10150 #ifdef IPW2100_RX_DEBUG
10151 #endif
10152 #ifdef IPW2100_RX_DEBUG
10153 #endif
10154 #ifdef CONFIG_IPW2100_MONITOR
10155 #endif
10156 #ifdef CONFIG_IPW2100_MONITOR
10157 #else
10158 #endif
10159 #ifdef CONFIG_IPW2100_MONITOR
10160 #endif
10161 #ifdef CONFIG_IPW2100_DEBUG
10162 #endif
10163 #ifdef CONFIG_IPW2100_DEBUG
10164 #endif
10165 #ifdef CONFIG_IPW2100_DEBUG
10166 #endif
10167 #define IPW2100_REG(x) { IPW_ ##x, #x }
10168 #define IPW2100_NIC(x, s) { x, #x, s }
10169 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
10170 #ifdef CONFIG_IPW2100_DEBUG
10171 #endif
10172 #ifdef CONFIG_IPW2100_MONITOR
10173 #endif
10174 #ifdef CONFIG_PM
10175 #endif
10176 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
10177 #ifdef CONFIG_IPW2100_DEBUG
10178 #endif
10179 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
10180 #endif
10181 #ifdef IPW2100_TX_POWER
10182 #endif
10183 #if 0
10184 #endif
10185 #ifdef CONFIG_IPW2100_DEBUG
10186 #endif
10187 #define IPW_PRIVACY_CAPABLE 0x0008
10188 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
10189 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
10190 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
10191 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
10192 #ifdef CONFIG_IPW2100_MONITOR
10193 #endif
10194 #ifdef CONFIG_IPW2100_MONITOR
10195 #endif
10196 #ifdef CONFIG_IPW2100_MONITOR
10197 #endif
10198 #ifdef CONFIG_IPW2100_MONITOR
10199 #endif
10200 #ifdef CONFIG_PM
10201 #endif
10202 #ifdef CONFIG_PM
10203 /* LDV_COMMENT_END_PREP */
10204 /* LDV_COMMENT_VAR_DECLARE Variable declaration for function "ipw2100_suspend" */
10205 pm_message_t var_ipw2100_suspend_149_p1;
10206 /* LDV_COMMENT_BEGIN_PREP */
10207 #endif
10208 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
10209 #ifdef CONFIG_PM
10210 #endif
10211 #ifdef CONFIG_IPW2100_DEBUG
10212 #endif
10213 #ifdef CONFIG_IPW2100_DEBUG
10214 #endif
10215 #ifdef CONFIG_IPW2100_MONITOR
10216 #endif
10217 #define POWER_MODES 5
10218 #ifdef CONFIG_IPW2100_MONITOR
10219 #endif
10220 #define MAX_POWER_STRING 80
10221 #ifdef CONFIG_IPW2100_MONITOR
10222 #endif
10223 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
10224 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
10225 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
10226 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
10227 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
10228 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
10229 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
10230 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
10231 #ifdef CONFIG_IPW2100_MONITOR
10232 #endif
10233 #ifdef CONFIG_IPW2100_MONITOR
10234 #endif
10235 #ifdef CONFIG_IPW2100_MONITOR
10236 #else
10237 #endif
10238 #ifdef CONFIG_IPW2100_MONITOR
10239 #else
10240 #endif
10241 #ifdef CONFIG_IPW2100_DEBUG
10242 #endif
10243 #define IPW2100_FW_MAJOR_VERSION 1
10244 #define IPW2100_FW_MINOR_VERSION 3
10245 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
10246 #define IPW2100_FW_MAJOR(x) (x & 0xff)
10247 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
10248 IPW2100_FW_MAJOR_VERSION)
10249 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
10250 "." __stringify(IPW2100_FW_MINOR_VERSION)
10251 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
10252 #ifdef CONFIG_IPW2100_MONITOR
10253 #endif
10254 #ifdef CONFIG_IPW2100_MONITOR
10255 #endif
10256 /* LDV_COMMENT_END_PREP */
10257 /* content: static int ipw2100_resume(struct pci_dev *pci_dev)*/
10258 /* LDV_COMMENT_BEGIN_PREP */
10259 #define IPW2100_VERSION "git-1.2.2"
10260 #define DRV_NAME "ipw2100"
10261 #define DRV_VERSION IPW2100_VERSION
10262 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
10263 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
10264 #ifdef CONFIG_IPW2100_DEBUG
10265 #define IPW2100_RX_DEBUG
10266 #endif
10267 #ifdef CONFIG_PM
10268 #endif
10269 #ifdef CONFIG_IPW2100_DEBUG
10270 #define IPW_DEBUG(level, message...) \
10271 do { \
10272 if (ipw2100_debug_level & (level)) { \
10273 printk(KERN_DEBUG "ipw2100: %c %s ", \
10274 in_interrupt() ? 'I' : 'U', __func__); \
10275 printk(message); \
10276 } \
10277 } while (0)
10278 #else
10279 #define IPW_DEBUG(level, message...) do {} while (0)
10280 #endif
10281 #ifdef CONFIG_IPW2100_DEBUG
10282 #endif
10283 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
10284 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
10285 #define MAX_RESET_BACKOFF 10
10286 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
10287 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
10288 #ifndef CONFIG_PM
10289 #endif
10290 #ifdef CONFIG_PM
10291 #else
10292 #endif
10293 #ifndef CONFIG_PM
10294 #endif
10295 #define MAX_RF_KILL_CHECKS 5
10296 #define RF_KILL_CHECK_DELAY 40
10297 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
10298 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
10299 #define MAC_ASSOCIATION_READ_DELAY (HZ)
10300 #ifdef CONFIG_IPW2100_DEBUG
10301 #define IPW2100_HANDLER(v, f) { v, f, # v }
10302 #else
10303 #define IPW2100_HANDLER(v, f) { v, f }
10304 #endif
10305 #ifdef CONFIG_IPW2100_DEBUG
10306 #endif
10307 #ifdef CONFIG_IPW2100_DEBUG
10308 #endif
10309 #define SEARCH_ERROR 0xffffffff
10310 #define SEARCH_FAIL 0xfffffffe
10311 #define SEARCH_SUCCESS 0xfffffff0
10312 #define SEARCH_DISCARD 0
10313 #define SEARCH_SNAPSHOT 1
10314 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
10315 #ifdef IPW2100_DEBUG_C3
10316 #endif
10317 #ifdef IPW2100_RX_DEBUG
10318 #endif
10319 #ifdef IPW2100_DEBUG_C3
10320 #endif
10321 #ifdef IPW2100_DEBUG_C3
10322 #endif
10323 #ifdef IPW2100_RX_DEBUG
10324 #endif
10325 #ifdef IPW2100_RX_DEBUG
10326 #endif
10327 #ifdef CONFIG_IPW2100_MONITOR
10328 #endif
10329 #ifdef CONFIG_IPW2100_MONITOR
10330 #else
10331 #endif
10332 #ifdef CONFIG_IPW2100_MONITOR
10333 #endif
10334 #ifdef CONFIG_IPW2100_DEBUG
10335 #endif
10336 #ifdef CONFIG_IPW2100_DEBUG
10337 #endif
10338 #ifdef CONFIG_IPW2100_DEBUG
10339 #endif
10340 #define IPW2100_REG(x) { IPW_ ##x, #x }
10341 #define IPW2100_NIC(x, s) { x, #x, s }
10342 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
10343 #ifdef CONFIG_IPW2100_DEBUG
10344 #endif
10345 #ifdef CONFIG_IPW2100_MONITOR
10346 #endif
10347 #ifdef CONFIG_PM
10348 #endif
10349 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
10350 #ifdef CONFIG_IPW2100_DEBUG
10351 #endif
10352 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
10353 #endif
10354 #ifdef IPW2100_TX_POWER
10355 #endif
10356 #if 0
10357 #endif
10358 #ifdef CONFIG_IPW2100_DEBUG
10359 #endif
10360 #define IPW_PRIVACY_CAPABLE 0x0008
10361 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
10362 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
10363 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
10364 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
10365 #ifdef CONFIG_IPW2100_MONITOR
10366 #endif
10367 #ifdef CONFIG_IPW2100_MONITOR
10368 #endif
10369 #ifdef CONFIG_IPW2100_MONITOR
10370 #endif
10371 #ifdef CONFIG_IPW2100_MONITOR
10372 #endif
10373 #ifdef CONFIG_PM
10374 #endif
10375 #ifdef CONFIG_PM
10376 /* LDV_COMMENT_END_PREP */
10377 /* LDV_COMMENT_BEGIN_PREP */
10378 #endif
10379 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
10380 #ifdef CONFIG_PM
10381 #endif
10382 #ifdef CONFIG_IPW2100_DEBUG
10383 #endif
10384 #ifdef CONFIG_IPW2100_DEBUG
10385 #endif
10386 #ifdef CONFIG_IPW2100_MONITOR
10387 #endif
10388 #define POWER_MODES 5
10389 #ifdef CONFIG_IPW2100_MONITOR
10390 #endif
10391 #define MAX_POWER_STRING 80
10392 #ifdef CONFIG_IPW2100_MONITOR
10393 #endif
10394 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
10395 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
10396 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
10397 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
10398 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
10399 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
10400 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
10401 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
10402 #ifdef CONFIG_IPW2100_MONITOR
10403 #endif
10404 #ifdef CONFIG_IPW2100_MONITOR
10405 #endif
10406 #ifdef CONFIG_IPW2100_MONITOR
10407 #else
10408 #endif
10409 #ifdef CONFIG_IPW2100_MONITOR
10410 #else
10411 #endif
10412 #ifdef CONFIG_IPW2100_DEBUG
10413 #endif
10414 #define IPW2100_FW_MAJOR_VERSION 1
10415 #define IPW2100_FW_MINOR_VERSION 3
10416 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
10417 #define IPW2100_FW_MAJOR(x) (x & 0xff)
10418 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
10419 IPW2100_FW_MAJOR_VERSION)
10420 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
10421 "." __stringify(IPW2100_FW_MINOR_VERSION)
10422 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
10423 #ifdef CONFIG_IPW2100_MONITOR
10424 #endif
10425 #ifdef CONFIG_IPW2100_MONITOR
10426 #endif
10427 /* LDV_COMMENT_END_PREP */
10428 /* content: static void ipw2100_shutdown(struct pci_dev *pci_dev)*/
10429 /* LDV_COMMENT_BEGIN_PREP */
10430 #define IPW2100_VERSION "git-1.2.2"
10431 #define DRV_NAME "ipw2100"
10432 #define DRV_VERSION IPW2100_VERSION
10433 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
10434 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
10435 #ifdef CONFIG_IPW2100_DEBUG
10436 #define IPW2100_RX_DEBUG
10437 #endif
10438 #ifdef CONFIG_PM
10439 #endif
10440 #ifdef CONFIG_IPW2100_DEBUG
10441 #define IPW_DEBUG(level, message...) \
10442 do { \
10443 if (ipw2100_debug_level & (level)) { \
10444 printk(KERN_DEBUG "ipw2100: %c %s ", \
10445 in_interrupt() ? 'I' : 'U', __func__); \
10446 printk(message); \
10447 } \
10448 } while (0)
10449 #else
10450 #define IPW_DEBUG(level, message...) do {} while (0)
10451 #endif
10452 #ifdef CONFIG_IPW2100_DEBUG
10453 #endif
10454 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
10455 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
10456 #define MAX_RESET_BACKOFF 10
10457 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
10458 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
10459 #ifndef CONFIG_PM
10460 #endif
10461 #ifdef CONFIG_PM
10462 #else
10463 #endif
10464 #ifndef CONFIG_PM
10465 #endif
10466 #define MAX_RF_KILL_CHECKS 5
10467 #define RF_KILL_CHECK_DELAY 40
10468 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
10469 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
10470 #define MAC_ASSOCIATION_READ_DELAY (HZ)
10471 #ifdef CONFIG_IPW2100_DEBUG
10472 #define IPW2100_HANDLER(v, f) { v, f, # v }
10473 #else
10474 #define IPW2100_HANDLER(v, f) { v, f }
10475 #endif
10476 #ifdef CONFIG_IPW2100_DEBUG
10477 #endif
10478 #ifdef CONFIG_IPW2100_DEBUG
10479 #endif
10480 #define SEARCH_ERROR 0xffffffff
10481 #define SEARCH_FAIL 0xfffffffe
10482 #define SEARCH_SUCCESS 0xfffffff0
10483 #define SEARCH_DISCARD 0
10484 #define SEARCH_SNAPSHOT 1
10485 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
10486 #ifdef IPW2100_DEBUG_C3
10487 #endif
10488 #ifdef IPW2100_RX_DEBUG
10489 #endif
10490 #ifdef IPW2100_DEBUG_C3
10491 #endif
10492 #ifdef IPW2100_DEBUG_C3
10493 #endif
10494 #ifdef IPW2100_RX_DEBUG
10495 #endif
10496 #ifdef IPW2100_RX_DEBUG
10497 #endif
10498 #ifdef CONFIG_IPW2100_MONITOR
10499 #endif
10500 #ifdef CONFIG_IPW2100_MONITOR
10501 #else
10502 #endif
10503 #ifdef CONFIG_IPW2100_MONITOR
10504 #endif
10505 #ifdef CONFIG_IPW2100_DEBUG
10506 #endif
10507 #ifdef CONFIG_IPW2100_DEBUG
10508 #endif
10509 #ifdef CONFIG_IPW2100_DEBUG
10510 #endif
10511 #define IPW2100_REG(x) { IPW_ ##x, #x }
10512 #define IPW2100_NIC(x, s) { x, #x, s }
10513 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
10514 #ifdef CONFIG_IPW2100_DEBUG
10515 #endif
10516 #ifdef CONFIG_IPW2100_MONITOR
10517 #endif
10518 #ifdef CONFIG_PM
10519 #endif
10520 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
10521 #ifdef CONFIG_IPW2100_DEBUG
10522 #endif
10523 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
10524 #endif
10525 #ifdef IPW2100_TX_POWER
10526 #endif
10527 #if 0
10528 #endif
10529 #ifdef CONFIG_IPW2100_DEBUG
10530 #endif
10531 #define IPW_PRIVACY_CAPABLE 0x0008
10532 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
10533 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
10534 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
10535 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
10536 #ifdef CONFIG_IPW2100_MONITOR
10537 #endif
10538 #ifdef CONFIG_IPW2100_MONITOR
10539 #endif
10540 #ifdef CONFIG_IPW2100_MONITOR
10541 #endif
10542 #ifdef CONFIG_IPW2100_MONITOR
10543 #endif
10544 #ifdef CONFIG_PM
10545 #endif
10546 #ifdef CONFIG_PM
10547 #endif
10548 /* LDV_COMMENT_END_PREP */
10549 /* LDV_COMMENT_BEGIN_PREP */
10550 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
10551 #ifdef CONFIG_PM
10552 #endif
10553 #ifdef CONFIG_IPW2100_DEBUG
10554 #endif
10555 #ifdef CONFIG_IPW2100_DEBUG
10556 #endif
10557 #ifdef CONFIG_IPW2100_MONITOR
10558 #endif
10559 #define POWER_MODES 5
10560 #ifdef CONFIG_IPW2100_MONITOR
10561 #endif
10562 #define MAX_POWER_STRING 80
10563 #ifdef CONFIG_IPW2100_MONITOR
10564 #endif
10565 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
10566 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
10567 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
10568 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
10569 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
10570 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
10571 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
10572 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
10573 #ifdef CONFIG_IPW2100_MONITOR
10574 #endif
10575 #ifdef CONFIG_IPW2100_MONITOR
10576 #endif
10577 #ifdef CONFIG_IPW2100_MONITOR
10578 #else
10579 #endif
10580 #ifdef CONFIG_IPW2100_MONITOR
10581 #else
10582 #endif
10583 #ifdef CONFIG_IPW2100_DEBUG
10584 #endif
10585 #define IPW2100_FW_MAJOR_VERSION 1
10586 #define IPW2100_FW_MINOR_VERSION 3
10587 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
10588 #define IPW2100_FW_MAJOR(x) (x & 0xff)
10589 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
10590 IPW2100_FW_MAJOR_VERSION)
10591 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
10592 "." __stringify(IPW2100_FW_MINOR_VERSION)
10593 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
10594 #ifdef CONFIG_IPW2100_MONITOR
10595 #endif
10596 #ifdef CONFIG_IPW2100_MONITOR
10597 #endif
10598 /* LDV_COMMENT_END_PREP */
10599
10600 /** STRUCT: struct type: iw_handler_def, struct name: ipw2100_wx_handler_def **/
10601 /* content: static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev)*/
10602 /* LDV_COMMENT_BEGIN_PREP */
10603 #define IPW2100_VERSION "git-1.2.2"
10604 #define DRV_NAME "ipw2100"
10605 #define DRV_VERSION IPW2100_VERSION
10606 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
10607 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
10608 #ifdef CONFIG_IPW2100_DEBUG
10609 #define IPW2100_RX_DEBUG
10610 #endif
10611 #ifdef CONFIG_PM
10612 #endif
10613 #ifdef CONFIG_IPW2100_DEBUG
10614 #define IPW_DEBUG(level, message...) \
10615 do { \
10616 if (ipw2100_debug_level & (level)) { \
10617 printk(KERN_DEBUG "ipw2100: %c %s ", \
10618 in_interrupt() ? 'I' : 'U', __func__); \
10619 printk(message); \
10620 } \
10621 } while (0)
10622 #else
10623 #define IPW_DEBUG(level, message...) do {} while (0)
10624 #endif
10625 #ifdef CONFIG_IPW2100_DEBUG
10626 #endif
10627 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
10628 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
10629 #define MAX_RESET_BACKOFF 10
10630 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
10631 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
10632 #ifndef CONFIG_PM
10633 #endif
10634 #ifdef CONFIG_PM
10635 #else
10636 #endif
10637 #ifndef CONFIG_PM
10638 #endif
10639 #define MAX_RF_KILL_CHECKS 5
10640 #define RF_KILL_CHECK_DELAY 40
10641 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
10642 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
10643 #define MAC_ASSOCIATION_READ_DELAY (HZ)
10644 #ifdef CONFIG_IPW2100_DEBUG
10645 #define IPW2100_HANDLER(v, f) { v, f, # v }
10646 #else
10647 #define IPW2100_HANDLER(v, f) { v, f }
10648 #endif
10649 #ifdef CONFIG_IPW2100_DEBUG
10650 #endif
10651 #ifdef CONFIG_IPW2100_DEBUG
10652 #endif
10653 #define SEARCH_ERROR 0xffffffff
10654 #define SEARCH_FAIL 0xfffffffe
10655 #define SEARCH_SUCCESS 0xfffffff0
10656 #define SEARCH_DISCARD 0
10657 #define SEARCH_SNAPSHOT 1
10658 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
10659 #ifdef IPW2100_DEBUG_C3
10660 #endif
10661 #ifdef IPW2100_RX_DEBUG
10662 #endif
10663 #ifdef IPW2100_DEBUG_C3
10664 #endif
10665 #ifdef IPW2100_DEBUG_C3
10666 #endif
10667 #ifdef IPW2100_RX_DEBUG
10668 #endif
10669 #ifdef IPW2100_RX_DEBUG
10670 #endif
10671 #ifdef CONFIG_IPW2100_MONITOR
10672 #endif
10673 #ifdef CONFIG_IPW2100_MONITOR
10674 #else
10675 #endif
10676 #ifdef CONFIG_IPW2100_MONITOR
10677 #endif
10678 #ifdef CONFIG_IPW2100_DEBUG
10679 #endif
10680 #ifdef CONFIG_IPW2100_DEBUG
10681 #endif
10682 #ifdef CONFIG_IPW2100_DEBUG
10683 #endif
10684 #define IPW2100_REG(x) { IPW_ ##x, #x }
10685 #define IPW2100_NIC(x, s) { x, #x, s }
10686 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
10687 #ifdef CONFIG_IPW2100_DEBUG
10688 #endif
10689 #ifdef CONFIG_IPW2100_MONITOR
10690 #endif
10691 #ifdef CONFIG_PM
10692 #endif
10693 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
10694 #ifdef CONFIG_IPW2100_DEBUG
10695 #endif
10696 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
10697 #endif
10698 #ifdef IPW2100_TX_POWER
10699 #endif
10700 #if 0
10701 #endif
10702 #ifdef CONFIG_IPW2100_DEBUG
10703 #endif
10704 #define IPW_PRIVACY_CAPABLE 0x0008
10705 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
10706 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
10707 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
10708 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
10709 #ifdef CONFIG_IPW2100_MONITOR
10710 #endif
10711 #ifdef CONFIG_IPW2100_MONITOR
10712 #endif
10713 #ifdef CONFIG_IPW2100_MONITOR
10714 #endif
10715 #ifdef CONFIG_IPW2100_MONITOR
10716 #endif
10717 #ifdef CONFIG_PM
10718 #endif
10719 #ifdef CONFIG_PM
10720 #endif
10721 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
10722 #ifdef CONFIG_PM
10723 #endif
10724 #ifdef CONFIG_IPW2100_DEBUG
10725 #endif
10726 #ifdef CONFIG_IPW2100_DEBUG
10727 #endif
10728 #ifdef CONFIG_IPW2100_MONITOR
10729 #endif
10730 #define POWER_MODES 5
10731 #ifdef CONFIG_IPW2100_MONITOR
10732 #endif
10733 #define MAX_POWER_STRING 80
10734 #ifdef CONFIG_IPW2100_MONITOR
10735 #endif
10736 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
10737 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
10738 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
10739 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
10740 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
10741 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
10742 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
10743 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
10744 #ifdef CONFIG_IPW2100_MONITOR
10745 #endif
10746 #ifdef CONFIG_IPW2100_MONITOR
10747 #endif
10748 #ifdef CONFIG_IPW2100_MONITOR
10749 #else
10750 #endif
10751 #ifdef CONFIG_IPW2100_MONITOR
10752 #else
10753 #endif
10754 /* LDV_COMMENT_END_PREP */
10755 /* LDV_COMMENT_BEGIN_PREP */
10756 #define IPW2100_FW_MAJOR_VERSION 1
10757 #define IPW2100_FW_MINOR_VERSION 3
10758 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
10759 #define IPW2100_FW_MAJOR(x) (x & 0xff)
10760 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
10761 IPW2100_FW_MAJOR_VERSION)
10762 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
10763 "." __stringify(IPW2100_FW_MINOR_VERSION)
10764 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
10765 #ifdef CONFIG_IPW2100_MONITOR
10766 #endif
10767 #ifdef CONFIG_IPW2100_MONITOR
10768 #endif
10769 /* LDV_COMMENT_END_PREP */
10770
10771 /** CALLBACK SECTION request_irq **/
10772 /* content: static irqreturn_t ipw2100_interrupt(int irq, void *data)*/
10773 /* LDV_COMMENT_BEGIN_PREP */
10774 #define IPW2100_VERSION "git-1.2.2"
10775 #define DRV_NAME "ipw2100"
10776 #define DRV_VERSION IPW2100_VERSION
10777 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
10778 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
10779 #ifdef CONFIG_IPW2100_DEBUG
10780 #define IPW2100_RX_DEBUG
10781 #endif
10782 #ifdef CONFIG_PM
10783 #endif
10784 #ifdef CONFIG_IPW2100_DEBUG
10785 #define IPW_DEBUG(level, message...) \
10786 do { \
10787 if (ipw2100_debug_level & (level)) { \
10788 printk(KERN_DEBUG "ipw2100: %c %s ", \
10789 in_interrupt() ? 'I' : 'U', __func__); \
10790 printk(message); \
10791 } \
10792 } while (0)
10793 #else
10794 #define IPW_DEBUG(level, message...) do {} while (0)
10795 #endif
10796 #ifdef CONFIG_IPW2100_DEBUG
10797 #endif
10798 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
10799 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
10800 #define MAX_RESET_BACKOFF 10
10801 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
10802 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
10803 #ifndef CONFIG_PM
10804 #endif
10805 #ifdef CONFIG_PM
10806 #else
10807 #endif
10808 #ifndef CONFIG_PM
10809 #endif
10810 #define MAX_RF_KILL_CHECKS 5
10811 #define RF_KILL_CHECK_DELAY 40
10812 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
10813 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
10814 #define MAC_ASSOCIATION_READ_DELAY (HZ)
10815 #ifdef CONFIG_IPW2100_DEBUG
10816 #define IPW2100_HANDLER(v, f) { v, f, # v }
10817 #else
10818 #define IPW2100_HANDLER(v, f) { v, f }
10819 #endif
10820 #ifdef CONFIG_IPW2100_DEBUG
10821 #endif
10822 #ifdef CONFIG_IPW2100_DEBUG
10823 #endif
10824 #define SEARCH_ERROR 0xffffffff
10825 #define SEARCH_FAIL 0xfffffffe
10826 #define SEARCH_SUCCESS 0xfffffff0
10827 #define SEARCH_DISCARD 0
10828 #define SEARCH_SNAPSHOT 1
10829 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
10830 #ifdef IPW2100_DEBUG_C3
10831 #endif
10832 #ifdef IPW2100_RX_DEBUG
10833 #endif
10834 #ifdef IPW2100_DEBUG_C3
10835 #endif
10836 #ifdef IPW2100_DEBUG_C3
10837 #endif
10838 #ifdef IPW2100_RX_DEBUG
10839 #endif
10840 #ifdef IPW2100_RX_DEBUG
10841 #endif
10842 #ifdef CONFIG_IPW2100_MONITOR
10843 #endif
10844 #ifdef CONFIG_IPW2100_MONITOR
10845 #else
10846 #endif
10847 #ifdef CONFIG_IPW2100_MONITOR
10848 #endif
10849 #ifdef CONFIG_IPW2100_DEBUG
10850 #endif
10851 #ifdef CONFIG_IPW2100_DEBUG
10852 #endif
10853 #ifdef CONFIG_IPW2100_DEBUG
10854 #endif
10855 /* LDV_COMMENT_END_PREP */
10856 /* LDV_COMMENT_VAR_DECLARE Variable declaration for function "ipw2100_interrupt" */
10857 int var_ipw2100_interrupt_69_p0;
10858 /* LDV_COMMENT_VAR_DECLARE Variable declaration for function "ipw2100_interrupt" */
10859 void * var_ipw2100_interrupt_69_p1;
10860 /* LDV_COMMENT_BEGIN_PREP */
10861 #define IPW2100_REG(x) { IPW_ ##x, #x }
10862 #define IPW2100_NIC(x, s) { x, #x, s }
10863 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
10864 #ifdef CONFIG_IPW2100_DEBUG
10865 #endif
10866 #ifdef CONFIG_IPW2100_MONITOR
10867 #endif
10868 #ifdef CONFIG_PM
10869 #endif
10870 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
10871 #ifdef CONFIG_IPW2100_DEBUG
10872 #endif
10873 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
10874 #endif
10875 #ifdef IPW2100_TX_POWER
10876 #endif
10877 #if 0
10878 #endif
10879 #ifdef CONFIG_IPW2100_DEBUG
10880 #endif
10881 #define IPW_PRIVACY_CAPABLE 0x0008
10882 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
10883 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
10884 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
10885 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
10886 #ifdef CONFIG_IPW2100_MONITOR
10887 #endif
10888 #ifdef CONFIG_IPW2100_MONITOR
10889 #endif
10890 #ifdef CONFIG_IPW2100_MONITOR
10891 #endif
10892 #ifdef CONFIG_IPW2100_MONITOR
10893 #endif
10894 #ifdef CONFIG_PM
10895 #endif
10896 #ifdef CONFIG_PM
10897 #endif
10898 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
10899 #ifdef CONFIG_PM
10900 #endif
10901 #ifdef CONFIG_IPW2100_DEBUG
10902 #endif
10903 #ifdef CONFIG_IPW2100_DEBUG
10904 #endif
10905 #ifdef CONFIG_IPW2100_MONITOR
10906 #endif
10907 #define POWER_MODES 5
10908 #ifdef CONFIG_IPW2100_MONITOR
10909 #endif
10910 #define MAX_POWER_STRING 80
10911 #ifdef CONFIG_IPW2100_MONITOR
10912 #endif
10913 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
10914 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
10915 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
10916 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
10917 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
10918 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
10919 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
10920 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
10921 #ifdef CONFIG_IPW2100_MONITOR
10922 #endif
10923 #ifdef CONFIG_IPW2100_MONITOR
10924 #endif
10925 #ifdef CONFIG_IPW2100_MONITOR
10926 #else
10927 #endif
10928 #ifdef CONFIG_IPW2100_MONITOR
10929 #else
10930 #endif
10931 #ifdef CONFIG_IPW2100_DEBUG
10932 #endif
10933 #define IPW2100_FW_MAJOR_VERSION 1
10934 #define IPW2100_FW_MINOR_VERSION 3
10935 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
10936 #define IPW2100_FW_MAJOR(x) (x & 0xff)
10937 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
10938 IPW2100_FW_MAJOR_VERSION)
10939 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
10940 "." __stringify(IPW2100_FW_MINOR_VERSION)
10941 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
10942 #ifdef CONFIG_IPW2100_MONITOR
10943 #endif
10944 #ifdef CONFIG_IPW2100_MONITOR
10945 #endif
10946 /* LDV_COMMENT_END_PREP */
10947
10948
10949
10950
10951 /* LDV_COMMENT_END_VARIABLE_DECLARATION_PART */
10952 /* LDV_COMMENT_BEGIN_VARIABLE_INITIALIZING_PART */
10953 /*============================= VARIABLE INITIALIZING PART =============================*/
10954 LDV_IN_INTERRUPT=1;
10955
10956
10957
10958
10959 /* LDV_COMMENT_END_VARIABLE_INITIALIZING_PART */
10960 /* LDV_COMMENT_BEGIN_FUNCTION_CALL_SECTION */
10961 /*============================= FUNCTION CALL SECTION =============================*/
10962 /* LDV_COMMENT_FUNCTION_CALL Initialize LDV model. */
10963 ldv_initialize();
10964
10965 /** INIT: init_type: ST_MODULE_INIT **/
10966 /* content: static int __init ipw2100_init(void)*/
10967 /* LDV_COMMENT_BEGIN_PREP */
10968 #define IPW2100_VERSION "git-1.2.2"
10969 #define DRV_NAME "ipw2100"
10970 #define DRV_VERSION IPW2100_VERSION
10971 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
10972 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
10973 #ifdef CONFIG_IPW2100_DEBUG
10974 #define IPW2100_RX_DEBUG
10975 #endif
10976 #ifdef CONFIG_PM
10977 #endif
10978 #ifdef CONFIG_IPW2100_DEBUG
10979 #define IPW_DEBUG(level, message...) \
10980 do { \
10981 if (ipw2100_debug_level & (level)) { \
10982 printk(KERN_DEBUG "ipw2100: %c %s ", \
10983 in_interrupt() ? 'I' : 'U', __func__); \
10984 printk(message); \
10985 } \
10986 } while (0)
10987 #else
10988 #define IPW_DEBUG(level, message...) do {} while (0)
10989 #endif
10990 #ifdef CONFIG_IPW2100_DEBUG
10991 #endif
10992 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
10993 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
10994 #define MAX_RESET_BACKOFF 10
10995 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
10996 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
10997 #ifndef CONFIG_PM
10998 #endif
10999 #ifdef CONFIG_PM
11000 #else
11001 #endif
11002 #ifndef CONFIG_PM
11003 #endif
11004 #define MAX_RF_KILL_CHECKS 5
11005 #define RF_KILL_CHECK_DELAY 40
11006 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
11007 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
11008 #define MAC_ASSOCIATION_READ_DELAY (HZ)
11009 #ifdef CONFIG_IPW2100_DEBUG
11010 #define IPW2100_HANDLER(v, f) { v, f, # v }
11011 #else
11012 #define IPW2100_HANDLER(v, f) { v, f }
11013 #endif
11014 #ifdef CONFIG_IPW2100_DEBUG
11015 #endif
11016 #ifdef CONFIG_IPW2100_DEBUG
11017 #endif
11018 #define SEARCH_ERROR 0xffffffff
11019 #define SEARCH_FAIL 0xfffffffe
11020 #define SEARCH_SUCCESS 0xfffffff0
11021 #define SEARCH_DISCARD 0
11022 #define SEARCH_SNAPSHOT 1
11023 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
11024 #ifdef IPW2100_DEBUG_C3
11025 #endif
11026 #ifdef IPW2100_RX_DEBUG
11027 #endif
11028 #ifdef IPW2100_DEBUG_C3
11029 #endif
11030 #ifdef IPW2100_DEBUG_C3
11031 #endif
11032 #ifdef IPW2100_RX_DEBUG
11033 #endif
11034 #ifdef IPW2100_RX_DEBUG
11035 #endif
11036 #ifdef CONFIG_IPW2100_MONITOR
11037 #endif
11038 #ifdef CONFIG_IPW2100_MONITOR
11039 #else
11040 #endif
11041 #ifdef CONFIG_IPW2100_MONITOR
11042 #endif
11043 #ifdef CONFIG_IPW2100_DEBUG
11044 #endif
11045 #ifdef CONFIG_IPW2100_DEBUG
11046 #endif
11047 #ifdef CONFIG_IPW2100_DEBUG
11048 #endif
11049 #define IPW2100_REG(x) { IPW_ ##x, #x }
11050 #define IPW2100_NIC(x, s) { x, #x, s }
11051 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
11052 #ifdef CONFIG_IPW2100_DEBUG
11053 #endif
11054 #ifdef CONFIG_IPW2100_MONITOR
11055 #endif
11056 #ifdef CONFIG_PM
11057 #endif
11058 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
11059 #ifdef CONFIG_IPW2100_DEBUG
11060 #endif
11061 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
11062 #endif
11063 #ifdef IPW2100_TX_POWER
11064 #endif
11065 #if 0
11066 #endif
11067 #ifdef CONFIG_IPW2100_DEBUG
11068 #endif
11069 #define IPW_PRIVACY_CAPABLE 0x0008
11070 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
11071 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
11072 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
11073 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
11074 #ifdef CONFIG_IPW2100_MONITOR
11075 #endif
11076 #ifdef CONFIG_IPW2100_MONITOR
11077 #endif
11078 #ifdef CONFIG_IPW2100_MONITOR
11079 #endif
11080 #ifdef CONFIG_IPW2100_MONITOR
11081 #endif
11082 #ifdef CONFIG_PM
11083 #endif
11084 #ifdef CONFIG_PM
11085 #endif
11086 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
11087 #ifdef CONFIG_PM
11088 #endif
11089 /* LDV_COMMENT_END_PREP */
11090 /* LDV_COMMENT_FUNCTION_CALL Kernel calls driver init function after driver loading to kernel. This function declared as "MODULE_INIT(function name)". */
11091 ldv_handler_precall();
11092 if(ipw2100_init())
11093 goto ldv_final;
11094 /* LDV_COMMENT_BEGIN_PREP */
11095 #ifdef CONFIG_IPW2100_DEBUG
11096 #endif
11097 #ifdef CONFIG_IPW2100_MONITOR
11098 #endif
11099 #define POWER_MODES 5
11100 #ifdef CONFIG_IPW2100_MONITOR
11101 #endif
11102 #define MAX_POWER_STRING 80
11103 #ifdef CONFIG_IPW2100_MONITOR
11104 #endif
11105 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
11106 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
11107 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
11108 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
11109 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
11110 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
11111 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
11112 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
11113 #ifdef CONFIG_IPW2100_MONITOR
11114 #endif
11115 #ifdef CONFIG_IPW2100_MONITOR
11116 #endif
11117 #ifdef CONFIG_IPW2100_MONITOR
11118 #else
11119 #endif
11120 #ifdef CONFIG_IPW2100_MONITOR
11121 #else
11122 #endif
11123 #ifdef CONFIG_IPW2100_DEBUG
11124 #endif
11125 #define IPW2100_FW_MAJOR_VERSION 1
11126 #define IPW2100_FW_MINOR_VERSION 3
11127 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
11128 #define IPW2100_FW_MAJOR(x) (x & 0xff)
11129 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
11130 IPW2100_FW_MAJOR_VERSION)
11131 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
11132 "." __stringify(IPW2100_FW_MINOR_VERSION)
11133 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
11134 #ifdef CONFIG_IPW2100_MONITOR
11135 #endif
11136 #ifdef CONFIG_IPW2100_MONITOR
11137 #endif
11138 /* LDV_COMMENT_END_PREP */
11139
11140
11141 int ldv_s_ipw2100_netdev_ops_net_device_ops = 0;
11142
11143
11144 int ldv_s_ipw2100_pci_driver_pci_driver = 0;
11145
11146
11147
11148
11149
11150
11151
11152 while( nondet_int()
11153 || !(ldv_s_ipw2100_netdev_ops_net_device_ops == 0)
11154 || !(ldv_s_ipw2100_pci_driver_pci_driver == 0)
11155 ) {
11156
11157 switch(nondet_int()) {
11158
11159 case 0: {
11160
11161 /** STRUCT: struct type: ethtool_ops, struct name: ipw2100_ethtool_ops **/
11162
11163
11164 /* content: static u32 ipw2100_ethtool_get_link(struct net_device *dev)*/
11165 /* LDV_COMMENT_BEGIN_PREP */
11166 #define IPW2100_VERSION "git-1.2.2"
11167 #define DRV_NAME "ipw2100"
11168 #define DRV_VERSION IPW2100_VERSION
11169 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
11170 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
11171 #ifdef CONFIG_IPW2100_DEBUG
11172 #define IPW2100_RX_DEBUG
11173 #endif
11174 #ifdef CONFIG_PM
11175 #endif
11176 #ifdef CONFIG_IPW2100_DEBUG
11177 #define IPW_DEBUG(level, message...) \
11178 do { \
11179 if (ipw2100_debug_level & (level)) { \
11180 printk(KERN_DEBUG "ipw2100: %c %s ", \
11181 in_interrupt() ? 'I' : 'U', __func__); \
11182 printk(message); \
11183 } \
11184 } while (0)
11185 #else
11186 #define IPW_DEBUG(level, message...) do {} while (0)
11187 #endif
11188 #ifdef CONFIG_IPW2100_DEBUG
11189 #endif
11190 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
11191 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
11192 #define MAX_RESET_BACKOFF 10
11193 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
11194 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
11195 #ifndef CONFIG_PM
11196 #endif
11197 #ifdef CONFIG_PM
11198 #else
11199 #endif
11200 #ifndef CONFIG_PM
11201 #endif
11202 #define MAX_RF_KILL_CHECKS 5
11203 #define RF_KILL_CHECK_DELAY 40
11204 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
11205 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
11206 #define MAC_ASSOCIATION_READ_DELAY (HZ)
11207 #ifdef CONFIG_IPW2100_DEBUG
11208 #define IPW2100_HANDLER(v, f) { v, f, # v }
11209 #else
11210 #define IPW2100_HANDLER(v, f) { v, f }
11211 #endif
11212 #ifdef CONFIG_IPW2100_DEBUG
11213 #endif
11214 #ifdef CONFIG_IPW2100_DEBUG
11215 #endif
11216 #define SEARCH_ERROR 0xffffffff
11217 #define SEARCH_FAIL 0xfffffffe
11218 #define SEARCH_SUCCESS 0xfffffff0
11219 #define SEARCH_DISCARD 0
11220 #define SEARCH_SNAPSHOT 1
11221 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
11222 #ifdef IPW2100_DEBUG_C3
11223 #endif
11224 #ifdef IPW2100_RX_DEBUG
11225 #endif
11226 #ifdef IPW2100_DEBUG_C3
11227 #endif
11228 #ifdef IPW2100_DEBUG_C3
11229 #endif
11230 #ifdef IPW2100_RX_DEBUG
11231 #endif
11232 #ifdef IPW2100_RX_DEBUG
11233 #endif
11234 #ifdef CONFIG_IPW2100_MONITOR
11235 #endif
11236 #ifdef CONFIG_IPW2100_MONITOR
11237 #else
11238 #endif
11239 #ifdef CONFIG_IPW2100_MONITOR
11240 #endif
11241 #ifdef CONFIG_IPW2100_DEBUG
11242 #endif
11243 #ifdef CONFIG_IPW2100_DEBUG
11244 #endif
11245 #ifdef CONFIG_IPW2100_DEBUG
11246 #endif
11247 #define IPW2100_REG(x) { IPW_ ##x, #x }
11248 #define IPW2100_NIC(x, s) { x, #x, s }
11249 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
11250 #ifdef CONFIG_IPW2100_DEBUG
11251 #endif
11252 #ifdef CONFIG_IPW2100_MONITOR
11253 #endif
11254 #ifdef CONFIG_PM
11255 #endif
11256 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
11257 #ifdef CONFIG_IPW2100_DEBUG
11258 #endif
11259 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
11260 #endif
11261 #ifdef IPW2100_TX_POWER
11262 #endif
11263 #if 0
11264 #endif
11265 #ifdef CONFIG_IPW2100_DEBUG
11266 #endif
11267 #define IPW_PRIVACY_CAPABLE 0x0008
11268 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
11269 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
11270 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
11271 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
11272 #ifdef CONFIG_IPW2100_MONITOR
11273 #endif
11274 #ifdef CONFIG_IPW2100_MONITOR
11275 #endif
11276 /* LDV_COMMENT_END_PREP */
11277 /* LDV_COMMENT_FUNCTION_CALL Function from field "get_link" from driver structure with callbacks "ipw2100_ethtool_ops" */
11278 ldv_handler_precall();
11279 ipw2100_ethtool_get_link( var_group1);
11280 /* LDV_COMMENT_BEGIN_PREP */
11281 #ifdef CONFIG_IPW2100_MONITOR
11282 #endif
11283 #ifdef CONFIG_IPW2100_MONITOR
11284 #endif
11285 #ifdef CONFIG_PM
11286 #endif
11287 #ifdef CONFIG_PM
11288 #endif
11289 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
11290 #ifdef CONFIG_PM
11291 #endif
11292 #ifdef CONFIG_IPW2100_DEBUG
11293 #endif
11294 #ifdef CONFIG_IPW2100_DEBUG
11295 #endif
11296 #ifdef CONFIG_IPW2100_MONITOR
11297 #endif
11298 #define POWER_MODES 5
11299 #ifdef CONFIG_IPW2100_MONITOR
11300 #endif
11301 #define MAX_POWER_STRING 80
11302 #ifdef CONFIG_IPW2100_MONITOR
11303 #endif
11304 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
11305 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
11306 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
11307 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
11308 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
11309 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
11310 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
11311 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
11312 #ifdef CONFIG_IPW2100_MONITOR
11313 #endif
11314 #ifdef CONFIG_IPW2100_MONITOR
11315 #endif
11316 #ifdef CONFIG_IPW2100_MONITOR
11317 #else
11318 #endif
11319 #ifdef CONFIG_IPW2100_MONITOR
11320 #else
11321 #endif
11322 #ifdef CONFIG_IPW2100_DEBUG
11323 #endif
11324 #define IPW2100_FW_MAJOR_VERSION 1
11325 #define IPW2100_FW_MINOR_VERSION 3
11326 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
11327 #define IPW2100_FW_MAJOR(x) (x & 0xff)
11328 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
11329 IPW2100_FW_MAJOR_VERSION)
11330 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
11331 "." __stringify(IPW2100_FW_MINOR_VERSION)
11332 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
11333 #ifdef CONFIG_IPW2100_MONITOR
11334 #endif
11335 #ifdef CONFIG_IPW2100_MONITOR
11336 #endif
11337 /* LDV_COMMENT_END_PREP */
11338
11339
11340
11341
11342 }
11343
11344 break;
11345 case 1: {
11346
11347 /** STRUCT: struct type: ethtool_ops, struct name: ipw2100_ethtool_ops **/
11348
11349
11350 /* content: static void ipw_ethtool_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)*/
11351 /* LDV_COMMENT_BEGIN_PREP */
11352 #define IPW2100_VERSION "git-1.2.2"
11353 #define DRV_NAME "ipw2100"
11354 #define DRV_VERSION IPW2100_VERSION
11355 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
11356 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
11357 #ifdef CONFIG_IPW2100_DEBUG
11358 #define IPW2100_RX_DEBUG
11359 #endif
11360 #ifdef CONFIG_PM
11361 #endif
11362 #ifdef CONFIG_IPW2100_DEBUG
11363 #define IPW_DEBUG(level, message...) \
11364 do { \
11365 if (ipw2100_debug_level & (level)) { \
11366 printk(KERN_DEBUG "ipw2100: %c %s ", \
11367 in_interrupt() ? 'I' : 'U', __func__); \
11368 printk(message); \
11369 } \
11370 } while (0)
11371 #else
11372 #define IPW_DEBUG(level, message...) do {} while (0)
11373 #endif
11374 #ifdef CONFIG_IPW2100_DEBUG
11375 #endif
11376 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
11377 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
11378 #define MAX_RESET_BACKOFF 10
11379 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
11380 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
11381 #ifndef CONFIG_PM
11382 #endif
11383 #ifdef CONFIG_PM
11384 #else
11385 #endif
11386 #ifndef CONFIG_PM
11387 #endif
11388 #define MAX_RF_KILL_CHECKS 5
11389 #define RF_KILL_CHECK_DELAY 40
11390 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
11391 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
11392 #define MAC_ASSOCIATION_READ_DELAY (HZ)
11393 #ifdef CONFIG_IPW2100_DEBUG
11394 #define IPW2100_HANDLER(v, f) { v, f, # v }
11395 #else
11396 #define IPW2100_HANDLER(v, f) { v, f }
11397 #endif
11398 #ifdef CONFIG_IPW2100_DEBUG
11399 #endif
11400 #ifdef CONFIG_IPW2100_DEBUG
11401 #endif
11402 #define SEARCH_ERROR 0xffffffff
11403 #define SEARCH_FAIL 0xfffffffe
11404 #define SEARCH_SUCCESS 0xfffffff0
11405 #define SEARCH_DISCARD 0
11406 #define SEARCH_SNAPSHOT 1
11407 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
11408 #ifdef IPW2100_DEBUG_C3
11409 #endif
11410 #ifdef IPW2100_RX_DEBUG
11411 #endif
11412 #ifdef IPW2100_DEBUG_C3
11413 #endif
11414 #ifdef IPW2100_DEBUG_C3
11415 #endif
11416 #ifdef IPW2100_RX_DEBUG
11417 #endif
11418 #ifdef IPW2100_RX_DEBUG
11419 #endif
11420 #ifdef CONFIG_IPW2100_MONITOR
11421 #endif
11422 #ifdef CONFIG_IPW2100_MONITOR
11423 #else
11424 #endif
11425 #ifdef CONFIG_IPW2100_MONITOR
11426 #endif
11427 #ifdef CONFIG_IPW2100_DEBUG
11428 #endif
11429 #ifdef CONFIG_IPW2100_DEBUG
11430 #endif
11431 #ifdef CONFIG_IPW2100_DEBUG
11432 #endif
11433 #define IPW2100_REG(x) { IPW_ ##x, #x }
11434 #define IPW2100_NIC(x, s) { x, #x, s }
11435 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
11436 #ifdef CONFIG_IPW2100_DEBUG
11437 #endif
11438 #ifdef CONFIG_IPW2100_MONITOR
11439 #endif
11440 #ifdef CONFIG_PM
11441 #endif
11442 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
11443 #ifdef CONFIG_IPW2100_DEBUG
11444 #endif
11445 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
11446 #endif
11447 #ifdef IPW2100_TX_POWER
11448 #endif
11449 #if 0
11450 #endif
11451 #ifdef CONFIG_IPW2100_DEBUG
11452 #endif
11453 #define IPW_PRIVACY_CAPABLE 0x0008
11454 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
11455 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
11456 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
11457 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
11458 #ifdef CONFIG_IPW2100_MONITOR
11459 #endif
11460 #ifdef CONFIG_IPW2100_MONITOR
11461 #endif
11462 /* LDV_COMMENT_END_PREP */
11463 /* LDV_COMMENT_FUNCTION_CALL Function from field "get_drvinfo" from driver structure with callbacks "ipw2100_ethtool_ops" */
11464 ldv_handler_precall();
11465 ipw_ethtool_get_drvinfo( var_group1, var_group2);
11466 /* LDV_COMMENT_BEGIN_PREP */
11467 #ifdef CONFIG_IPW2100_MONITOR
11468 #endif
11469 #ifdef CONFIG_IPW2100_MONITOR
11470 #endif
11471 #ifdef CONFIG_PM
11472 #endif
11473 #ifdef CONFIG_PM
11474 #endif
11475 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
11476 #ifdef CONFIG_PM
11477 #endif
11478 #ifdef CONFIG_IPW2100_DEBUG
11479 #endif
11480 #ifdef CONFIG_IPW2100_DEBUG
11481 #endif
11482 #ifdef CONFIG_IPW2100_MONITOR
11483 #endif
11484 #define POWER_MODES 5
11485 #ifdef CONFIG_IPW2100_MONITOR
11486 #endif
11487 #define MAX_POWER_STRING 80
11488 #ifdef CONFIG_IPW2100_MONITOR
11489 #endif
11490 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
11491 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
11492 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
11493 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
11494 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
11495 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
11496 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
11497 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
11498 #ifdef CONFIG_IPW2100_MONITOR
11499 #endif
11500 #ifdef CONFIG_IPW2100_MONITOR
11501 #endif
11502 #ifdef CONFIG_IPW2100_MONITOR
11503 #else
11504 #endif
11505 #ifdef CONFIG_IPW2100_MONITOR
11506 #else
11507 #endif
11508 #ifdef CONFIG_IPW2100_DEBUG
11509 #endif
11510 #define IPW2100_FW_MAJOR_VERSION 1
11511 #define IPW2100_FW_MINOR_VERSION 3
11512 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
11513 #define IPW2100_FW_MAJOR(x) (x & 0xff)
11514 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
11515 IPW2100_FW_MAJOR_VERSION)
11516 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
11517 "." __stringify(IPW2100_FW_MINOR_VERSION)
11518 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
11519 #ifdef CONFIG_IPW2100_MONITOR
11520 #endif
11521 #ifdef CONFIG_IPW2100_MONITOR
11522 #endif
11523 /* LDV_COMMENT_END_PREP */
11524
11525
11526
11527
11528 }
11529
11530 break;
11531 case 2: {
11532
11533 /** STRUCT: struct type: net_device_ops, struct name: ipw2100_netdev_ops **/
11534 if(ldv_s_ipw2100_netdev_ops_net_device_ops==0) {
11535
11536 /* content: static int ipw2100_open(struct net_device *dev)*/
11537 /* LDV_COMMENT_BEGIN_PREP */
11538 #define IPW2100_VERSION "git-1.2.2"
11539 #define DRV_NAME "ipw2100"
11540 #define DRV_VERSION IPW2100_VERSION
11541 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
11542 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
11543 #ifdef CONFIG_IPW2100_DEBUG
11544 #define IPW2100_RX_DEBUG
11545 #endif
11546 #ifdef CONFIG_PM
11547 #endif
11548 #ifdef CONFIG_IPW2100_DEBUG
11549 #define IPW_DEBUG(level, message...) \
11550 do { \
11551 if (ipw2100_debug_level & (level)) { \
11552 printk(KERN_DEBUG "ipw2100: %c %s ", \
11553 in_interrupt() ? 'I' : 'U', __func__); \
11554 printk(message); \
11555 } \
11556 } while (0)
11557 #else
11558 #define IPW_DEBUG(level, message...) do {} while (0)
11559 #endif
11560 #ifdef CONFIG_IPW2100_DEBUG
11561 #endif
11562 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
11563 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
11564 #define MAX_RESET_BACKOFF 10
11565 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
11566 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
11567 #ifndef CONFIG_PM
11568 #endif
11569 #ifdef CONFIG_PM
11570 #else
11571 #endif
11572 #ifndef CONFIG_PM
11573 #endif
11574 #define MAX_RF_KILL_CHECKS 5
11575 #define RF_KILL_CHECK_DELAY 40
11576 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
11577 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
11578 #define MAC_ASSOCIATION_READ_DELAY (HZ)
11579 #ifdef CONFIG_IPW2100_DEBUG
11580 #define IPW2100_HANDLER(v, f) { v, f, # v }
11581 #else
11582 #define IPW2100_HANDLER(v, f) { v, f }
11583 #endif
11584 #ifdef CONFIG_IPW2100_DEBUG
11585 #endif
11586 #ifdef CONFIG_IPW2100_DEBUG
11587 #endif
11588 #define SEARCH_ERROR 0xffffffff
11589 #define SEARCH_FAIL 0xfffffffe
11590 #define SEARCH_SUCCESS 0xfffffff0
11591 #define SEARCH_DISCARD 0
11592 #define SEARCH_SNAPSHOT 1
11593 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
11594 #ifdef IPW2100_DEBUG_C3
11595 #endif
11596 #ifdef IPW2100_RX_DEBUG
11597 #endif
11598 #ifdef IPW2100_DEBUG_C3
11599 #endif
11600 #ifdef IPW2100_DEBUG_C3
11601 #endif
11602 #ifdef IPW2100_RX_DEBUG
11603 #endif
11604 #ifdef IPW2100_RX_DEBUG
11605 #endif
11606 #ifdef CONFIG_IPW2100_MONITOR
11607 #endif
11608 #ifdef CONFIG_IPW2100_MONITOR
11609 #else
11610 #endif
11611 #ifdef CONFIG_IPW2100_MONITOR
11612 #endif
11613 #ifdef CONFIG_IPW2100_DEBUG
11614 #endif
11615 #ifdef CONFIG_IPW2100_DEBUG
11616 #endif
11617 #ifdef CONFIG_IPW2100_DEBUG
11618 #endif
11619 #define IPW2100_REG(x) { IPW_ ##x, #x }
11620 #define IPW2100_NIC(x, s) { x, #x, s }
11621 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
11622 #ifdef CONFIG_IPW2100_DEBUG
11623 #endif
11624 #ifdef CONFIG_IPW2100_MONITOR
11625 #endif
11626 #ifdef CONFIG_PM
11627 #endif
11628 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
11629 #ifdef CONFIG_IPW2100_DEBUG
11630 #endif
11631 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
11632 #endif
11633 #ifdef IPW2100_TX_POWER
11634 #endif
11635 #if 0
11636 #endif
11637 #ifdef CONFIG_IPW2100_DEBUG
11638 #endif
11639 #define IPW_PRIVACY_CAPABLE 0x0008
11640 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
11641 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
11642 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
11643 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
11644 #ifdef CONFIG_IPW2100_MONITOR
11645 #endif
11646 /* LDV_COMMENT_END_PREP */
11647 /* LDV_COMMENT_FUNCTION_CALL Function from field "ndo_open" from driver structure with callbacks "ipw2100_netdev_ops". Standart function test for correct return result. */
11648 ldv_handler_precall();
11649 res_ipw2100_open_136 = ipw2100_open( var_group1);
11650 ldv_check_return_value(res_ipw2100_open_136);
11651 if(res_ipw2100_open_136 < 0)
11652 goto ldv_module_exit;
11653 /* LDV_COMMENT_BEGIN_PREP */
11654 #ifdef CONFIG_IPW2100_MONITOR
11655 #endif
11656 #ifdef CONFIG_IPW2100_MONITOR
11657 #endif
11658 #ifdef CONFIG_IPW2100_MONITOR
11659 #endif
11660 #ifdef CONFIG_PM
11661 #endif
11662 #ifdef CONFIG_PM
11663 #endif
11664 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
11665 #ifdef CONFIG_PM
11666 #endif
11667 #ifdef CONFIG_IPW2100_DEBUG
11668 #endif
11669 #ifdef CONFIG_IPW2100_DEBUG
11670 #endif
11671 #ifdef CONFIG_IPW2100_MONITOR
11672 #endif
11673 #define POWER_MODES 5
11674 #ifdef CONFIG_IPW2100_MONITOR
11675 #endif
11676 #define MAX_POWER_STRING 80
11677 #ifdef CONFIG_IPW2100_MONITOR
11678 #endif
11679 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
11680 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
11681 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
11682 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
11683 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
11684 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
11685 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
11686 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
11687 #ifdef CONFIG_IPW2100_MONITOR
11688 #endif
11689 #ifdef CONFIG_IPW2100_MONITOR
11690 #endif
11691 #ifdef CONFIG_IPW2100_MONITOR
11692 #else
11693 #endif
11694 #ifdef CONFIG_IPW2100_MONITOR
11695 #else
11696 #endif
11697 #ifdef CONFIG_IPW2100_DEBUG
11698 #endif
11699 #define IPW2100_FW_MAJOR_VERSION 1
11700 #define IPW2100_FW_MINOR_VERSION 3
11701 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
11702 #define IPW2100_FW_MAJOR(x) (x & 0xff)
11703 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
11704 IPW2100_FW_MAJOR_VERSION)
11705 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
11706 "." __stringify(IPW2100_FW_MINOR_VERSION)
11707 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
11708 #ifdef CONFIG_IPW2100_MONITOR
11709 #endif
11710 #ifdef CONFIG_IPW2100_MONITOR
11711 #endif
11712 /* LDV_COMMENT_END_PREP */
11713 ldv_s_ipw2100_netdev_ops_net_device_ops++;
11714
11715 }
11716
11717 }
11718
11719 break;
11720 case 3: {
11721
11722 /** STRUCT: struct type: net_device_ops, struct name: ipw2100_netdev_ops **/
11723 if(ldv_s_ipw2100_netdev_ops_net_device_ops==1) {
11724
11725 /* content: static int ipw2100_close(struct net_device *dev)*/
11726 /* LDV_COMMENT_BEGIN_PREP */
11727 #define IPW2100_VERSION "git-1.2.2"
11728 #define DRV_NAME "ipw2100"
11729 #define DRV_VERSION IPW2100_VERSION
11730 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
11731 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
11732 #ifdef CONFIG_IPW2100_DEBUG
11733 #define IPW2100_RX_DEBUG
11734 #endif
11735 #ifdef CONFIG_PM
11736 #endif
11737 #ifdef CONFIG_IPW2100_DEBUG
11738 #define IPW_DEBUG(level, message...) \
11739 do { \
11740 if (ipw2100_debug_level & (level)) { \
11741 printk(KERN_DEBUG "ipw2100: %c %s ", \
11742 in_interrupt() ? 'I' : 'U', __func__); \
11743 printk(message); \
11744 } \
11745 } while (0)
11746 #else
11747 #define IPW_DEBUG(level, message...) do {} while (0)
11748 #endif
11749 #ifdef CONFIG_IPW2100_DEBUG
11750 #endif
11751 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
11752 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
11753 #define MAX_RESET_BACKOFF 10
11754 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
11755 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
11756 #ifndef CONFIG_PM
11757 #endif
11758 #ifdef CONFIG_PM
11759 #else
11760 #endif
11761 #ifndef CONFIG_PM
11762 #endif
11763 #define MAX_RF_KILL_CHECKS 5
11764 #define RF_KILL_CHECK_DELAY 40
11765 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
11766 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
11767 #define MAC_ASSOCIATION_READ_DELAY (HZ)
11768 #ifdef CONFIG_IPW2100_DEBUG
11769 #define IPW2100_HANDLER(v, f) { v, f, # v }
11770 #else
11771 #define IPW2100_HANDLER(v, f) { v, f }
11772 #endif
11773 #ifdef CONFIG_IPW2100_DEBUG
11774 #endif
11775 #ifdef CONFIG_IPW2100_DEBUG
11776 #endif
11777 #define SEARCH_ERROR 0xffffffff
11778 #define SEARCH_FAIL 0xfffffffe
11779 #define SEARCH_SUCCESS 0xfffffff0
11780 #define SEARCH_DISCARD 0
11781 #define SEARCH_SNAPSHOT 1
11782 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
11783 #ifdef IPW2100_DEBUG_C3
11784 #endif
11785 #ifdef IPW2100_RX_DEBUG
11786 #endif
11787 #ifdef IPW2100_DEBUG_C3
11788 #endif
11789 #ifdef IPW2100_DEBUG_C3
11790 #endif
11791 #ifdef IPW2100_RX_DEBUG
11792 #endif
11793 #ifdef IPW2100_RX_DEBUG
11794 #endif
11795 #ifdef CONFIG_IPW2100_MONITOR
11796 #endif
11797 #ifdef CONFIG_IPW2100_MONITOR
11798 #else
11799 #endif
11800 #ifdef CONFIG_IPW2100_MONITOR
11801 #endif
11802 #ifdef CONFIG_IPW2100_DEBUG
11803 #endif
11804 #ifdef CONFIG_IPW2100_DEBUG
11805 #endif
11806 #ifdef CONFIG_IPW2100_DEBUG
11807 #endif
11808 #define IPW2100_REG(x) { IPW_ ##x, #x }
11809 #define IPW2100_NIC(x, s) { x, #x, s }
11810 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
11811 #ifdef CONFIG_IPW2100_DEBUG
11812 #endif
11813 #ifdef CONFIG_IPW2100_MONITOR
11814 #endif
11815 #ifdef CONFIG_PM
11816 #endif
11817 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
11818 #ifdef CONFIG_IPW2100_DEBUG
11819 #endif
11820 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
11821 #endif
11822 #ifdef IPW2100_TX_POWER
11823 #endif
11824 #if 0
11825 #endif
11826 #ifdef CONFIG_IPW2100_DEBUG
11827 #endif
11828 #define IPW_PRIVACY_CAPABLE 0x0008
11829 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
11830 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
11831 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
11832 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
11833 #ifdef CONFIG_IPW2100_MONITOR
11834 #endif
11835 /* LDV_COMMENT_END_PREP */
11836 /* LDV_COMMENT_FUNCTION_CALL Function from field "ndo_stop" from driver structure with callbacks "ipw2100_netdev_ops". Standart function test for correct return result. */
11837 ldv_handler_precall();
11838 res_ipw2100_close_137 = ipw2100_close( var_group1);
11839 ldv_check_return_value(res_ipw2100_close_137);
11840 if(res_ipw2100_close_137)
11841 goto ldv_module_exit;
11842 /* LDV_COMMENT_BEGIN_PREP */
11843 #ifdef CONFIG_IPW2100_MONITOR
11844 #endif
11845 #ifdef CONFIG_IPW2100_MONITOR
11846 #endif
11847 #ifdef CONFIG_IPW2100_MONITOR
11848 #endif
11849 #ifdef CONFIG_PM
11850 #endif
11851 #ifdef CONFIG_PM
11852 #endif
11853 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
11854 #ifdef CONFIG_PM
11855 #endif
11856 #ifdef CONFIG_IPW2100_DEBUG
11857 #endif
11858 #ifdef CONFIG_IPW2100_DEBUG
11859 #endif
11860 #ifdef CONFIG_IPW2100_MONITOR
11861 #endif
11862 #define POWER_MODES 5
11863 #ifdef CONFIG_IPW2100_MONITOR
11864 #endif
11865 #define MAX_POWER_STRING 80
11866 #ifdef CONFIG_IPW2100_MONITOR
11867 #endif
11868 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
11869 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
11870 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
11871 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
11872 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
11873 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
11874 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
11875 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
11876 #ifdef CONFIG_IPW2100_MONITOR
11877 #endif
11878 #ifdef CONFIG_IPW2100_MONITOR
11879 #endif
11880 #ifdef CONFIG_IPW2100_MONITOR
11881 #else
11882 #endif
11883 #ifdef CONFIG_IPW2100_MONITOR
11884 #else
11885 #endif
11886 #ifdef CONFIG_IPW2100_DEBUG
11887 #endif
11888 #define IPW2100_FW_MAJOR_VERSION 1
11889 #define IPW2100_FW_MINOR_VERSION 3
11890 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
11891 #define IPW2100_FW_MAJOR(x) (x & 0xff)
11892 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
11893 IPW2100_FW_MAJOR_VERSION)
11894 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
11895 "." __stringify(IPW2100_FW_MINOR_VERSION)
11896 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
11897 #ifdef CONFIG_IPW2100_MONITOR
11898 #endif
11899 #ifdef CONFIG_IPW2100_MONITOR
11900 #endif
11901 /* LDV_COMMENT_END_PREP */
11902 ldv_s_ipw2100_netdev_ops_net_device_ops=0;
11903
11904 }
11905
11906 }
11907
11908 break;
11909 case 4: {
11910
11911 /** STRUCT: struct type: net_device_ops, struct name: ipw2100_netdev_ops **/
11912
11913
11914 /* content: static void ipw2100_tx_timeout(struct net_device *dev)*/
11915 /* LDV_COMMENT_BEGIN_PREP */
11916 #define IPW2100_VERSION "git-1.2.2"
11917 #define DRV_NAME "ipw2100"
11918 #define DRV_VERSION IPW2100_VERSION
11919 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
11920 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
11921 #ifdef CONFIG_IPW2100_DEBUG
11922 #define IPW2100_RX_DEBUG
11923 #endif
11924 #ifdef CONFIG_PM
11925 #endif
11926 #ifdef CONFIG_IPW2100_DEBUG
11927 #define IPW_DEBUG(level, message...) \
11928 do { \
11929 if (ipw2100_debug_level & (level)) { \
11930 printk(KERN_DEBUG "ipw2100: %c %s ", \
11931 in_interrupt() ? 'I' : 'U', __func__); \
11932 printk(message); \
11933 } \
11934 } while (0)
11935 #else
11936 #define IPW_DEBUG(level, message...) do {} while (0)
11937 #endif
11938 #ifdef CONFIG_IPW2100_DEBUG
11939 #endif
11940 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
11941 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
11942 #define MAX_RESET_BACKOFF 10
11943 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
11944 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
11945 #ifndef CONFIG_PM
11946 #endif
11947 #ifdef CONFIG_PM
11948 #else
11949 #endif
11950 #ifndef CONFIG_PM
11951 #endif
11952 #define MAX_RF_KILL_CHECKS 5
11953 #define RF_KILL_CHECK_DELAY 40
11954 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
11955 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
11956 #define MAC_ASSOCIATION_READ_DELAY (HZ)
11957 #ifdef CONFIG_IPW2100_DEBUG
11958 #define IPW2100_HANDLER(v, f) { v, f, # v }
11959 #else
11960 #define IPW2100_HANDLER(v, f) { v, f }
11961 #endif
11962 #ifdef CONFIG_IPW2100_DEBUG
11963 #endif
11964 #ifdef CONFIG_IPW2100_DEBUG
11965 #endif
11966 #define SEARCH_ERROR 0xffffffff
11967 #define SEARCH_FAIL 0xfffffffe
11968 #define SEARCH_SUCCESS 0xfffffff0
11969 #define SEARCH_DISCARD 0
11970 #define SEARCH_SNAPSHOT 1
11971 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
11972 #ifdef IPW2100_DEBUG_C3
11973 #endif
11974 #ifdef IPW2100_RX_DEBUG
11975 #endif
11976 #ifdef IPW2100_DEBUG_C3
11977 #endif
11978 #ifdef IPW2100_DEBUG_C3
11979 #endif
11980 #ifdef IPW2100_RX_DEBUG
11981 #endif
11982 #ifdef IPW2100_RX_DEBUG
11983 #endif
11984 #ifdef CONFIG_IPW2100_MONITOR
11985 #endif
11986 #ifdef CONFIG_IPW2100_MONITOR
11987 #else
11988 #endif
11989 #ifdef CONFIG_IPW2100_MONITOR
11990 #endif
11991 #ifdef CONFIG_IPW2100_DEBUG
11992 #endif
11993 #ifdef CONFIG_IPW2100_DEBUG
11994 #endif
11995 #ifdef CONFIG_IPW2100_DEBUG
11996 #endif
11997 #define IPW2100_REG(x) { IPW_ ##x, #x }
11998 #define IPW2100_NIC(x, s) { x, #x, s }
11999 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
12000 #ifdef CONFIG_IPW2100_DEBUG
12001 #endif
12002 #ifdef CONFIG_IPW2100_MONITOR
12003 #endif
12004 #ifdef CONFIG_PM
12005 #endif
12006 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
12007 #ifdef CONFIG_IPW2100_DEBUG
12008 #endif
12009 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
12010 #endif
12011 #ifdef IPW2100_TX_POWER
12012 #endif
12013 #if 0
12014 #endif
12015 #ifdef CONFIG_IPW2100_DEBUG
12016 #endif
12017 #define IPW_PRIVACY_CAPABLE 0x0008
12018 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
12019 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
12020 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
12021 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
12022 #ifdef CONFIG_IPW2100_MONITOR
12023 #endif
12024 /* LDV_COMMENT_END_PREP */
12025 /* LDV_COMMENT_FUNCTION_CALL Function from field "ndo_tx_timeout" from driver structure with callbacks "ipw2100_netdev_ops" */
12026 ldv_handler_precall();
12027 ipw2100_tx_timeout( var_group1);
12028 /* LDV_COMMENT_BEGIN_PREP */
12029 #ifdef CONFIG_IPW2100_MONITOR
12030 #endif
12031 #ifdef CONFIG_IPW2100_MONITOR
12032 #endif
12033 #ifdef CONFIG_PM
12034 #endif
12035 #ifdef CONFIG_PM
12036 #endif
12037 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
12038 #ifdef CONFIG_PM
12039 #endif
12040 #ifdef CONFIG_IPW2100_DEBUG
12041 #endif
12042 #ifdef CONFIG_IPW2100_DEBUG
12043 #endif
12044 #ifdef CONFIG_IPW2100_MONITOR
12045 #endif
12046 #define POWER_MODES 5
12047 #ifdef CONFIG_IPW2100_MONITOR
12048 #endif
12049 #define MAX_POWER_STRING 80
12050 #ifdef CONFIG_IPW2100_MONITOR
12051 #endif
12052 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
12053 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
12054 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
12055 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
12056 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
12057 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
12058 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
12059 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
12060 #ifdef CONFIG_IPW2100_MONITOR
12061 #endif
12062 #ifdef CONFIG_IPW2100_MONITOR
12063 #endif
12064 #ifdef CONFIG_IPW2100_MONITOR
12065 #else
12066 #endif
12067 #ifdef CONFIG_IPW2100_MONITOR
12068 #else
12069 #endif
12070 #ifdef CONFIG_IPW2100_DEBUG
12071 #endif
12072 #define IPW2100_FW_MAJOR_VERSION 1
12073 #define IPW2100_FW_MINOR_VERSION 3
12074 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
12075 #define IPW2100_FW_MAJOR(x) (x & 0xff)
12076 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
12077 IPW2100_FW_MAJOR_VERSION)
12078 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
12079 "." __stringify(IPW2100_FW_MINOR_VERSION)
12080 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
12081 #ifdef CONFIG_IPW2100_MONITOR
12082 #endif
12083 #ifdef CONFIG_IPW2100_MONITOR
12084 #endif
12085 /* LDV_COMMENT_END_PREP */
12086
12087
12088
12089
12090 }
12091
12092 break;
12093 case 5: {
12094
12095 /** STRUCT: struct type: net_device_ops, struct name: ipw2100_netdev_ops **/
12096
12097
12098 /* content: static int ipw2100_set_address(struct net_device *dev, void *p)*/
12099 /* LDV_COMMENT_BEGIN_PREP */
12100 #define IPW2100_VERSION "git-1.2.2"
12101 #define DRV_NAME "ipw2100"
12102 #define DRV_VERSION IPW2100_VERSION
12103 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
12104 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
12105 #ifdef CONFIG_IPW2100_DEBUG
12106 #define IPW2100_RX_DEBUG
12107 #endif
12108 #ifdef CONFIG_PM
12109 #endif
12110 #ifdef CONFIG_IPW2100_DEBUG
12111 #define IPW_DEBUG(level, message...) \
12112 do { \
12113 if (ipw2100_debug_level & (level)) { \
12114 printk(KERN_DEBUG "ipw2100: %c %s ", \
12115 in_interrupt() ? 'I' : 'U', __func__); \
12116 printk(message); \
12117 } \
12118 } while (0)
12119 #else
12120 #define IPW_DEBUG(level, message...) do {} while (0)
12121 #endif
12122 #ifdef CONFIG_IPW2100_DEBUG
12123 #endif
12124 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
12125 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
12126 #define MAX_RESET_BACKOFF 10
12127 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
12128 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
12129 #ifndef CONFIG_PM
12130 #endif
12131 #ifdef CONFIG_PM
12132 #else
12133 #endif
12134 #ifndef CONFIG_PM
12135 #endif
12136 #define MAX_RF_KILL_CHECKS 5
12137 #define RF_KILL_CHECK_DELAY 40
12138 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
12139 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
12140 #define MAC_ASSOCIATION_READ_DELAY (HZ)
12141 #ifdef CONFIG_IPW2100_DEBUG
12142 #define IPW2100_HANDLER(v, f) { v, f, # v }
12143 #else
12144 #define IPW2100_HANDLER(v, f) { v, f }
12145 #endif
12146 #ifdef CONFIG_IPW2100_DEBUG
12147 #endif
12148 #ifdef CONFIG_IPW2100_DEBUG
12149 #endif
12150 #define SEARCH_ERROR 0xffffffff
12151 #define SEARCH_FAIL 0xfffffffe
12152 #define SEARCH_SUCCESS 0xfffffff0
12153 #define SEARCH_DISCARD 0
12154 #define SEARCH_SNAPSHOT 1
12155 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
12156 #ifdef IPW2100_DEBUG_C3
12157 #endif
12158 #ifdef IPW2100_RX_DEBUG
12159 #endif
12160 #ifdef IPW2100_DEBUG_C3
12161 #endif
12162 #ifdef IPW2100_DEBUG_C3
12163 #endif
12164 #ifdef IPW2100_RX_DEBUG
12165 #endif
12166 #ifdef IPW2100_RX_DEBUG
12167 #endif
12168 #ifdef CONFIG_IPW2100_MONITOR
12169 #endif
12170 #ifdef CONFIG_IPW2100_MONITOR
12171 #else
12172 #endif
12173 #ifdef CONFIG_IPW2100_MONITOR
12174 #endif
12175 #ifdef CONFIG_IPW2100_DEBUG
12176 #endif
12177 #ifdef CONFIG_IPW2100_DEBUG
12178 #endif
12179 #ifdef CONFIG_IPW2100_DEBUG
12180 #endif
12181 #define IPW2100_REG(x) { IPW_ ##x, #x }
12182 #define IPW2100_NIC(x, s) { x, #x, s }
12183 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
12184 #ifdef CONFIG_IPW2100_DEBUG
12185 #endif
12186 #ifdef CONFIG_IPW2100_MONITOR
12187 #endif
12188 #ifdef CONFIG_PM
12189 #endif
12190 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
12191 #ifdef CONFIG_IPW2100_DEBUG
12192 #endif
12193 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
12194 #endif
12195 #ifdef IPW2100_TX_POWER
12196 #endif
12197 #if 0
12198 #endif
12199 #ifdef CONFIG_IPW2100_DEBUG
12200 #endif
12201 #define IPW_PRIVACY_CAPABLE 0x0008
12202 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
12203 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
12204 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
12205 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
12206 #ifdef CONFIG_IPW2100_MONITOR
12207 #endif
12208 /* LDV_COMMENT_END_PREP */
12209 /* LDV_COMMENT_FUNCTION_CALL Function from field "ndo_set_mac_address" from driver structure with callbacks "ipw2100_netdev_ops" */
12210 ldv_handler_precall();
12211 ipw2100_set_address( var_group1, var_ipw2100_set_address_135_p1);
12212 /* LDV_COMMENT_BEGIN_PREP */
12213 #ifdef CONFIG_IPW2100_MONITOR
12214 #endif
12215 #ifdef CONFIG_IPW2100_MONITOR
12216 #endif
12217 #ifdef CONFIG_IPW2100_MONITOR
12218 #endif
12219 #ifdef CONFIG_PM
12220 #endif
12221 #ifdef CONFIG_PM
12222 #endif
12223 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
12224 #ifdef CONFIG_PM
12225 #endif
12226 #ifdef CONFIG_IPW2100_DEBUG
12227 #endif
12228 #ifdef CONFIG_IPW2100_DEBUG
12229 #endif
12230 #ifdef CONFIG_IPW2100_MONITOR
12231 #endif
12232 #define POWER_MODES 5
12233 #ifdef CONFIG_IPW2100_MONITOR
12234 #endif
12235 #define MAX_POWER_STRING 80
12236 #ifdef CONFIG_IPW2100_MONITOR
12237 #endif
12238 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
12239 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
12240 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
12241 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
12242 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
12243 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
12244 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
12245 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
12246 #ifdef CONFIG_IPW2100_MONITOR
12247 #endif
12248 #ifdef CONFIG_IPW2100_MONITOR
12249 #endif
12250 #ifdef CONFIG_IPW2100_MONITOR
12251 #else
12252 #endif
12253 #ifdef CONFIG_IPW2100_MONITOR
12254 #else
12255 #endif
12256 #ifdef CONFIG_IPW2100_DEBUG
12257 #endif
12258 #define IPW2100_FW_MAJOR_VERSION 1
12259 #define IPW2100_FW_MINOR_VERSION 3
12260 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
12261 #define IPW2100_FW_MAJOR(x) (x & 0xff)
12262 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
12263 IPW2100_FW_MAJOR_VERSION)
12264 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
12265 "." __stringify(IPW2100_FW_MINOR_VERSION)
12266 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
12267 #ifdef CONFIG_IPW2100_MONITOR
12268 #endif
12269 #ifdef CONFIG_IPW2100_MONITOR
12270 #endif
12271 /* LDV_COMMENT_END_PREP */
12272
12273
12274
12275
12276 }
12277
12278 break;
12279 case 6: {
12280
12281 /** STRUCT: struct type: pci_driver, struct name: ipw2100_pci_driver **/
12282 if(ldv_s_ipw2100_pci_driver_pci_driver==0) {
12283
12284 /* content: static int ipw2100_pci_init_one(struct pci_dev *pci_dev, const struct pci_device_id *ent)*/
12285 /* LDV_COMMENT_BEGIN_PREP */
12286 #define IPW2100_VERSION "git-1.2.2"
12287 #define DRV_NAME "ipw2100"
12288 #define DRV_VERSION IPW2100_VERSION
12289 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
12290 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
12291 #ifdef CONFIG_IPW2100_DEBUG
12292 #define IPW2100_RX_DEBUG
12293 #endif
12294 #ifdef CONFIG_PM
12295 #endif
12296 #ifdef CONFIG_IPW2100_DEBUG
12297 #define IPW_DEBUG(level, message...) \
12298 do { \
12299 if (ipw2100_debug_level & (level)) { \
12300 printk(KERN_DEBUG "ipw2100: %c %s ", \
12301 in_interrupt() ? 'I' : 'U', __func__); \
12302 printk(message); \
12303 } \
12304 } while (0)
12305 #else
12306 #define IPW_DEBUG(level, message...) do {} while (0)
12307 #endif
12308 #ifdef CONFIG_IPW2100_DEBUG
12309 #endif
12310 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
12311 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
12312 #define MAX_RESET_BACKOFF 10
12313 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
12314 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
12315 #ifndef CONFIG_PM
12316 #endif
12317 #ifdef CONFIG_PM
12318 #else
12319 #endif
12320 #ifndef CONFIG_PM
12321 #endif
12322 #define MAX_RF_KILL_CHECKS 5
12323 #define RF_KILL_CHECK_DELAY 40
12324 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
12325 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
12326 #define MAC_ASSOCIATION_READ_DELAY (HZ)
12327 #ifdef CONFIG_IPW2100_DEBUG
12328 #define IPW2100_HANDLER(v, f) { v, f, # v }
12329 #else
12330 #define IPW2100_HANDLER(v, f) { v, f }
12331 #endif
12332 #ifdef CONFIG_IPW2100_DEBUG
12333 #endif
12334 #ifdef CONFIG_IPW2100_DEBUG
12335 #endif
12336 #define SEARCH_ERROR 0xffffffff
12337 #define SEARCH_FAIL 0xfffffffe
12338 #define SEARCH_SUCCESS 0xfffffff0
12339 #define SEARCH_DISCARD 0
12340 #define SEARCH_SNAPSHOT 1
12341 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
12342 #ifdef IPW2100_DEBUG_C3
12343 #endif
12344 #ifdef IPW2100_RX_DEBUG
12345 #endif
12346 #ifdef IPW2100_DEBUG_C3
12347 #endif
12348 #ifdef IPW2100_DEBUG_C3
12349 #endif
12350 #ifdef IPW2100_RX_DEBUG
12351 #endif
12352 #ifdef IPW2100_RX_DEBUG
12353 #endif
12354 #ifdef CONFIG_IPW2100_MONITOR
12355 #endif
12356 #ifdef CONFIG_IPW2100_MONITOR
12357 #else
12358 #endif
12359 #ifdef CONFIG_IPW2100_MONITOR
12360 #endif
12361 #ifdef CONFIG_IPW2100_DEBUG
12362 #endif
12363 #ifdef CONFIG_IPW2100_DEBUG
12364 #endif
12365 #ifdef CONFIG_IPW2100_DEBUG
12366 #endif
12367 #define IPW2100_REG(x) { IPW_ ##x, #x }
12368 #define IPW2100_NIC(x, s) { x, #x, s }
12369 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
12370 #ifdef CONFIG_IPW2100_DEBUG
12371 #endif
12372 #ifdef CONFIG_IPW2100_MONITOR
12373 #endif
12374 #ifdef CONFIG_PM
12375 #endif
12376 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
12377 #ifdef CONFIG_IPW2100_DEBUG
12378 #endif
12379 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
12380 #endif
12381 #ifdef IPW2100_TX_POWER
12382 #endif
12383 #if 0
12384 #endif
12385 #ifdef CONFIG_IPW2100_DEBUG
12386 #endif
12387 #define IPW_PRIVACY_CAPABLE 0x0008
12388 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
12389 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
12390 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
12391 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
12392 #ifdef CONFIG_IPW2100_MONITOR
12393 #endif
12394 #ifdef CONFIG_IPW2100_MONITOR
12395 #endif
12396 #ifdef CONFIG_IPW2100_MONITOR
12397 #endif
12398 #ifdef CONFIG_IPW2100_MONITOR
12399 #endif
12400 /* LDV_COMMENT_END_PREP */
12401 /* LDV_COMMENT_FUNCTION_CALL Function from field "probe" from driver structure with callbacks "ipw2100_pci_driver". Standart function test for correct return result. */
12402 res_ipw2100_pci_init_one_147 = ipw2100_pci_init_one( var_group3, var_ipw2100_pci_init_one_147_p1);
12403 ldv_check_return_value(res_ipw2100_pci_init_one_147);
12404 ldv_check_return_value_probe(res_ipw2100_pci_init_one_147);
12405 if(res_ipw2100_pci_init_one_147)
12406 goto ldv_module_exit;
12407 /* LDV_COMMENT_BEGIN_PREP */
12408 #ifdef CONFIG_PM
12409 #endif
12410 #ifdef CONFIG_PM
12411 #endif
12412 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
12413 #ifdef CONFIG_PM
12414 #endif
12415 #ifdef CONFIG_IPW2100_DEBUG
12416 #endif
12417 #ifdef CONFIG_IPW2100_DEBUG
12418 #endif
12419 #ifdef CONFIG_IPW2100_MONITOR
12420 #endif
12421 #define POWER_MODES 5
12422 #ifdef CONFIG_IPW2100_MONITOR
12423 #endif
12424 #define MAX_POWER_STRING 80
12425 #ifdef CONFIG_IPW2100_MONITOR
12426 #endif
12427 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
12428 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
12429 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
12430 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
12431 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
12432 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
12433 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
12434 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
12435 #ifdef CONFIG_IPW2100_MONITOR
12436 #endif
12437 #ifdef CONFIG_IPW2100_MONITOR
12438 #endif
12439 #ifdef CONFIG_IPW2100_MONITOR
12440 #else
12441 #endif
12442 #ifdef CONFIG_IPW2100_MONITOR
12443 #else
12444 #endif
12445 #ifdef CONFIG_IPW2100_DEBUG
12446 #endif
12447 #define IPW2100_FW_MAJOR_VERSION 1
12448 #define IPW2100_FW_MINOR_VERSION 3
12449 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
12450 #define IPW2100_FW_MAJOR(x) (x & 0xff)
12451 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
12452 IPW2100_FW_MAJOR_VERSION)
12453 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
12454 "." __stringify(IPW2100_FW_MINOR_VERSION)
12455 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
12456 #ifdef CONFIG_IPW2100_MONITOR
12457 #endif
12458 #ifdef CONFIG_IPW2100_MONITOR
12459 #endif
12460 /* LDV_COMMENT_END_PREP */
12461 ldv_s_ipw2100_pci_driver_pci_driver++;
12462
12463 }
12464
12465 }
12466
12467 break;
12468 case 7: {
12469
12470 /** STRUCT: struct type: pci_driver, struct name: ipw2100_pci_driver **/
12471 if(ldv_s_ipw2100_pci_driver_pci_driver==1) {
12472
12473 /* content: static void ipw2100_pci_remove_one(struct pci_dev *pci_dev)*/
12474 /* LDV_COMMENT_BEGIN_PREP */
12475 #define IPW2100_VERSION "git-1.2.2"
12476 #define DRV_NAME "ipw2100"
12477 #define DRV_VERSION IPW2100_VERSION
12478 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
12479 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
12480 #ifdef CONFIG_IPW2100_DEBUG
12481 #define IPW2100_RX_DEBUG
12482 #endif
12483 #ifdef CONFIG_PM
12484 #endif
12485 #ifdef CONFIG_IPW2100_DEBUG
12486 #define IPW_DEBUG(level, message...) \
12487 do { \
12488 if (ipw2100_debug_level & (level)) { \
12489 printk(KERN_DEBUG "ipw2100: %c %s ", \
12490 in_interrupt() ? 'I' : 'U', __func__); \
12491 printk(message); \
12492 } \
12493 } while (0)
12494 #else
12495 #define IPW_DEBUG(level, message...) do {} while (0)
12496 #endif
12497 #ifdef CONFIG_IPW2100_DEBUG
12498 #endif
12499 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
12500 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
12501 #define MAX_RESET_BACKOFF 10
12502 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
12503 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
12504 #ifndef CONFIG_PM
12505 #endif
12506 #ifdef CONFIG_PM
12507 #else
12508 #endif
12509 #ifndef CONFIG_PM
12510 #endif
12511 #define MAX_RF_KILL_CHECKS 5
12512 #define RF_KILL_CHECK_DELAY 40
12513 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
12514 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
12515 #define MAC_ASSOCIATION_READ_DELAY (HZ)
12516 #ifdef CONFIG_IPW2100_DEBUG
12517 #define IPW2100_HANDLER(v, f) { v, f, # v }
12518 #else
12519 #define IPW2100_HANDLER(v, f) { v, f }
12520 #endif
12521 #ifdef CONFIG_IPW2100_DEBUG
12522 #endif
12523 #ifdef CONFIG_IPW2100_DEBUG
12524 #endif
12525 #define SEARCH_ERROR 0xffffffff
12526 #define SEARCH_FAIL 0xfffffffe
12527 #define SEARCH_SUCCESS 0xfffffff0
12528 #define SEARCH_DISCARD 0
12529 #define SEARCH_SNAPSHOT 1
12530 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
12531 #ifdef IPW2100_DEBUG_C3
12532 #endif
12533 #ifdef IPW2100_RX_DEBUG
12534 #endif
12535 #ifdef IPW2100_DEBUG_C3
12536 #endif
12537 #ifdef IPW2100_DEBUG_C3
12538 #endif
12539 #ifdef IPW2100_RX_DEBUG
12540 #endif
12541 #ifdef IPW2100_RX_DEBUG
12542 #endif
12543 #ifdef CONFIG_IPW2100_MONITOR
12544 #endif
12545 #ifdef CONFIG_IPW2100_MONITOR
12546 #else
12547 #endif
12548 #ifdef CONFIG_IPW2100_MONITOR
12549 #endif
12550 #ifdef CONFIG_IPW2100_DEBUG
12551 #endif
12552 #ifdef CONFIG_IPW2100_DEBUG
12553 #endif
12554 #ifdef CONFIG_IPW2100_DEBUG
12555 #endif
12556 #define IPW2100_REG(x) { IPW_ ##x, #x }
12557 #define IPW2100_NIC(x, s) { x, #x, s }
12558 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
12559 #ifdef CONFIG_IPW2100_DEBUG
12560 #endif
12561 #ifdef CONFIG_IPW2100_MONITOR
12562 #endif
12563 #ifdef CONFIG_PM
12564 #endif
12565 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
12566 #ifdef CONFIG_IPW2100_DEBUG
12567 #endif
12568 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
12569 #endif
12570 #ifdef IPW2100_TX_POWER
12571 #endif
12572 #if 0
12573 #endif
12574 #ifdef CONFIG_IPW2100_DEBUG
12575 #endif
12576 #define IPW_PRIVACY_CAPABLE 0x0008
12577 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
12578 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
12579 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
12580 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
12581 #ifdef CONFIG_IPW2100_MONITOR
12582 #endif
12583 #ifdef CONFIG_IPW2100_MONITOR
12584 #endif
12585 #ifdef CONFIG_IPW2100_MONITOR
12586 #endif
12587 #ifdef CONFIG_IPW2100_MONITOR
12588 #endif
12589 /* LDV_COMMENT_END_PREP */
12590 /* LDV_COMMENT_FUNCTION_CALL Function from field "remove" from driver structure with callbacks "ipw2100_pci_driver" */
12591 ldv_handler_precall();
12592 ipw2100_pci_remove_one( var_group3);
12593 /* LDV_COMMENT_BEGIN_PREP */
12594 #ifdef CONFIG_PM
12595 #endif
12596 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
12597 #ifdef CONFIG_PM
12598 #endif
12599 #ifdef CONFIG_IPW2100_DEBUG
12600 #endif
12601 #ifdef CONFIG_IPW2100_DEBUG
12602 #endif
12603 #ifdef CONFIG_IPW2100_MONITOR
12604 #endif
12605 #define POWER_MODES 5
12606 #ifdef CONFIG_IPW2100_MONITOR
12607 #endif
12608 #define MAX_POWER_STRING 80
12609 #ifdef CONFIG_IPW2100_MONITOR
12610 #endif
12611 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
12612 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
12613 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
12614 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
12615 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
12616 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
12617 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
12618 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
12619 #ifdef CONFIG_IPW2100_MONITOR
12620 #endif
12621 #ifdef CONFIG_IPW2100_MONITOR
12622 #endif
12623 #ifdef CONFIG_IPW2100_MONITOR
12624 #else
12625 #endif
12626 #ifdef CONFIG_IPW2100_MONITOR
12627 #else
12628 #endif
12629 #ifdef CONFIG_IPW2100_DEBUG
12630 #endif
12631 #define IPW2100_FW_MAJOR_VERSION 1
12632 #define IPW2100_FW_MINOR_VERSION 3
12633 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
12634 #define IPW2100_FW_MAJOR(x) (x & 0xff)
12635 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
12636 IPW2100_FW_MAJOR_VERSION)
12637 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
12638 "." __stringify(IPW2100_FW_MINOR_VERSION)
12639 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
12640 #ifdef CONFIG_IPW2100_MONITOR
12641 #endif
12642 #ifdef CONFIG_IPW2100_MONITOR
12643 #endif
12644 /* LDV_COMMENT_END_PREP */
12645 ldv_s_ipw2100_pci_driver_pci_driver=0;
12646
12647 }
12648
12649 }
12650
12651 break;
12652 case 8: {
12653
12654 /** STRUCT: struct type: pci_driver, struct name: ipw2100_pci_driver **/
12655
12656
12657 /* content: static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state)*/
12658 /* LDV_COMMENT_BEGIN_PREP */
12659 #define IPW2100_VERSION "git-1.2.2"
12660 #define DRV_NAME "ipw2100"
12661 #define DRV_VERSION IPW2100_VERSION
12662 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
12663 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
12664 #ifdef CONFIG_IPW2100_DEBUG
12665 #define IPW2100_RX_DEBUG
12666 #endif
12667 #ifdef CONFIG_PM
12668 #endif
12669 #ifdef CONFIG_IPW2100_DEBUG
12670 #define IPW_DEBUG(level, message...) \
12671 do { \
12672 if (ipw2100_debug_level & (level)) { \
12673 printk(KERN_DEBUG "ipw2100: %c %s ", \
12674 in_interrupt() ? 'I' : 'U', __func__); \
12675 printk(message); \
12676 } \
12677 } while (0)
12678 #else
12679 #define IPW_DEBUG(level, message...) do {} while (0)
12680 #endif
12681 #ifdef CONFIG_IPW2100_DEBUG
12682 #endif
12683 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
12684 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
12685 #define MAX_RESET_BACKOFF 10
12686 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
12687 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
12688 #ifndef CONFIG_PM
12689 #endif
12690 #ifdef CONFIG_PM
12691 #else
12692 #endif
12693 #ifndef CONFIG_PM
12694 #endif
12695 #define MAX_RF_KILL_CHECKS 5
12696 #define RF_KILL_CHECK_DELAY 40
12697 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
12698 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
12699 #define MAC_ASSOCIATION_READ_DELAY (HZ)
12700 #ifdef CONFIG_IPW2100_DEBUG
12701 #define IPW2100_HANDLER(v, f) { v, f, # v }
12702 #else
12703 #define IPW2100_HANDLER(v, f) { v, f }
12704 #endif
12705 #ifdef CONFIG_IPW2100_DEBUG
12706 #endif
12707 #ifdef CONFIG_IPW2100_DEBUG
12708 #endif
12709 #define SEARCH_ERROR 0xffffffff
12710 #define SEARCH_FAIL 0xfffffffe
12711 #define SEARCH_SUCCESS 0xfffffff0
12712 #define SEARCH_DISCARD 0
12713 #define SEARCH_SNAPSHOT 1
12714 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
12715 #ifdef IPW2100_DEBUG_C3
12716 #endif
12717 #ifdef IPW2100_RX_DEBUG
12718 #endif
12719 #ifdef IPW2100_DEBUG_C3
12720 #endif
12721 #ifdef IPW2100_DEBUG_C3
12722 #endif
12723 #ifdef IPW2100_RX_DEBUG
12724 #endif
12725 #ifdef IPW2100_RX_DEBUG
12726 #endif
12727 #ifdef CONFIG_IPW2100_MONITOR
12728 #endif
12729 #ifdef CONFIG_IPW2100_MONITOR
12730 #else
12731 #endif
12732 #ifdef CONFIG_IPW2100_MONITOR
12733 #endif
12734 #ifdef CONFIG_IPW2100_DEBUG
12735 #endif
12736 #ifdef CONFIG_IPW2100_DEBUG
12737 #endif
12738 #ifdef CONFIG_IPW2100_DEBUG
12739 #endif
12740 #define IPW2100_REG(x) { IPW_ ##x, #x }
12741 #define IPW2100_NIC(x, s) { x, #x, s }
12742 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
12743 #ifdef CONFIG_IPW2100_DEBUG
12744 #endif
12745 #ifdef CONFIG_IPW2100_MONITOR
12746 #endif
12747 #ifdef CONFIG_PM
12748 #endif
12749 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
12750 #ifdef CONFIG_IPW2100_DEBUG
12751 #endif
12752 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
12753 #endif
12754 #ifdef IPW2100_TX_POWER
12755 #endif
12756 #if 0
12757 #endif
12758 #ifdef CONFIG_IPW2100_DEBUG
12759 #endif
12760 #define IPW_PRIVACY_CAPABLE 0x0008
12761 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
12762 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
12763 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
12764 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
12765 #ifdef CONFIG_IPW2100_MONITOR
12766 #endif
12767 #ifdef CONFIG_IPW2100_MONITOR
12768 #endif
12769 #ifdef CONFIG_IPW2100_MONITOR
12770 #endif
12771 #ifdef CONFIG_IPW2100_MONITOR
12772 #endif
12773 #ifdef CONFIG_PM
12774 #endif
12775 #ifdef CONFIG_PM
12776 /* LDV_COMMENT_END_PREP */
12777 /* LDV_COMMENT_FUNCTION_CALL Function from field "suspend" from driver structure with callbacks "ipw2100_pci_driver" */
12778 ldv_handler_precall();
12779 ipw2100_suspend( var_group3, var_ipw2100_suspend_149_p1);
12780 /* LDV_COMMENT_BEGIN_PREP */
12781 #endif
12782 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
12783 #ifdef CONFIG_PM
12784 #endif
12785 #ifdef CONFIG_IPW2100_DEBUG
12786 #endif
12787 #ifdef CONFIG_IPW2100_DEBUG
12788 #endif
12789 #ifdef CONFIG_IPW2100_MONITOR
12790 #endif
12791 #define POWER_MODES 5
12792 #ifdef CONFIG_IPW2100_MONITOR
12793 #endif
12794 #define MAX_POWER_STRING 80
12795 #ifdef CONFIG_IPW2100_MONITOR
12796 #endif
12797 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
12798 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
12799 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
12800 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
12801 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
12802 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
12803 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
12804 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
12805 #ifdef CONFIG_IPW2100_MONITOR
12806 #endif
12807 #ifdef CONFIG_IPW2100_MONITOR
12808 #endif
12809 #ifdef CONFIG_IPW2100_MONITOR
12810 #else
12811 #endif
12812 #ifdef CONFIG_IPW2100_MONITOR
12813 #else
12814 #endif
12815 #ifdef CONFIG_IPW2100_DEBUG
12816 #endif
12817 #define IPW2100_FW_MAJOR_VERSION 1
12818 #define IPW2100_FW_MINOR_VERSION 3
12819 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
12820 #define IPW2100_FW_MAJOR(x) (x & 0xff)
12821 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
12822 IPW2100_FW_MAJOR_VERSION)
12823 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
12824 "." __stringify(IPW2100_FW_MINOR_VERSION)
12825 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
12826 #ifdef CONFIG_IPW2100_MONITOR
12827 #endif
12828 #ifdef CONFIG_IPW2100_MONITOR
12829 #endif
12830 /* LDV_COMMENT_END_PREP */
12831
12832
12833
12834
12835 }
12836
12837 break;
12838 case 9: {
12839
12840 /** STRUCT: struct type: pci_driver, struct name: ipw2100_pci_driver **/
12841
12842
12843 /* content: static int ipw2100_resume(struct pci_dev *pci_dev)*/
12844 /* LDV_COMMENT_BEGIN_PREP */
12845 #define IPW2100_VERSION "git-1.2.2"
12846 #define DRV_NAME "ipw2100"
12847 #define DRV_VERSION IPW2100_VERSION
12848 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
12849 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
12850 #ifdef CONFIG_IPW2100_DEBUG
12851 #define IPW2100_RX_DEBUG
12852 #endif
12853 #ifdef CONFIG_PM
12854 #endif
12855 #ifdef CONFIG_IPW2100_DEBUG
12856 #define IPW_DEBUG(level, message...) \
12857 do { \
12858 if (ipw2100_debug_level & (level)) { \
12859 printk(KERN_DEBUG "ipw2100: %c %s ", \
12860 in_interrupt() ? 'I' : 'U', __func__); \
12861 printk(message); \
12862 } \
12863 } while (0)
12864 #else
12865 #define IPW_DEBUG(level, message...) do {} while (0)
12866 #endif
12867 #ifdef CONFIG_IPW2100_DEBUG
12868 #endif
12869 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
12870 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
12871 #define MAX_RESET_BACKOFF 10
12872 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
12873 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
12874 #ifndef CONFIG_PM
12875 #endif
12876 #ifdef CONFIG_PM
12877 #else
12878 #endif
12879 #ifndef CONFIG_PM
12880 #endif
12881 #define MAX_RF_KILL_CHECKS 5
12882 #define RF_KILL_CHECK_DELAY 40
12883 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
12884 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
12885 #define MAC_ASSOCIATION_READ_DELAY (HZ)
12886 #ifdef CONFIG_IPW2100_DEBUG
12887 #define IPW2100_HANDLER(v, f) { v, f, # v }
12888 #else
12889 #define IPW2100_HANDLER(v, f) { v, f }
12890 #endif
12891 #ifdef CONFIG_IPW2100_DEBUG
12892 #endif
12893 #ifdef CONFIG_IPW2100_DEBUG
12894 #endif
12895 #define SEARCH_ERROR 0xffffffff
12896 #define SEARCH_FAIL 0xfffffffe
12897 #define SEARCH_SUCCESS 0xfffffff0
12898 #define SEARCH_DISCARD 0
12899 #define SEARCH_SNAPSHOT 1
12900 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
12901 #ifdef IPW2100_DEBUG_C3
12902 #endif
12903 #ifdef IPW2100_RX_DEBUG
12904 #endif
12905 #ifdef IPW2100_DEBUG_C3
12906 #endif
12907 #ifdef IPW2100_DEBUG_C3
12908 #endif
12909 #ifdef IPW2100_RX_DEBUG
12910 #endif
12911 #ifdef IPW2100_RX_DEBUG
12912 #endif
12913 #ifdef CONFIG_IPW2100_MONITOR
12914 #endif
12915 #ifdef CONFIG_IPW2100_MONITOR
12916 #else
12917 #endif
12918 #ifdef CONFIG_IPW2100_MONITOR
12919 #endif
12920 #ifdef CONFIG_IPW2100_DEBUG
12921 #endif
12922 #ifdef CONFIG_IPW2100_DEBUG
12923 #endif
12924 #ifdef CONFIG_IPW2100_DEBUG
12925 #endif
12926 #define IPW2100_REG(x) { IPW_ ##x, #x }
12927 #define IPW2100_NIC(x, s) { x, #x, s }
12928 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
12929 #ifdef CONFIG_IPW2100_DEBUG
12930 #endif
12931 #ifdef CONFIG_IPW2100_MONITOR
12932 #endif
12933 #ifdef CONFIG_PM
12934 #endif
12935 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
12936 #ifdef CONFIG_IPW2100_DEBUG
12937 #endif
12938 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
12939 #endif
12940 #ifdef IPW2100_TX_POWER
12941 #endif
12942 #if 0
12943 #endif
12944 #ifdef CONFIG_IPW2100_DEBUG
12945 #endif
12946 #define IPW_PRIVACY_CAPABLE 0x0008
12947 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
12948 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
12949 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
12950 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
12951 #ifdef CONFIG_IPW2100_MONITOR
12952 #endif
12953 #ifdef CONFIG_IPW2100_MONITOR
12954 #endif
12955 #ifdef CONFIG_IPW2100_MONITOR
12956 #endif
12957 #ifdef CONFIG_IPW2100_MONITOR
12958 #endif
12959 #ifdef CONFIG_PM
12960 #endif
12961 #ifdef CONFIG_PM
12962 /* LDV_COMMENT_END_PREP */
12963 /* LDV_COMMENT_FUNCTION_CALL Function from field "resume" from driver structure with callbacks "ipw2100_pci_driver" */
12964 ldv_handler_precall();
12965 ipw2100_resume( var_group3);
12966 /* LDV_COMMENT_BEGIN_PREP */
12967 #endif
12968 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
12969 #ifdef CONFIG_PM
12970 #endif
12971 #ifdef CONFIG_IPW2100_DEBUG
12972 #endif
12973 #ifdef CONFIG_IPW2100_DEBUG
12974 #endif
12975 #ifdef CONFIG_IPW2100_MONITOR
12976 #endif
12977 #define POWER_MODES 5
12978 #ifdef CONFIG_IPW2100_MONITOR
12979 #endif
12980 #define MAX_POWER_STRING 80
12981 #ifdef CONFIG_IPW2100_MONITOR
12982 #endif
12983 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
12984 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
12985 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
12986 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
12987 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
12988 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
12989 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
12990 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
12991 #ifdef CONFIG_IPW2100_MONITOR
12992 #endif
12993 #ifdef CONFIG_IPW2100_MONITOR
12994 #endif
12995 #ifdef CONFIG_IPW2100_MONITOR
12996 #else
12997 #endif
12998 #ifdef CONFIG_IPW2100_MONITOR
12999 #else
13000 #endif
13001 #ifdef CONFIG_IPW2100_DEBUG
13002 #endif
13003 #define IPW2100_FW_MAJOR_VERSION 1
13004 #define IPW2100_FW_MINOR_VERSION 3
13005 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
13006 #define IPW2100_FW_MAJOR(x) (x & 0xff)
13007 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
13008 IPW2100_FW_MAJOR_VERSION)
13009 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
13010 "." __stringify(IPW2100_FW_MINOR_VERSION)
13011 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
13012 #ifdef CONFIG_IPW2100_MONITOR
13013 #endif
13014 #ifdef CONFIG_IPW2100_MONITOR
13015 #endif
13016 /* LDV_COMMENT_END_PREP */
13017
13018
13019
13020
13021 }
13022
13023 break;
13024 case 10: {
13025
13026 /** STRUCT: struct type: pci_driver, struct name: ipw2100_pci_driver **/
13027
13028
13029 /* content: static void ipw2100_shutdown(struct pci_dev *pci_dev)*/
13030 /* LDV_COMMENT_BEGIN_PREP */
13031 #define IPW2100_VERSION "git-1.2.2"
13032 #define DRV_NAME "ipw2100"
13033 #define DRV_VERSION IPW2100_VERSION
13034 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
13035 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
13036 #ifdef CONFIG_IPW2100_DEBUG
13037 #define IPW2100_RX_DEBUG
13038 #endif
13039 #ifdef CONFIG_PM
13040 #endif
13041 #ifdef CONFIG_IPW2100_DEBUG
13042 #define IPW_DEBUG(level, message...) \
13043 do { \
13044 if (ipw2100_debug_level & (level)) { \
13045 printk(KERN_DEBUG "ipw2100: %c %s ", \
13046 in_interrupt() ? 'I' : 'U', __func__); \
13047 printk(message); \
13048 } \
13049 } while (0)
13050 #else
13051 #define IPW_DEBUG(level, message...) do {} while (0)
13052 #endif
13053 #ifdef CONFIG_IPW2100_DEBUG
13054 #endif
13055 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
13056 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
13057 #define MAX_RESET_BACKOFF 10
13058 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
13059 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
13060 #ifndef CONFIG_PM
13061 #endif
13062 #ifdef CONFIG_PM
13063 #else
13064 #endif
13065 #ifndef CONFIG_PM
13066 #endif
13067 #define MAX_RF_KILL_CHECKS 5
13068 #define RF_KILL_CHECK_DELAY 40
13069 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
13070 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
13071 #define MAC_ASSOCIATION_READ_DELAY (HZ)
13072 #ifdef CONFIG_IPW2100_DEBUG
13073 #define IPW2100_HANDLER(v, f) { v, f, # v }
13074 #else
13075 #define IPW2100_HANDLER(v, f) { v, f }
13076 #endif
13077 #ifdef CONFIG_IPW2100_DEBUG
13078 #endif
13079 #ifdef CONFIG_IPW2100_DEBUG
13080 #endif
13081 #define SEARCH_ERROR 0xffffffff
13082 #define SEARCH_FAIL 0xfffffffe
13083 #define SEARCH_SUCCESS 0xfffffff0
13084 #define SEARCH_DISCARD 0
13085 #define SEARCH_SNAPSHOT 1
13086 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
13087 #ifdef IPW2100_DEBUG_C3
13088 #endif
13089 #ifdef IPW2100_RX_DEBUG
13090 #endif
13091 #ifdef IPW2100_DEBUG_C3
13092 #endif
13093 #ifdef IPW2100_DEBUG_C3
13094 #endif
13095 #ifdef IPW2100_RX_DEBUG
13096 #endif
13097 #ifdef IPW2100_RX_DEBUG
13098 #endif
13099 #ifdef CONFIG_IPW2100_MONITOR
13100 #endif
13101 #ifdef CONFIG_IPW2100_MONITOR
13102 #else
13103 #endif
13104 #ifdef CONFIG_IPW2100_MONITOR
13105 #endif
13106 #ifdef CONFIG_IPW2100_DEBUG
13107 #endif
13108 #ifdef CONFIG_IPW2100_DEBUG
13109 #endif
13110 #ifdef CONFIG_IPW2100_DEBUG
13111 #endif
13112 #define IPW2100_REG(x) { IPW_ ##x, #x }
13113 #define IPW2100_NIC(x, s) { x, #x, s }
13114 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
13115 #ifdef CONFIG_IPW2100_DEBUG
13116 #endif
13117 #ifdef CONFIG_IPW2100_MONITOR
13118 #endif
13119 #ifdef CONFIG_PM
13120 #endif
13121 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
13122 #ifdef CONFIG_IPW2100_DEBUG
13123 #endif
13124 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
13125 #endif
13126 #ifdef IPW2100_TX_POWER
13127 #endif
13128 #if 0
13129 #endif
13130 #ifdef CONFIG_IPW2100_DEBUG
13131 #endif
13132 #define IPW_PRIVACY_CAPABLE 0x0008
13133 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
13134 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
13135 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
13136 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
13137 #ifdef CONFIG_IPW2100_MONITOR
13138 #endif
13139 #ifdef CONFIG_IPW2100_MONITOR
13140 #endif
13141 #ifdef CONFIG_IPW2100_MONITOR
13142 #endif
13143 #ifdef CONFIG_IPW2100_MONITOR
13144 #endif
13145 #ifdef CONFIG_PM
13146 #endif
13147 #ifdef CONFIG_PM
13148 #endif
13149 /* LDV_COMMENT_END_PREP */
13150 /* LDV_COMMENT_FUNCTION_CALL Function from field "shutdown" from driver structure with callbacks "ipw2100_pci_driver" */
13151 ldv_handler_precall();
13152 ipw2100_shutdown( var_group3);
13153 /* LDV_COMMENT_BEGIN_PREP */
13154 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
13155 #ifdef CONFIG_PM
13156 #endif
13157 #ifdef CONFIG_IPW2100_DEBUG
13158 #endif
13159 #ifdef CONFIG_IPW2100_DEBUG
13160 #endif
13161 #ifdef CONFIG_IPW2100_MONITOR
13162 #endif
13163 #define POWER_MODES 5
13164 #ifdef CONFIG_IPW2100_MONITOR
13165 #endif
13166 #define MAX_POWER_STRING 80
13167 #ifdef CONFIG_IPW2100_MONITOR
13168 #endif
13169 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
13170 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
13171 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
13172 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
13173 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
13174 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
13175 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
13176 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
13177 #ifdef CONFIG_IPW2100_MONITOR
13178 #endif
13179 #ifdef CONFIG_IPW2100_MONITOR
13180 #endif
13181 #ifdef CONFIG_IPW2100_MONITOR
13182 #else
13183 #endif
13184 #ifdef CONFIG_IPW2100_MONITOR
13185 #else
13186 #endif
13187 #ifdef CONFIG_IPW2100_DEBUG
13188 #endif
13189 #define IPW2100_FW_MAJOR_VERSION 1
13190 #define IPW2100_FW_MINOR_VERSION 3
13191 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
13192 #define IPW2100_FW_MAJOR(x) (x & 0xff)
13193 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
13194 IPW2100_FW_MAJOR_VERSION)
13195 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
13196 "." __stringify(IPW2100_FW_MINOR_VERSION)
13197 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
13198 #ifdef CONFIG_IPW2100_MONITOR
13199 #endif
13200 #ifdef CONFIG_IPW2100_MONITOR
13201 #endif
13202 /* LDV_COMMENT_END_PREP */
13203
13204
13205
13206
13207 }
13208
13209 break;
13210 case 11: {
13211
13212 /** STRUCT: struct type: iw_handler_def, struct name: ipw2100_wx_handler_def **/
13213
13214
13215 /* content: static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev)*/
13216 /* LDV_COMMENT_BEGIN_PREP */
13217 #define IPW2100_VERSION "git-1.2.2"
13218 #define DRV_NAME "ipw2100"
13219 #define DRV_VERSION IPW2100_VERSION
13220 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
13221 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
13222 #ifdef CONFIG_IPW2100_DEBUG
13223 #define IPW2100_RX_DEBUG
13224 #endif
13225 #ifdef CONFIG_PM
13226 #endif
13227 #ifdef CONFIG_IPW2100_DEBUG
13228 #define IPW_DEBUG(level, message...) \
13229 do { \
13230 if (ipw2100_debug_level & (level)) { \
13231 printk(KERN_DEBUG "ipw2100: %c %s ", \
13232 in_interrupt() ? 'I' : 'U', __func__); \
13233 printk(message); \
13234 } \
13235 } while (0)
13236 #else
13237 #define IPW_DEBUG(level, message...) do {} while (0)
13238 #endif
13239 #ifdef CONFIG_IPW2100_DEBUG
13240 #endif
13241 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
13242 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
13243 #define MAX_RESET_BACKOFF 10
13244 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
13245 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
13246 #ifndef CONFIG_PM
13247 #endif
13248 #ifdef CONFIG_PM
13249 #else
13250 #endif
13251 #ifndef CONFIG_PM
13252 #endif
13253 #define MAX_RF_KILL_CHECKS 5
13254 #define RF_KILL_CHECK_DELAY 40
13255 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
13256 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
13257 #define MAC_ASSOCIATION_READ_DELAY (HZ)
13258 #ifdef CONFIG_IPW2100_DEBUG
13259 #define IPW2100_HANDLER(v, f) { v, f, # v }
13260 #else
13261 #define IPW2100_HANDLER(v, f) { v, f }
13262 #endif
13263 #ifdef CONFIG_IPW2100_DEBUG
13264 #endif
13265 #ifdef CONFIG_IPW2100_DEBUG
13266 #endif
13267 #define SEARCH_ERROR 0xffffffff
13268 #define SEARCH_FAIL 0xfffffffe
13269 #define SEARCH_SUCCESS 0xfffffff0
13270 #define SEARCH_DISCARD 0
13271 #define SEARCH_SNAPSHOT 1
13272 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
13273 #ifdef IPW2100_DEBUG_C3
13274 #endif
13275 #ifdef IPW2100_RX_DEBUG
13276 #endif
13277 #ifdef IPW2100_DEBUG_C3
13278 #endif
13279 #ifdef IPW2100_DEBUG_C3
13280 #endif
13281 #ifdef IPW2100_RX_DEBUG
13282 #endif
13283 #ifdef IPW2100_RX_DEBUG
13284 #endif
13285 #ifdef CONFIG_IPW2100_MONITOR
13286 #endif
13287 #ifdef CONFIG_IPW2100_MONITOR
13288 #else
13289 #endif
13290 #ifdef CONFIG_IPW2100_MONITOR
13291 #endif
13292 #ifdef CONFIG_IPW2100_DEBUG
13293 #endif
13294 #ifdef CONFIG_IPW2100_DEBUG
13295 #endif
13296 #ifdef CONFIG_IPW2100_DEBUG
13297 #endif
13298 #define IPW2100_REG(x) { IPW_ ##x, #x }
13299 #define IPW2100_NIC(x, s) { x, #x, s }
13300 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
13301 #ifdef CONFIG_IPW2100_DEBUG
13302 #endif
13303 #ifdef CONFIG_IPW2100_MONITOR
13304 #endif
13305 #ifdef CONFIG_PM
13306 #endif
13307 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
13308 #ifdef CONFIG_IPW2100_DEBUG
13309 #endif
13310 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
13311 #endif
13312 #ifdef IPW2100_TX_POWER
13313 #endif
13314 #if 0
13315 #endif
13316 #ifdef CONFIG_IPW2100_DEBUG
13317 #endif
13318 #define IPW_PRIVACY_CAPABLE 0x0008
13319 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
13320 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
13321 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
13322 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
13323 #ifdef CONFIG_IPW2100_MONITOR
13324 #endif
13325 #ifdef CONFIG_IPW2100_MONITOR
13326 #endif
13327 #ifdef CONFIG_IPW2100_MONITOR
13328 #endif
13329 #ifdef CONFIG_IPW2100_MONITOR
13330 #endif
13331 #ifdef CONFIG_PM
13332 #endif
13333 #ifdef CONFIG_PM
13334 #endif
13335 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
13336 #ifdef CONFIG_PM
13337 #endif
13338 #ifdef CONFIG_IPW2100_DEBUG
13339 #endif
13340 #ifdef CONFIG_IPW2100_DEBUG
13341 #endif
13342 #ifdef CONFIG_IPW2100_MONITOR
13343 #endif
13344 #define POWER_MODES 5
13345 #ifdef CONFIG_IPW2100_MONITOR
13346 #endif
13347 #define MAX_POWER_STRING 80
13348 #ifdef CONFIG_IPW2100_MONITOR
13349 #endif
13350 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
13351 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
13352 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
13353 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
13354 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
13355 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
13356 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
13357 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
13358 #ifdef CONFIG_IPW2100_MONITOR
13359 #endif
13360 #ifdef CONFIG_IPW2100_MONITOR
13361 #endif
13362 #ifdef CONFIG_IPW2100_MONITOR
13363 #else
13364 #endif
13365 #ifdef CONFIG_IPW2100_MONITOR
13366 #else
13367 #endif
13368 /* LDV_COMMENT_END_PREP */
13369 /* LDV_COMMENT_FUNCTION_CALL Function from field "get_wireless_stats" from driver structure with callbacks "ipw2100_wx_handler_def" */
13370 ldv_handler_precall();
13371 ipw2100_wx_wireless_stats( var_group1);
13372 /* LDV_COMMENT_BEGIN_PREP */
13373 #define IPW2100_FW_MAJOR_VERSION 1
13374 #define IPW2100_FW_MINOR_VERSION 3
13375 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
13376 #define IPW2100_FW_MAJOR(x) (x & 0xff)
13377 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
13378 IPW2100_FW_MAJOR_VERSION)
13379 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
13380 "." __stringify(IPW2100_FW_MINOR_VERSION)
13381 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
13382 #ifdef CONFIG_IPW2100_MONITOR
13383 #endif
13384 #ifdef CONFIG_IPW2100_MONITOR
13385 #endif
13386 /* LDV_COMMENT_END_PREP */
13387
13388
13389
13390
13391 }
13392
13393 break;
13394 case 12: {
13395
13396 /** CALLBACK SECTION request_irq **/
13397 LDV_IN_INTERRUPT=2;
13398
13399 /* content: static irqreturn_t ipw2100_interrupt(int irq, void *data)*/
13400 /* LDV_COMMENT_BEGIN_PREP */
13401 #define IPW2100_VERSION "git-1.2.2"
13402 #define DRV_NAME "ipw2100"
13403 #define DRV_VERSION IPW2100_VERSION
13404 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
13405 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
13406 #ifdef CONFIG_IPW2100_DEBUG
13407 #define IPW2100_RX_DEBUG
13408 #endif
13409 #ifdef CONFIG_PM
13410 #endif
13411 #ifdef CONFIG_IPW2100_DEBUG
13412 #define IPW_DEBUG(level, message...) \
13413 do { \
13414 if (ipw2100_debug_level & (level)) { \
13415 printk(KERN_DEBUG "ipw2100: %c %s ", \
13416 in_interrupt() ? 'I' : 'U', __func__); \
13417 printk(message); \
13418 } \
13419 } while (0)
13420 #else
13421 #define IPW_DEBUG(level, message...) do {} while (0)
13422 #endif
13423 #ifdef CONFIG_IPW2100_DEBUG
13424 #endif
13425 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
13426 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
13427 #define MAX_RESET_BACKOFF 10
13428 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
13429 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
13430 #ifndef CONFIG_PM
13431 #endif
13432 #ifdef CONFIG_PM
13433 #else
13434 #endif
13435 #ifndef CONFIG_PM
13436 #endif
13437 #define MAX_RF_KILL_CHECKS 5
13438 #define RF_KILL_CHECK_DELAY 40
13439 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
13440 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
13441 #define MAC_ASSOCIATION_READ_DELAY (HZ)
13442 #ifdef CONFIG_IPW2100_DEBUG
13443 #define IPW2100_HANDLER(v, f) { v, f, # v }
13444 #else
13445 #define IPW2100_HANDLER(v, f) { v, f }
13446 #endif
13447 #ifdef CONFIG_IPW2100_DEBUG
13448 #endif
13449 #ifdef CONFIG_IPW2100_DEBUG
13450 #endif
13451 #define SEARCH_ERROR 0xffffffff
13452 #define SEARCH_FAIL 0xfffffffe
13453 #define SEARCH_SUCCESS 0xfffffff0
13454 #define SEARCH_DISCARD 0
13455 #define SEARCH_SNAPSHOT 1
13456 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
13457 #ifdef IPW2100_DEBUG_C3
13458 #endif
13459 #ifdef IPW2100_RX_DEBUG
13460 #endif
13461 #ifdef IPW2100_DEBUG_C3
13462 #endif
13463 #ifdef IPW2100_DEBUG_C3
13464 #endif
13465 #ifdef IPW2100_RX_DEBUG
13466 #endif
13467 #ifdef IPW2100_RX_DEBUG
13468 #endif
13469 #ifdef CONFIG_IPW2100_MONITOR
13470 #endif
13471 #ifdef CONFIG_IPW2100_MONITOR
13472 #else
13473 #endif
13474 #ifdef CONFIG_IPW2100_MONITOR
13475 #endif
13476 #ifdef CONFIG_IPW2100_DEBUG
13477 #endif
13478 #ifdef CONFIG_IPW2100_DEBUG
13479 #endif
13480 #ifdef CONFIG_IPW2100_DEBUG
13481 #endif
13482 /* LDV_COMMENT_END_PREP */
13483 /* LDV_COMMENT_FUNCTION_CALL */
13484 ldv_handler_precall();
13485 ipw2100_interrupt( var_ipw2100_interrupt_69_p0, var_ipw2100_interrupt_69_p1);
13486 /* LDV_COMMENT_BEGIN_PREP */
13487 #define IPW2100_REG(x) { IPW_ ##x, #x }
13488 #define IPW2100_NIC(x, s) { x, #x, s }
13489 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
13490 #ifdef CONFIG_IPW2100_DEBUG
13491 #endif
13492 #ifdef CONFIG_IPW2100_MONITOR
13493 #endif
13494 #ifdef CONFIG_PM
13495 #endif
13496 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
13497 #ifdef CONFIG_IPW2100_DEBUG
13498 #endif
13499 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
13500 #endif
13501 #ifdef IPW2100_TX_POWER
13502 #endif
13503 #if 0
13504 #endif
13505 #ifdef CONFIG_IPW2100_DEBUG
13506 #endif
13507 #define IPW_PRIVACY_CAPABLE 0x0008
13508 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
13509 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
13510 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
13511 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
13512 #ifdef CONFIG_IPW2100_MONITOR
13513 #endif
13514 #ifdef CONFIG_IPW2100_MONITOR
13515 #endif
13516 #ifdef CONFIG_IPW2100_MONITOR
13517 #endif
13518 #ifdef CONFIG_IPW2100_MONITOR
13519 #endif
13520 #ifdef CONFIG_PM
13521 #endif
13522 #ifdef CONFIG_PM
13523 #endif
13524 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
13525 #ifdef CONFIG_PM
13526 #endif
13527 #ifdef CONFIG_IPW2100_DEBUG
13528 #endif
13529 #ifdef CONFIG_IPW2100_DEBUG
13530 #endif
13531 #ifdef CONFIG_IPW2100_MONITOR
13532 #endif
13533 #define POWER_MODES 5
13534 #ifdef CONFIG_IPW2100_MONITOR
13535 #endif
13536 #define MAX_POWER_STRING 80
13537 #ifdef CONFIG_IPW2100_MONITOR
13538 #endif
13539 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
13540 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
13541 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
13542 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
13543 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
13544 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
13545 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
13546 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
13547 #ifdef CONFIG_IPW2100_MONITOR
13548 #endif
13549 #ifdef CONFIG_IPW2100_MONITOR
13550 #endif
13551 #ifdef CONFIG_IPW2100_MONITOR
13552 #else
13553 #endif
13554 #ifdef CONFIG_IPW2100_MONITOR
13555 #else
13556 #endif
13557 #ifdef CONFIG_IPW2100_DEBUG
13558 #endif
13559 #define IPW2100_FW_MAJOR_VERSION 1
13560 #define IPW2100_FW_MINOR_VERSION 3
13561 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
13562 #define IPW2100_FW_MAJOR(x) (x & 0xff)
13563 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
13564 IPW2100_FW_MAJOR_VERSION)
13565 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
13566 "." __stringify(IPW2100_FW_MINOR_VERSION)
13567 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
13568 #ifdef CONFIG_IPW2100_MONITOR
13569 #endif
13570 #ifdef CONFIG_IPW2100_MONITOR
13571 #endif
13572 /* LDV_COMMENT_END_PREP */
13573 LDV_IN_INTERRUPT=1;
13574
13575
13576
13577 }
13578
13579 break;
13580 default: break;
13581
13582 }
13583
13584 }
13585
13586 ldv_module_exit:
13587
13588 /** INIT: init_type: ST_MODULE_EXIT **/
13589 /* content: static void __exit ipw2100_exit(void)*/
13590 /* LDV_COMMENT_BEGIN_PREP */
13591 #define IPW2100_VERSION "git-1.2.2"
13592 #define DRV_NAME "ipw2100"
13593 #define DRV_VERSION IPW2100_VERSION
13594 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
13595 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
13596 #ifdef CONFIG_IPW2100_DEBUG
13597 #define IPW2100_RX_DEBUG
13598 #endif
13599 #ifdef CONFIG_PM
13600 #endif
13601 #ifdef CONFIG_IPW2100_DEBUG
13602 #define IPW_DEBUG(level, message...) \
13603 do { \
13604 if (ipw2100_debug_level & (level)) { \
13605 printk(KERN_DEBUG "ipw2100: %c %s ", \
13606 in_interrupt() ? 'I' : 'U', __func__); \
13607 printk(message); \
13608 } \
13609 } while (0)
13610 #else
13611 #define IPW_DEBUG(level, message...) do {} while (0)
13612 #endif
13613 #ifdef CONFIG_IPW2100_DEBUG
13614 #endif
13615 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
13616 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
13617 #define MAX_RESET_BACKOFF 10
13618 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
13619 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
13620 #ifndef CONFIG_PM
13621 #endif
13622 #ifdef CONFIG_PM
13623 #else
13624 #endif
13625 #ifndef CONFIG_PM
13626 #endif
13627 #define MAX_RF_KILL_CHECKS 5
13628 #define RF_KILL_CHECK_DELAY 40
13629 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
13630 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
13631 #define MAC_ASSOCIATION_READ_DELAY (HZ)
13632 #ifdef CONFIG_IPW2100_DEBUG
13633 #define IPW2100_HANDLER(v, f) { v, f, # v }
13634 #else
13635 #define IPW2100_HANDLER(v, f) { v, f }
13636 #endif
13637 #ifdef CONFIG_IPW2100_DEBUG
13638 #endif
13639 #ifdef CONFIG_IPW2100_DEBUG
13640 #endif
13641 #define SEARCH_ERROR 0xffffffff
13642 #define SEARCH_FAIL 0xfffffffe
13643 #define SEARCH_SUCCESS 0xfffffff0
13644 #define SEARCH_DISCARD 0
13645 #define SEARCH_SNAPSHOT 1
13646 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
13647 #ifdef IPW2100_DEBUG_C3
13648 #endif
13649 #ifdef IPW2100_RX_DEBUG
13650 #endif
13651 #ifdef IPW2100_DEBUG_C3
13652 #endif
13653 #ifdef IPW2100_DEBUG_C3
13654 #endif
13655 #ifdef IPW2100_RX_DEBUG
13656 #endif
13657 #ifdef IPW2100_RX_DEBUG
13658 #endif
13659 #ifdef CONFIG_IPW2100_MONITOR
13660 #endif
13661 #ifdef CONFIG_IPW2100_MONITOR
13662 #else
13663 #endif
13664 #ifdef CONFIG_IPW2100_MONITOR
13665 #endif
13666 #ifdef CONFIG_IPW2100_DEBUG
13667 #endif
13668 #ifdef CONFIG_IPW2100_DEBUG
13669 #endif
13670 #ifdef CONFIG_IPW2100_DEBUG
13671 #endif
13672 #define IPW2100_REG(x) { IPW_ ##x, #x }
13673 #define IPW2100_NIC(x, s) { x, #x, s }
13674 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
13675 #ifdef CONFIG_IPW2100_DEBUG
13676 #endif
13677 #ifdef CONFIG_IPW2100_MONITOR
13678 #endif
13679 #ifdef CONFIG_PM
13680 #endif
13681 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
13682 #ifdef CONFIG_IPW2100_DEBUG
13683 #endif
13684 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
13685 #endif
13686 #ifdef IPW2100_TX_POWER
13687 #endif
13688 #if 0
13689 #endif
13690 #ifdef CONFIG_IPW2100_DEBUG
13691 #endif
13692 #define IPW_PRIVACY_CAPABLE 0x0008
13693 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
13694 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
13695 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
13696 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
13697 #ifdef CONFIG_IPW2100_MONITOR
13698 #endif
13699 #ifdef CONFIG_IPW2100_MONITOR
13700 #endif
13701 #ifdef CONFIG_IPW2100_MONITOR
13702 #endif
13703 #ifdef CONFIG_IPW2100_MONITOR
13704 #endif
13705 #ifdef CONFIG_PM
13706 #endif
13707 #ifdef CONFIG_PM
13708 #endif
13709 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
13710 #ifdef CONFIG_PM
13711 #endif
13712 #ifdef CONFIG_IPW2100_DEBUG
13713 #endif
13714 /* LDV_COMMENT_END_PREP */
13715 /* LDV_COMMENT_FUNCTION_CALL Kernel calls driver release function before driver will be uploaded from kernel. This function declared as "MODULE_EXIT(function name)". */
13716 ldv_handler_precall();
13717 ipw2100_exit();
13718 /* LDV_COMMENT_BEGIN_PREP */
13719 #ifdef CONFIG_IPW2100_MONITOR
13720 #endif
13721 #define POWER_MODES 5
13722 #ifdef CONFIG_IPW2100_MONITOR
13723 #endif
13724 #define MAX_POWER_STRING 80
13725 #ifdef CONFIG_IPW2100_MONITOR
13726 #endif
13727 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
13728 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
13729 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
13730 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
13731 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
13732 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
13733 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
13734 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
13735 #ifdef CONFIG_IPW2100_MONITOR
13736 #endif
13737 #ifdef CONFIG_IPW2100_MONITOR
13738 #endif
13739 #ifdef CONFIG_IPW2100_MONITOR
13740 #else
13741 #endif
13742 #ifdef CONFIG_IPW2100_MONITOR
13743 #else
13744 #endif
13745 #ifdef CONFIG_IPW2100_DEBUG
13746 #endif
13747 #define IPW2100_FW_MAJOR_VERSION 1
13748 #define IPW2100_FW_MINOR_VERSION 3
13749 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
13750 #define IPW2100_FW_MAJOR(x) (x & 0xff)
13751 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
13752 IPW2100_FW_MAJOR_VERSION)
13753 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
13754 "." __stringify(IPW2100_FW_MINOR_VERSION)
13755 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
13756 #ifdef CONFIG_IPW2100_MONITOR
13757 #endif
13758 #ifdef CONFIG_IPW2100_MONITOR
13759 #endif
13760 /* LDV_COMMENT_END_PREP */
13761
13762 /* LDV_COMMENT_FUNCTION_CALL Checks that all resources and locks are correctly released before the driver will be unloaded. */
13763 ldv_final: ldv_check_final_state();
13764
13765 /* LDV_COMMENT_END_FUNCTION_CALL_SECTION */
13766 return;
13767
13768 }
13769 #endif
13770
13771 /* LDV_COMMENT_END_MAIN */ 1
2 #include <linux/types.h>
3 #include <linux/dma-direction.h>
4
5 extern dma_addr_t ldv_dma_map_page(struct device *dev, struct page *page, size_t offset, size_t size, enum dma_data_direction dir);
6 extern dma_addr_t ldv_dma_map_single(struct device *dev, void *cpu_addr, size_t size, enum dma_data_direction dir);
7 extern dma_addr_t ldv_dma_map_single_attrs(struct device *dev, void *ptr, size_t size, enum dma_data_direction dir, struct dma_attrs *attrs);
8 extern int ldv_dma_mapping_error(struct device *dev, dma_addr_t dma_addr);
9 #line 1 "/home/druidos/temp/331_1a/work/current--X--drivers--X--defaultlinux-3.14.1.tar.xz--X--331_1a--X--cpachecker/linux-3.14.1.tar.xz/csd_deg_dscv/6893/dscv_tempdir/dscv/ri/331_1a/drivers/net/wireless/ipw2x00/ipw2100.c"
10
11 /******************************************************************************
12
13 Copyright(c) 2003 - 2006 Intel Corporation. All rights reserved.
14
15 This program is free software; you can redistribute it and/or modify it
16 under the terms of version 2 of the GNU General Public License as
17 published by the Free Software Foundation.
18
19 This program is distributed in the hope that it will be useful, but WITHOUT
20 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
22 more details.
23
24 You should have received a copy of the GNU General Public License along with
25 this program; if not, write to the Free Software Foundation, Inc., 59
26 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27
28 The full GNU General Public License is included in this distribution in the
29 file called LICENSE.
30
31 Contact Information:
32 Intel Linux Wireless <ilw@linux.intel.com>
33 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
34
35 Portions of this file are based on the sample_* files provided by Wireless
36 Extensions 0.26 package and copyright (c) 1997-2003 Jean Tourrilhes
37 <jt@hpl.hp.com>
38
39 Portions of this file are based on the Host AP project,
40 Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
41 <j@w1.fi>
42 Copyright (c) 2002-2003, Jouni Malinen <j@w1.fi>
43
44 Portions of ipw2100_mod_firmware_load, ipw2100_do_mod_firmware_load, and
45 ipw2100_fw_load are loosely based on drivers/sound/sound_firmware.c
46 available in the 2.4.25 kernel sources, and are copyright (c) Alan Cox
47
48 ******************************************************************************/
49 /*
50
51 Initial driver on which this is based was developed by Janusz Gorycki,
52 Maciej Urbaniak, and Maciej Sosnowski.
53
54 Promiscuous mode support added by Jacek Wysoczynski and Maciej Urbaniak.
55
56 Theory of Operation
57
58 Tx - Commands and Data
59
60 Firmware and host share a circular queue of Transmit Buffer Descriptors (TBDs)
61 Each TBD contains a pointer to the physical (dma_addr_t) address of data being
62 sent to the firmware as well as the length of the data.
63
64 The host writes to the TBD queue at the WRITE index. The WRITE index points
65 to the _next_ packet to be written and is advanced when after the TBD has been
66 filled.
67
68 The firmware pulls from the TBD queue at the READ index. The READ index points
69 to the currently being read entry, and is advanced once the firmware is
70 done with a packet.
71
72 When data is sent to the firmware, the first TBD is used to indicate to the
73 firmware if a Command or Data is being sent. If it is Command, all of the
74 command information is contained within the physical address referred to by the
75 TBD. If it is Data, the first TBD indicates the type of data packet, number
76 of fragments, etc. The next TBD then refers to the actual packet location.
77
78 The Tx flow cycle is as follows:
79
80 1) ipw2100_tx() is called by kernel with SKB to transmit
81 2) Packet is move from the tx_free_list and appended to the transmit pending
82 list (tx_pend_list)
83 3) work is scheduled to move pending packets into the shared circular queue.
84 4) when placing packet in the circular queue, the incoming SKB is DMA mapped
85 to a physical address. That address is entered into a TBD. Two TBDs are
86 filled out. The first indicating a data packet, the second referring to the
87 actual payload data.
88 5) the packet is removed from tx_pend_list and placed on the end of the
89 firmware pending list (fw_pend_list)
90 6) firmware is notified that the WRITE index has
91 7) Once the firmware has processed the TBD, INTA is triggered.
92 8) For each Tx interrupt received from the firmware, the READ index is checked
93 to see which TBDs are done being processed.
94 9) For each TBD that has been processed, the ISR pulls the oldest packet
95 from the fw_pend_list.
96 10)The packet structure contained in the fw_pend_list is then used
97 to unmap the DMA address and to free the SKB originally passed to the driver
98 from the kernel.
99 11)The packet structure is placed onto the tx_free_list
100
101 The above steps are the same for commands, only the msg_free_list/msg_pend_list
102 are used instead of tx_free_list/tx_pend_list
103
104 ...
105
106 Critical Sections / Locking :
107
108 There are two locks utilized. The first is the low level lock (priv->low_lock)
109 that protects the following:
110
111 - Access to the Tx/Rx queue lists via priv->low_lock. The lists are as follows:
112
113 tx_free_list : Holds pre-allocated Tx buffers.
114 TAIL modified in __ipw2100_tx_process()
115 HEAD modified in ipw2100_tx()
116
117 tx_pend_list : Holds used Tx buffers waiting to go into the TBD ring
118 TAIL modified ipw2100_tx()
119 HEAD modified by ipw2100_tx_send_data()
120
121 msg_free_list : Holds pre-allocated Msg (Command) buffers
122 TAIL modified in __ipw2100_tx_process()
123 HEAD modified in ipw2100_hw_send_command()
124
125 msg_pend_list : Holds used Msg buffers waiting to go into the TBD ring
126 TAIL modified in ipw2100_hw_send_command()
127 HEAD modified in ipw2100_tx_send_commands()
128
129 The flow of data on the TX side is as follows:
130
131 MSG_FREE_LIST + COMMAND => MSG_PEND_LIST => TBD => MSG_FREE_LIST
132 TX_FREE_LIST + DATA => TX_PEND_LIST => TBD => TX_FREE_LIST
133
134 The methods that work on the TBD ring are protected via priv->low_lock.
135
136 - The internal data state of the device itself
137 - Access to the firmware read/write indexes for the BD queues
138 and associated logic
139
140 All external entry functions are locked with the priv->action_lock to ensure
141 that only one external action is invoked at a time.
142
143
144 */
145
146 #include <linux/compiler.h>
147 #include <linux/errno.h>
148 #include <linux/if_arp.h>
149 #include <linux/in6.h>
150 #include <linux/in.h>
151 #include <linux/ip.h>
152 #include <linux/kernel.h>
153 #include <linux/kmod.h>
154 #include <linux/module.h>
155 #include <linux/netdevice.h>
156 #include <linux/ethtool.h>
157 #include <linux/pci.h>
158 #include <linux/dma-mapping.h>
159 #include <linux/proc_fs.h>
160 #include <linux/skbuff.h>
161 #include <asm/uaccess.h>
162 #include <asm/io.h>
163 #include <linux/fs.h>
164 #include <linux/mm.h>
165 #include <linux/slab.h>
166 #include <linux/unistd.h>
167 #include <linux/stringify.h>
168 #include <linux/tcp.h>
169 #include <linux/types.h>
170 #include <linux/time.h>
171 #include <linux/firmware.h>
172 #include <linux/acpi.h>
173 #include <linux/ctype.h>
174 #include <linux/pm_qos.h>
175
176 #include <net/lib80211.h>
177
178 #include "ipw2100.h"
179 #include "ipw.h"
180
181 #define IPW2100_VERSION "git-1.2.2"
182
183 #define DRV_NAME "ipw2100"
184 #define DRV_VERSION IPW2100_VERSION
185 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
186 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
187
188 static struct pm_qos_request ipw2100_pm_qos_req;
189
190 /* Debugging stuff */
191 #ifdef CONFIG_IPW2100_DEBUG
192 #define IPW2100_RX_DEBUG /* Reception debugging */
193 #endif
194
195 MODULE_DESCRIPTION(DRV_DESCRIPTION);
196 MODULE_VERSION(DRV_VERSION);
197 MODULE_AUTHOR(DRV_COPYRIGHT);
198 MODULE_LICENSE("GPL");
199
200 static int debug = 0;
201 static int network_mode = 0;
202 static int channel = 0;
203 static int associate = 0;
204 static int disable = 0;
205 #ifdef CONFIG_PM
206 static struct ipw2100_fw ipw2100_firmware;
207 #endif
208
209 #include <linux/moduleparam.h>
210 module_param(debug, int, 0444);
211 module_param_named(mode, network_mode, int, 0444);
212 module_param(channel, int, 0444);
213 module_param(associate, int, 0444);
214 module_param(disable, int, 0444);
215
216 MODULE_PARM_DESC(debug, "debug level");
217 MODULE_PARM_DESC(mode, "network mode (0=BSS,1=IBSS,2=Monitor)");
218 MODULE_PARM_DESC(channel, "channel");
219 MODULE_PARM_DESC(associate, "auto associate when scanning (default off)");
220 MODULE_PARM_DESC(disable, "manually disable the radio (default 0 [radio on])");
221
222 static u32 ipw2100_debug_level = IPW_DL_NONE;
223
224 #ifdef CONFIG_IPW2100_DEBUG
225 #define IPW_DEBUG(level, message...) \
226 do { \
227 if (ipw2100_debug_level & (level)) { \
228 printk(KERN_DEBUG "ipw2100: %c %s ", \
229 in_interrupt() ? 'I' : 'U', __func__); \
230 printk(message); \
231 } \
232 } while (0)
233 #else
234 #define IPW_DEBUG(level, message...) do {} while (0)
235 #endif /* CONFIG_IPW2100_DEBUG */
236
237 #ifdef CONFIG_IPW2100_DEBUG
238 static const char *command_types[] = {
239 "undefined",
240 "unused", /* HOST_ATTENTION */
241 "HOST_COMPLETE",
242 "unused", /* SLEEP */
243 "unused", /* HOST_POWER_DOWN */
244 "unused",
245 "SYSTEM_CONFIG",
246 "unused", /* SET_IMR */
247 "SSID",
248 "MANDATORY_BSSID",
249 "AUTHENTICATION_TYPE",
250 "ADAPTER_ADDRESS",
251 "PORT_TYPE",
252 "INTERNATIONAL_MODE",
253 "CHANNEL",
254 "RTS_THRESHOLD",
255 "FRAG_THRESHOLD",
256 "POWER_MODE",
257 "TX_RATES",
258 "BASIC_TX_RATES",
259 "WEP_KEY_INFO",
260 "unused",
261 "unused",
262 "unused",
263 "unused",
264 "WEP_KEY_INDEX",
265 "WEP_FLAGS",
266 "ADD_MULTICAST",
267 "CLEAR_ALL_MULTICAST",
268 "BEACON_INTERVAL",
269 "ATIM_WINDOW",
270 "CLEAR_STATISTICS",
271 "undefined",
272 "undefined",
273 "undefined",
274 "undefined",
275 "TX_POWER_INDEX",
276 "undefined",
277 "undefined",
278 "undefined",
279 "undefined",
280 "undefined",
281 "undefined",
282 "BROADCAST_SCAN",
283 "CARD_DISABLE",
284 "PREFERRED_BSSID",
285 "SET_SCAN_OPTIONS",
286 "SCAN_DWELL_TIME",
287 "SWEEP_TABLE",
288 "AP_OR_STATION_TABLE",
289 "GROUP_ORDINALS",
290 "SHORT_RETRY_LIMIT",
291 "LONG_RETRY_LIMIT",
292 "unused", /* SAVE_CALIBRATION */
293 "unused", /* RESTORE_CALIBRATION */
294 "undefined",
295 "undefined",
296 "undefined",
297 "HOST_PRE_POWER_DOWN",
298 "unused", /* HOST_INTERRUPT_COALESCING */
299 "undefined",
300 "CARD_DISABLE_PHY_OFF",
301 "MSDU_TX_RATES",
302 "undefined",
303 "SET_STATION_STAT_BITS",
304 "CLEAR_STATIONS_STAT_BITS",
305 "LEAP_ROGUE_MODE",
306 "SET_SECURITY_INFORMATION",
307 "DISASSOCIATION_BSSID",
308 "SET_WPA_ASS_IE"
309 };
310 #endif
311
312 static const long ipw2100_frequencies[] = {
313 2412, 2417, 2422, 2427,
314 2432, 2437, 2442, 2447,
315 2452, 2457, 2462, 2467,
316 2472, 2484
317 };
318
319 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
320
321 static struct ieee80211_rate ipw2100_bg_rates[] = {
322 { .bitrate = 10 },
323 { .bitrate = 20, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
324 { .bitrate = 55, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
325 { .bitrate = 110, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
326 };
327
328 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
329
330 /* Pre-decl until we get the code solid and then we can clean it up */
331 static void ipw2100_tx_send_commands(struct ipw2100_priv *priv);
332 static void ipw2100_tx_send_data(struct ipw2100_priv *priv);
333 static int ipw2100_adapter_setup(struct ipw2100_priv *priv);
334
335 static void ipw2100_queues_initialize(struct ipw2100_priv *priv);
336 static void ipw2100_queues_free(struct ipw2100_priv *priv);
337 static int ipw2100_queues_allocate(struct ipw2100_priv *priv);
338
339 static int ipw2100_fw_download(struct ipw2100_priv *priv,
340 struct ipw2100_fw *fw);
341 static int ipw2100_get_firmware(struct ipw2100_priv *priv,
342 struct ipw2100_fw *fw);
343 static int ipw2100_get_fwversion(struct ipw2100_priv *priv, char *buf,
344 size_t max);
345 static int ipw2100_get_ucodeversion(struct ipw2100_priv *priv, char *buf,
346 size_t max);
347 static void ipw2100_release_firmware(struct ipw2100_priv *priv,
348 struct ipw2100_fw *fw);
349 static int ipw2100_ucode_download(struct ipw2100_priv *priv,
350 struct ipw2100_fw *fw);
351 static void ipw2100_wx_event_work(struct work_struct *work);
352 static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev);
353 static struct iw_handler_def ipw2100_wx_handler_def;
354
355 static inline void read_register(struct net_device *dev, u32 reg, u32 * val)
356 {
357 struct ipw2100_priv *priv = libipw_priv(dev);
358
359 *val = ioread32(priv->ioaddr + reg);
360 IPW_DEBUG_IO("r: 0x%08X => 0x%08X\n", reg, *val);
361 }
362
363 static inline void write_register(struct net_device *dev, u32 reg, u32 val)
364 {
365 struct ipw2100_priv *priv = libipw_priv(dev);
366
367 iowrite32(val, priv->ioaddr + reg);
368 IPW_DEBUG_IO("w: 0x%08X <= 0x%08X\n", reg, val);
369 }
370
371 static inline void read_register_word(struct net_device *dev, u32 reg,
372 u16 * val)
373 {
374 struct ipw2100_priv *priv = libipw_priv(dev);
375
376 *val = ioread16(priv->ioaddr + reg);
377 IPW_DEBUG_IO("r: 0x%08X => %04X\n", reg, *val);
378 }
379
380 static inline void read_register_byte(struct net_device *dev, u32 reg, u8 * val)
381 {
382 struct ipw2100_priv *priv = libipw_priv(dev);
383
384 *val = ioread8(priv->ioaddr + reg);
385 IPW_DEBUG_IO("r: 0x%08X => %02X\n", reg, *val);
386 }
387
388 static inline void write_register_word(struct net_device *dev, u32 reg, u16 val)
389 {
390 struct ipw2100_priv *priv = libipw_priv(dev);
391
392 iowrite16(val, priv->ioaddr + reg);
393 IPW_DEBUG_IO("w: 0x%08X <= %04X\n", reg, val);
394 }
395
396 static inline void write_register_byte(struct net_device *dev, u32 reg, u8 val)
397 {
398 struct ipw2100_priv *priv = libipw_priv(dev);
399
400 iowrite8(val, priv->ioaddr + reg);
401 IPW_DEBUG_IO("w: 0x%08X =< %02X\n", reg, val);
402 }
403
404 static inline void read_nic_dword(struct net_device *dev, u32 addr, u32 * val)
405 {
406 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
407 addr & IPW_REG_INDIRECT_ADDR_MASK);
408 read_register(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
409 }
410
411 static inline void write_nic_dword(struct net_device *dev, u32 addr, u32 val)
412 {
413 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
414 addr & IPW_REG_INDIRECT_ADDR_MASK);
415 write_register(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
416 }
417
418 static inline void read_nic_word(struct net_device *dev, u32 addr, u16 * val)
419 {
420 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
421 addr & IPW_REG_INDIRECT_ADDR_MASK);
422 read_register_word(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
423 }
424
425 static inline void write_nic_word(struct net_device *dev, u32 addr, u16 val)
426 {
427 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
428 addr & IPW_REG_INDIRECT_ADDR_MASK);
429 write_register_word(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
430 }
431
432 static inline void read_nic_byte(struct net_device *dev, u32 addr, u8 * val)
433 {
434 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
435 addr & IPW_REG_INDIRECT_ADDR_MASK);
436 read_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
437 }
438
439 static inline void write_nic_byte(struct net_device *dev, u32 addr, u8 val)
440 {
441 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
442 addr & IPW_REG_INDIRECT_ADDR_MASK);
443 write_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
444 }
445
446 static inline void write_nic_auto_inc_address(struct net_device *dev, u32 addr)
447 {
448 write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS,
449 addr & IPW_REG_INDIRECT_ADDR_MASK);
450 }
451
452 static inline void write_nic_dword_auto_inc(struct net_device *dev, u32 val)
453 {
454 write_register(dev, IPW_REG_AUTOINCREMENT_DATA, val);
455 }
456
457 static void write_nic_memory(struct net_device *dev, u32 addr, u32 len,
458 const u8 * buf)
459 {
460 u32 aligned_addr;
461 u32 aligned_len;
462 u32 dif_len;
463 u32 i;
464
465 /* read first nibble byte by byte */
466 aligned_addr = addr & (~0x3);
467 dif_len = addr - aligned_addr;
468 if (dif_len) {
469 /* Start reading at aligned_addr + dif_len */
470 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
471 aligned_addr);
472 for (i = dif_len; i < 4; i++, buf++)
473 write_register_byte(dev,
474 IPW_REG_INDIRECT_ACCESS_DATA + i,
475 *buf);
476
477 len -= dif_len;
478 aligned_addr += 4;
479 }
480
481 /* read DWs through autoincrement registers */
482 write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS, aligned_addr);
483 aligned_len = len & (~0x3);
484 for (i = 0; i < aligned_len; i += 4, buf += 4, aligned_addr += 4)
485 write_register(dev, IPW_REG_AUTOINCREMENT_DATA, *(u32 *) buf);
486
487 /* copy the last nibble */
488 dif_len = len - aligned_len;
489 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, aligned_addr);
490 for (i = 0; i < dif_len; i++, buf++)
491 write_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA + i,
492 *buf);
493 }
494
495 static void read_nic_memory(struct net_device *dev, u32 addr, u32 len,
496 u8 * buf)
497 {
498 u32 aligned_addr;
499 u32 aligned_len;
500 u32 dif_len;
501 u32 i;
502
503 /* read first nibble byte by byte */
504 aligned_addr = addr & (~0x3);
505 dif_len = addr - aligned_addr;
506 if (dif_len) {
507 /* Start reading at aligned_addr + dif_len */
508 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
509 aligned_addr);
510 for (i = dif_len; i < 4; i++, buf++)
511 read_register_byte(dev,
512 IPW_REG_INDIRECT_ACCESS_DATA + i,
513 buf);
514
515 len -= dif_len;
516 aligned_addr += 4;
517 }
518
519 /* read DWs through autoincrement registers */
520 write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS, aligned_addr);
521 aligned_len = len & (~0x3);
522 for (i = 0; i < aligned_len; i += 4, buf += 4, aligned_addr += 4)
523 read_register(dev, IPW_REG_AUTOINCREMENT_DATA, (u32 *) buf);
524
525 /* copy the last nibble */
526 dif_len = len - aligned_len;
527 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, aligned_addr);
528 for (i = 0; i < dif_len; i++, buf++)
529 read_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA + i, buf);
530 }
531
532 static bool ipw2100_hw_is_adapter_in_system(struct net_device *dev)
533 {
534 u32 dbg;
535
536 read_register(dev, IPW_REG_DOA_DEBUG_AREA_START, &dbg);
537
538 return dbg == IPW_DATA_DOA_DEBUG_VALUE;
539 }
540
541 static int ipw2100_get_ordinal(struct ipw2100_priv *priv, u32 ord,
542 void *val, u32 * len)
543 {
544 struct ipw2100_ordinals *ordinals = &priv->ordinals;
545 u32 addr;
546 u32 field_info;
547 u16 field_len;
548 u16 field_count;
549 u32 total_length;
550
551 if (ordinals->table1_addr == 0) {
552 printk(KERN_WARNING DRV_NAME ": attempt to use fw ordinals "
553 "before they have been loaded.\n");
554 return -EINVAL;
555 }
556
557 if (IS_ORDINAL_TABLE_ONE(ordinals, ord)) {
558 if (*len < IPW_ORD_TAB_1_ENTRY_SIZE) {
559 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
560
561 printk(KERN_WARNING DRV_NAME
562 ": ordinal buffer length too small, need %zd\n",
563 IPW_ORD_TAB_1_ENTRY_SIZE);
564
565 return -EINVAL;
566 }
567
568 read_nic_dword(priv->net_dev,
569 ordinals->table1_addr + (ord << 2), &addr);
570 read_nic_dword(priv->net_dev, addr, val);
571
572 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
573
574 return 0;
575 }
576
577 if (IS_ORDINAL_TABLE_TWO(ordinals, ord)) {
578
579 ord -= IPW_START_ORD_TAB_2;
580
581 /* get the address of statistic */
582 read_nic_dword(priv->net_dev,
583 ordinals->table2_addr + (ord << 3), &addr);
584
585 /* get the second DW of statistics ;
586 * two 16-bit words - first is length, second is count */
587 read_nic_dword(priv->net_dev,
588 ordinals->table2_addr + (ord << 3) + sizeof(u32),
589 &field_info);
590
591 /* get each entry length */
592 field_len = *((u16 *) & field_info);
593
594 /* get number of entries */
595 field_count = *(((u16 *) & field_info) + 1);
596
597 /* abort if no enough memory */
598 total_length = field_len * field_count;
599 if (total_length > *len) {
600 *len = total_length;
601 return -EINVAL;
602 }
603
604 *len = total_length;
605 if (!total_length)
606 return 0;
607
608 /* read the ordinal data from the SRAM */
609 read_nic_memory(priv->net_dev, addr, total_length, val);
610
611 return 0;
612 }
613
614 printk(KERN_WARNING DRV_NAME ": ordinal %d neither in table 1 nor "
615 "in table 2\n", ord);
616
617 return -EINVAL;
618 }
619
620 static int ipw2100_set_ordinal(struct ipw2100_priv *priv, u32 ord, u32 * val,
621 u32 * len)
622 {
623 struct ipw2100_ordinals *ordinals = &priv->ordinals;
624 u32 addr;
625
626 if (IS_ORDINAL_TABLE_ONE(ordinals, ord)) {
627 if (*len != IPW_ORD_TAB_1_ENTRY_SIZE) {
628 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
629 IPW_DEBUG_INFO("wrong size\n");
630 return -EINVAL;
631 }
632
633 read_nic_dword(priv->net_dev,
634 ordinals->table1_addr + (ord << 2), &addr);
635
636 write_nic_dword(priv->net_dev, addr, *val);
637
638 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
639
640 return 0;
641 }
642
643 IPW_DEBUG_INFO("wrong table\n");
644 if (IS_ORDINAL_TABLE_TWO(ordinals, ord))
645 return -EINVAL;
646
647 return -EINVAL;
648 }
649
650 static char *snprint_line(char *buf, size_t count,
651 const u8 * data, u32 len, u32 ofs)
652 {
653 int out, i, j, l;
654 char c;
655
656 out = snprintf(buf, count, "%08X", ofs);
657
658 for (l = 0, i = 0; i < 2; i++) {
659 out += snprintf(buf + out, count - out, " ");
660 for (j = 0; j < 8 && l < len; j++, l++)
661 out += snprintf(buf + out, count - out, "%02X ",
662 data[(i * 8 + j)]);
663 for (; j < 8; j++)
664 out += snprintf(buf + out, count - out, " ");
665 }
666
667 out += snprintf(buf + out, count - out, " ");
668 for (l = 0, i = 0; i < 2; i++) {
669 out += snprintf(buf + out, count - out, " ");
670 for (j = 0; j < 8 && l < len; j++, l++) {
671 c = data[(i * 8 + j)];
672 if (!isascii(c) || !isprint(c))
673 c = '.';
674
675 out += snprintf(buf + out, count - out, "%c", c);
676 }
677
678 for (; j < 8; j++)
679 out += snprintf(buf + out, count - out, " ");
680 }
681
682 return buf;
683 }
684
685 static void printk_buf(int level, const u8 * data, u32 len)
686 {
687 char line[81];
688 u32 ofs = 0;
689 if (!(ipw2100_debug_level & level))
690 return;
691
692 while (len) {
693 printk(KERN_DEBUG "%s\n",
694 snprint_line(line, sizeof(line), &data[ofs],
695 min(len, 16U), ofs));
696 ofs += 16;
697 len -= min(len, 16U);
698 }
699 }
700
701 #define MAX_RESET_BACKOFF 10
702
703 static void schedule_reset(struct ipw2100_priv *priv)
704 {
705 unsigned long now = get_seconds();
706
707 /* If we haven't received a reset request within the backoff period,
708 * then we can reset the backoff interval so this reset occurs
709 * immediately */
710 if (priv->reset_backoff &&
711 (now - priv->last_reset > priv->reset_backoff))
712 priv->reset_backoff = 0;
713
714 priv->last_reset = get_seconds();
715
716 if (!(priv->status & STATUS_RESET_PENDING)) {
717 IPW_DEBUG_INFO("%s: Scheduling firmware restart (%ds).\n",
718 priv->net_dev->name, priv->reset_backoff);
719 netif_carrier_off(priv->net_dev);
720 netif_stop_queue(priv->net_dev);
721 priv->status |= STATUS_RESET_PENDING;
722 if (priv->reset_backoff)
723 schedule_delayed_work(&priv->reset_work,
724 priv->reset_backoff * HZ);
725 else
726 schedule_delayed_work(&priv->reset_work, 0);
727
728 if (priv->reset_backoff < MAX_RESET_BACKOFF)
729 priv->reset_backoff++;
730
731 wake_up_interruptible(&priv->wait_command_queue);
732 } else
733 IPW_DEBUG_INFO("%s: Firmware restart already in progress.\n",
734 priv->net_dev->name);
735
736 }
737
738 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
739 static int ipw2100_hw_send_command(struct ipw2100_priv *priv,
740 struct host_command *cmd)
741 {
742 struct list_head *element;
743 struct ipw2100_tx_packet *packet;
744 unsigned long flags;
745 int err = 0;
746
747 IPW_DEBUG_HC("Sending %s command (#%d), %d bytes\n",
748 command_types[cmd->host_command], cmd->host_command,
749 cmd->host_command_length);
750 printk_buf(IPW_DL_HC, (u8 *) cmd->host_command_parameters,
751 cmd->host_command_length);
752
753 spin_lock_irqsave(&priv->low_lock, flags);
754
755 if (priv->fatal_error) {
756 IPW_DEBUG_INFO
757 ("Attempt to send command while hardware in fatal error condition.\n");
758 err = -EIO;
759 goto fail_unlock;
760 }
761
762 if (!(priv->status & STATUS_RUNNING)) {
763 IPW_DEBUG_INFO
764 ("Attempt to send command while hardware is not running.\n");
765 err = -EIO;
766 goto fail_unlock;
767 }
768
769 if (priv->status & STATUS_CMD_ACTIVE) {
770 IPW_DEBUG_INFO
771 ("Attempt to send command while another command is pending.\n");
772 err = -EBUSY;
773 goto fail_unlock;
774 }
775
776 if (list_empty(&priv->msg_free_list)) {
777 IPW_DEBUG_INFO("no available msg buffers\n");
778 goto fail_unlock;
779 }
780
781 priv->status |= STATUS_CMD_ACTIVE;
782 priv->messages_sent++;
783
784 element = priv->msg_free_list.next;
785
786 packet = list_entry(element, struct ipw2100_tx_packet, list);
787 packet->jiffy_start = jiffies;
788
789 /* initialize the firmware command packet */
790 packet->info.c_struct.cmd->host_command_reg = cmd->host_command;
791 packet->info.c_struct.cmd->host_command_reg1 = cmd->host_command1;
792 packet->info.c_struct.cmd->host_command_len_reg =
793 cmd->host_command_length;
794 packet->info.c_struct.cmd->sequence = cmd->host_command_sequence;
795
796 memcpy(packet->info.c_struct.cmd->host_command_params_reg,
797 cmd->host_command_parameters,
798 sizeof(packet->info.c_struct.cmd->host_command_params_reg));
799
800 list_del(element);
801 DEC_STAT(&priv->msg_free_stat);
802
803 list_add_tail(element, &priv->msg_pend_list);
804 INC_STAT(&priv->msg_pend_stat);
805
806 ipw2100_tx_send_commands(priv);
807 ipw2100_tx_send_data(priv);
808
809 spin_unlock_irqrestore(&priv->low_lock, flags);
810
811 /*
812 * We must wait for this command to complete before another
813 * command can be sent... but if we wait more than 3 seconds
814 * then there is a problem.
815 */
816
817 err =
818 wait_event_interruptible_timeout(priv->wait_command_queue,
819 !(priv->
820 status & STATUS_CMD_ACTIVE),
821 HOST_COMPLETE_TIMEOUT);
822
823 if (err == 0) {
824 IPW_DEBUG_INFO("Command completion failed out after %dms.\n",
825 1000 * (HOST_COMPLETE_TIMEOUT / HZ));
826 priv->fatal_error = IPW2100_ERR_MSG_TIMEOUT;
827 priv->status &= ~STATUS_CMD_ACTIVE;
828 schedule_reset(priv);
829 return -EIO;
830 }
831
832 if (priv->fatal_error) {
833 printk(KERN_WARNING DRV_NAME ": %s: firmware fatal error\n",
834 priv->net_dev->name);
835 return -EIO;
836 }
837
838 /* !!!!! HACK TEST !!!!!
839 * When lots of debug trace statements are enabled, the driver
840 * doesn't seem to have as many firmware restart cycles...
841 *
842 * As a test, we're sticking in a 1/100s delay here */
843 schedule_timeout_uninterruptible(msecs_to_jiffies(10));
844
845 return 0;
846
847 fail_unlock:
848 spin_unlock_irqrestore(&priv->low_lock, flags);
849
850 return err;
851 }
852
853 /*
854 * Verify the values and data access of the hardware
855 * No locks needed or used. No functions called.
856 */
857 static int ipw2100_verify(struct ipw2100_priv *priv)
858 {
859 u32 data1, data2;
860 u32 address;
861
862 u32 val1 = 0x76543210;
863 u32 val2 = 0xFEDCBA98;
864
865 /* Domain 0 check - all values should be DOA_DEBUG */
866 for (address = IPW_REG_DOA_DEBUG_AREA_START;
867 address < IPW_REG_DOA_DEBUG_AREA_END; address += sizeof(u32)) {
868 read_register(priv->net_dev, address, &data1);
869 if (data1 != IPW_DATA_DOA_DEBUG_VALUE)
870 return -EIO;
871 }
872
873 /* Domain 1 check - use arbitrary read/write compare */
874 for (address = 0; address < 5; address++) {
875 /* The memory area is not used now */
876 write_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x32,
877 val1);
878 write_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x36,
879 val2);
880 read_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x32,
881 &data1);
882 read_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x36,
883 &data2);
884 if (val1 == data1 && val2 == data2)
885 return 0;
886 }
887
888 return -EIO;
889 }
890
891 /*
892 *
893 * Loop until the CARD_DISABLED bit is the same value as the
894 * supplied parameter
895 *
896 * TODO: See if it would be more efficient to do a wait/wake
897 * cycle and have the completion event trigger the wakeup
898 *
899 */
900 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100 // 100 milli
901 static int ipw2100_wait_for_card_state(struct ipw2100_priv *priv, int state)
902 {
903 int i;
904 u32 card_state;
905 u32 len = sizeof(card_state);
906 int err;
907
908 for (i = 0; i <= IPW_CARD_DISABLE_COMPLETE_WAIT * 1000; i += 50) {
909 err = ipw2100_get_ordinal(priv, IPW_ORD_CARD_DISABLED,
910 &card_state, &len);
911 if (err) {
912 IPW_DEBUG_INFO("Query of CARD_DISABLED ordinal "
913 "failed.\n");
914 return 0;
915 }
916
917 /* We'll break out if either the HW state says it is
918 * in the state we want, or if HOST_COMPLETE command
919 * finishes */
920 if ((card_state == state) ||
921 ((priv->status & STATUS_ENABLED) ?
922 IPW_HW_STATE_ENABLED : IPW_HW_STATE_DISABLED) == state) {
923 if (state == IPW_HW_STATE_ENABLED)
924 priv->status |= STATUS_ENABLED;
925 else
926 priv->status &= ~STATUS_ENABLED;
927
928 return 0;
929 }
930
931 udelay(50);
932 }
933
934 IPW_DEBUG_INFO("ipw2100_wait_for_card_state to %s state timed out\n",
935 state ? "DISABLED" : "ENABLED");
936 return -EIO;
937 }
938
939 /*********************************************************************
940 Procedure : sw_reset_and_clock
941 Purpose : Asserts s/w reset, asserts clock initialization
942 and waits for clock stabilization
943 ********************************************************************/
944 static int sw_reset_and_clock(struct ipw2100_priv *priv)
945 {
946 int i;
947 u32 r;
948
949 // assert s/w reset
950 write_register(priv->net_dev, IPW_REG_RESET_REG,
951 IPW_AUX_HOST_RESET_REG_SW_RESET);
952
953 // wait for clock stabilization
954 for (i = 0; i < 1000; i++) {
955 udelay(IPW_WAIT_RESET_ARC_COMPLETE_DELAY);
956
957 // check clock ready bit
958 read_register(priv->net_dev, IPW_REG_RESET_REG, &r);
959 if (r & IPW_AUX_HOST_RESET_REG_PRINCETON_RESET)
960 break;
961 }
962
963 if (i == 1000)
964 return -EIO; // TODO: better error value
965
966 /* set "initialization complete" bit to move adapter to
967 * D0 state */
968 write_register(priv->net_dev, IPW_REG_GP_CNTRL,
969 IPW_AUX_HOST_GP_CNTRL_BIT_INIT_DONE);
970
971 /* wait for clock stabilization */
972 for (i = 0; i < 10000; i++) {
973 udelay(IPW_WAIT_CLOCK_STABILIZATION_DELAY * 4);
974
975 /* check clock ready bit */
976 read_register(priv->net_dev, IPW_REG_GP_CNTRL, &r);
977 if (r & IPW_AUX_HOST_GP_CNTRL_BIT_CLOCK_READY)
978 break;
979 }
980
981 if (i == 10000)
982 return -EIO; /* TODO: better error value */
983
984 /* set D0 standby bit */
985 read_register(priv->net_dev, IPW_REG_GP_CNTRL, &r);
986 write_register(priv->net_dev, IPW_REG_GP_CNTRL,
987 r | IPW_AUX_HOST_GP_CNTRL_BIT_HOST_ALLOWS_STANDBY);
988
989 return 0;
990 }
991
992 /*********************************************************************
993 Procedure : ipw2100_download_firmware
994 Purpose : Initiaze adapter after power on.
995 The sequence is:
996 1. assert s/w reset first!
997 2. awake clocks & wait for clock stabilization
998 3. hold ARC (don't ask me why...)
999 4. load Dino ucode and reset/clock init again
1000 5. zero-out shared mem
1001 6. download f/w
1002 *******************************************************************/
1003 static int ipw2100_download_firmware(struct ipw2100_priv *priv)
1004 {
1005 u32 address;
1006 int err;
1007
1008 #ifndef CONFIG_PM
1009 /* Fetch the firmware and microcode */
1010 struct ipw2100_fw ipw2100_firmware;
1011 #endif
1012
1013 if (priv->fatal_error) {
1014 IPW_DEBUG_ERROR("%s: ipw2100_download_firmware called after "
1015 "fatal error %d. Interface must be brought down.\n",
1016 priv->net_dev->name, priv->fatal_error);
1017 return -EINVAL;
1018 }
1019 #ifdef CONFIG_PM
1020 if (!ipw2100_firmware.version) {
1021 err = ipw2100_get_firmware(priv, &ipw2100_firmware);
1022 if (err) {
1023 IPW_DEBUG_ERROR("%s: ipw2100_get_firmware failed: %d\n",
1024 priv->net_dev->name, err);
1025 priv->fatal_error = IPW2100_ERR_FW_LOAD;
1026 goto fail;
1027 }
1028 }
1029 #else
1030 err = ipw2100_get_firmware(priv, &ipw2100_firmware);
1031 if (err) {
1032 IPW_DEBUG_ERROR("%s: ipw2100_get_firmware failed: %d\n",
1033 priv->net_dev->name, err);
1034 priv->fatal_error = IPW2100_ERR_FW_LOAD;
1035 goto fail;
1036 }
1037 #endif
1038 priv->firmware_version = ipw2100_firmware.version;
1039
1040 /* s/w reset and clock stabilization */
1041 err = sw_reset_and_clock(priv);
1042 if (err) {
1043 IPW_DEBUG_ERROR("%s: sw_reset_and_clock failed: %d\n",
1044 priv->net_dev->name, err);
1045 goto fail;
1046 }
1047
1048 err = ipw2100_verify(priv);
1049 if (err) {
1050 IPW_DEBUG_ERROR("%s: ipw2100_verify failed: %d\n",
1051 priv->net_dev->name, err);
1052 goto fail;
1053 }
1054
1055 /* Hold ARC */
1056 write_nic_dword(priv->net_dev,
1057 IPW_INTERNAL_REGISTER_HALT_AND_RESET, 0x80000000);
1058
1059 /* allow ARC to run */
1060 write_register(priv->net_dev, IPW_REG_RESET_REG, 0);
1061
1062 /* load microcode */
1063 err = ipw2100_ucode_download(priv, &ipw2100_firmware);
1064 if (err) {
1065 printk(KERN_ERR DRV_NAME ": %s: Error loading microcode: %d\n",
1066 priv->net_dev->name, err);
1067 goto fail;
1068 }
1069
1070 /* release ARC */
1071 write_nic_dword(priv->net_dev,
1072 IPW_INTERNAL_REGISTER_HALT_AND_RESET, 0x00000000);
1073
1074 /* s/w reset and clock stabilization (again!!!) */
1075 err = sw_reset_and_clock(priv);
1076 if (err) {
1077 printk(KERN_ERR DRV_NAME
1078 ": %s: sw_reset_and_clock failed: %d\n",
1079 priv->net_dev->name, err);
1080 goto fail;
1081 }
1082
1083 /* load f/w */
1084 err = ipw2100_fw_download(priv, &ipw2100_firmware);
1085 if (err) {
1086 IPW_DEBUG_ERROR("%s: Error loading firmware: %d\n",
1087 priv->net_dev->name, err);
1088 goto fail;
1089 }
1090 #ifndef CONFIG_PM
1091 /*
1092 * When the .resume method of the driver is called, the other
1093 * part of the system, i.e. the ide driver could still stay in
1094 * the suspend stage. This prevents us from loading the firmware
1095 * from the disk. --YZ
1096 */
1097
1098 /* free any storage allocated for firmware image */
1099 ipw2100_release_firmware(priv, &ipw2100_firmware);
1100 #endif
1101
1102 /* zero out Domain 1 area indirectly (Si requirement) */
1103 for (address = IPW_HOST_FW_SHARED_AREA0;
1104 address < IPW_HOST_FW_SHARED_AREA0_END; address += 4)
1105 write_nic_dword(priv->net_dev, address, 0);
1106 for (address = IPW_HOST_FW_SHARED_AREA1;
1107 address < IPW_HOST_FW_SHARED_AREA1_END; address += 4)
1108 write_nic_dword(priv->net_dev, address, 0);
1109 for (address = IPW_HOST_FW_SHARED_AREA2;
1110 address < IPW_HOST_FW_SHARED_AREA2_END; address += 4)
1111 write_nic_dword(priv->net_dev, address, 0);
1112 for (address = IPW_HOST_FW_SHARED_AREA3;
1113 address < IPW_HOST_FW_SHARED_AREA3_END; address += 4)
1114 write_nic_dword(priv->net_dev, address, 0);
1115 for (address = IPW_HOST_FW_INTERRUPT_AREA;
1116 address < IPW_HOST_FW_INTERRUPT_AREA_END; address += 4)
1117 write_nic_dword(priv->net_dev, address, 0);
1118
1119 return 0;
1120
1121 fail:
1122 ipw2100_release_firmware(priv, &ipw2100_firmware);
1123 return err;
1124 }
1125
1126 static inline void ipw2100_enable_interrupts(struct ipw2100_priv *priv)
1127 {
1128 if (priv->status & STATUS_INT_ENABLED)
1129 return;
1130 priv->status |= STATUS_INT_ENABLED;
1131 write_register(priv->net_dev, IPW_REG_INTA_MASK, IPW_INTERRUPT_MASK);
1132 }
1133
1134 static inline void ipw2100_disable_interrupts(struct ipw2100_priv *priv)
1135 {
1136 if (!(priv->status & STATUS_INT_ENABLED))
1137 return;
1138 priv->status &= ~STATUS_INT_ENABLED;
1139 write_register(priv->net_dev, IPW_REG_INTA_MASK, 0x0);
1140 }
1141
1142 static void ipw2100_initialize_ordinals(struct ipw2100_priv *priv)
1143 {
1144 struct ipw2100_ordinals *ord = &priv->ordinals;
1145
1146 IPW_DEBUG_INFO("enter\n");
1147
1148 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_ORDINALS_TABLE_1,
1149 &ord->table1_addr);
1150
1151 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_ORDINALS_TABLE_2,
1152 &ord->table2_addr);
1153
1154 read_nic_dword(priv->net_dev, ord->table1_addr, &ord->table1_size);
1155 read_nic_dword(priv->net_dev, ord->table2_addr, &ord->table2_size);
1156
1157 ord->table2_size &= 0x0000FFFF;
1158
1159 IPW_DEBUG_INFO("table 1 size: %d\n", ord->table1_size);
1160 IPW_DEBUG_INFO("table 2 size: %d\n", ord->table2_size);
1161 IPW_DEBUG_INFO("exit\n");
1162 }
1163
1164 static inline void ipw2100_hw_set_gpio(struct ipw2100_priv *priv)
1165 {
1166 u32 reg = 0;
1167 /*
1168 * Set GPIO 3 writable by FW; GPIO 1 writable
1169 * by driver and enable clock
1170 */
1171 reg = (IPW_BIT_GPIO_GPIO3_MASK | IPW_BIT_GPIO_GPIO1_ENABLE |
1172 IPW_BIT_GPIO_LED_OFF);
1173 write_register(priv->net_dev, IPW_REG_GPIO, reg);
1174 }
1175
1176 static int rf_kill_active(struct ipw2100_priv *priv)
1177 {
1178 #define MAX_RF_KILL_CHECKS 5
1179 #define RF_KILL_CHECK_DELAY 40
1180
1181 unsigned short value = 0;
1182 u32 reg = 0;
1183 int i;
1184
1185 if (!(priv->hw_features & HW_FEATURE_RFKILL)) {
1186 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, false);
1187 priv->status &= ~STATUS_RF_KILL_HW;
1188 return 0;
1189 }
1190
1191 for (i = 0; i < MAX_RF_KILL_CHECKS; i++) {
1192 udelay(RF_KILL_CHECK_DELAY);
1193 read_register(priv->net_dev, IPW_REG_GPIO, ®);
1194 value = (value << 1) | ((reg & IPW_BIT_GPIO_RF_KILL) ? 0 : 1);
1195 }
1196
1197 if (value == 0) {
1198 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true);
1199 priv->status |= STATUS_RF_KILL_HW;
1200 } else {
1201 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, false);
1202 priv->status &= ~STATUS_RF_KILL_HW;
1203 }
1204
1205 return (value == 0);
1206 }
1207
1208 static int ipw2100_get_hw_features(struct ipw2100_priv *priv)
1209 {
1210 u32 addr, len;
1211 u32 val;
1212
1213 /*
1214 * EEPROM_SRAM_DB_START_ADDRESS using ordinal in ordinal table 1
1215 */
1216 len = sizeof(addr);
1217 if (ipw2100_get_ordinal
1218 (priv, IPW_ORD_EEPROM_SRAM_DB_BLOCK_START_ADDRESS, &addr, &len)) {
1219 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1220 __LINE__);
1221 return -EIO;
1222 }
1223
1224 IPW_DEBUG_INFO("EEPROM address: %08X\n", addr);
1225
1226 /*
1227 * EEPROM version is the byte at offset 0xfd in firmware
1228 * We read 4 bytes, then shift out the byte we actually want */
1229 read_nic_dword(priv->net_dev, addr + 0xFC, &val);
1230 priv->eeprom_version = (val >> 24) & 0xFF;
1231 IPW_DEBUG_INFO("EEPROM version: %d\n", priv->eeprom_version);
1232
1233 /*
1234 * HW RF Kill enable is bit 0 in byte at offset 0x21 in firmware
1235 *
1236 * notice that the EEPROM bit is reverse polarity, i.e.
1237 * bit = 0 signifies HW RF kill switch is supported
1238 * bit = 1 signifies HW RF kill switch is NOT supported
1239 */
1240 read_nic_dword(priv->net_dev, addr + 0x20, &val);
1241 if (!((val >> 24) & 0x01))
1242 priv->hw_features |= HW_FEATURE_RFKILL;
1243
1244 IPW_DEBUG_INFO("HW RF Kill: %ssupported.\n",
1245 (priv->hw_features & HW_FEATURE_RFKILL) ? "" : "not ");
1246
1247 return 0;
1248 }
1249
1250 /*
1251 * Start firmware execution after power on and intialization
1252 * The sequence is:
1253 * 1. Release ARC
1254 * 2. Wait for f/w initialization completes;
1255 */
1256 static int ipw2100_start_adapter(struct ipw2100_priv *priv)
1257 {
1258 int i;
1259 u32 inta, inta_mask, gpio;
1260
1261 IPW_DEBUG_INFO("enter\n");
1262
1263 if (priv->status & STATUS_RUNNING)
1264 return 0;
1265
1266 /*
1267 * Initialize the hw - drive adapter to DO state by setting
1268 * init_done bit. Wait for clk_ready bit and Download
1269 * fw & dino ucode
1270 */
1271 if (ipw2100_download_firmware(priv)) {
1272 printk(KERN_ERR DRV_NAME
1273 ": %s: Failed to power on the adapter.\n",
1274 priv->net_dev->name);
1275 return -EIO;
1276 }
1277
1278 /* Clear the Tx, Rx and Msg queues and the r/w indexes
1279 * in the firmware RBD and TBD ring queue */
1280 ipw2100_queues_initialize(priv);
1281
1282 ipw2100_hw_set_gpio(priv);
1283
1284 /* TODO -- Look at disabling interrupts here to make sure none
1285 * get fired during FW initialization */
1286
1287 /* Release ARC - clear reset bit */
1288 write_register(priv->net_dev, IPW_REG_RESET_REG, 0);
1289
1290 /* wait for f/w intialization complete */
1291 IPW_DEBUG_FW("Waiting for f/w initialization to complete...\n");
1292 i = 5000;
1293 do {
1294 schedule_timeout_uninterruptible(msecs_to_jiffies(40));
1295 /* Todo... wait for sync command ... */
1296
1297 read_register(priv->net_dev, IPW_REG_INTA, &inta);
1298
1299 /* check "init done" bit */
1300 if (inta & IPW2100_INTA_FW_INIT_DONE) {
1301 /* reset "init done" bit */
1302 write_register(priv->net_dev, IPW_REG_INTA,
1303 IPW2100_INTA_FW_INIT_DONE);
1304 break;
1305 }
1306
1307 /* check error conditions : we check these after the firmware
1308 * check so that if there is an error, the interrupt handler
1309 * will see it and the adapter will be reset */
1310 if (inta &
1311 (IPW2100_INTA_FATAL_ERROR | IPW2100_INTA_PARITY_ERROR)) {
1312 /* clear error conditions */
1313 write_register(priv->net_dev, IPW_REG_INTA,
1314 IPW2100_INTA_FATAL_ERROR |
1315 IPW2100_INTA_PARITY_ERROR);
1316 }
1317 } while (--i);
1318
1319 /* Clear out any pending INTAs since we aren't supposed to have
1320 * interrupts enabled at this point... */
1321 read_register(priv->net_dev, IPW_REG_INTA, &inta);
1322 read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask);
1323 inta &= IPW_INTERRUPT_MASK;
1324 /* Clear out any pending interrupts */
1325 if (inta & inta_mask)
1326 write_register(priv->net_dev, IPW_REG_INTA, inta);
1327
1328 IPW_DEBUG_FW("f/w initialization complete: %s\n",
1329 i ? "SUCCESS" : "FAILED");
1330
1331 if (!i) {
1332 printk(KERN_WARNING DRV_NAME
1333 ": %s: Firmware did not initialize.\n",
1334 priv->net_dev->name);
1335 return -EIO;
1336 }
1337
1338 /* allow firmware to write to GPIO1 & GPIO3 */
1339 read_register(priv->net_dev, IPW_REG_GPIO, &gpio);
1340
1341 gpio |= (IPW_BIT_GPIO_GPIO1_MASK | IPW_BIT_GPIO_GPIO3_MASK);
1342
1343 write_register(priv->net_dev, IPW_REG_GPIO, gpio);
1344
1345 /* Ready to receive commands */
1346 priv->status |= STATUS_RUNNING;
1347
1348 /* The adapter has been reset; we are not associated */
1349 priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED);
1350
1351 IPW_DEBUG_INFO("exit\n");
1352
1353 return 0;
1354 }
1355
1356 static inline void ipw2100_reset_fatalerror(struct ipw2100_priv *priv)
1357 {
1358 if (!priv->fatal_error)
1359 return;
1360
1361 priv->fatal_errors[priv->fatal_index++] = priv->fatal_error;
1362 priv->fatal_index %= IPW2100_ERROR_QUEUE;
1363 priv->fatal_error = 0;
1364 }
1365
1366 /* NOTE: Our interrupt is disabled when this method is called */
1367 static int ipw2100_power_cycle_adapter(struct ipw2100_priv *priv)
1368 {
1369 u32 reg;
1370 int i;
1371
1372 IPW_DEBUG_INFO("Power cycling the hardware.\n");
1373
1374 ipw2100_hw_set_gpio(priv);
1375
1376 /* Step 1. Stop Master Assert */
1377 write_register(priv->net_dev, IPW_REG_RESET_REG,
1378 IPW_AUX_HOST_RESET_REG_STOP_MASTER);
1379
1380 /* Step 2. Wait for stop Master Assert
1381 * (not more than 50us, otherwise ret error */
1382 i = 5;
1383 do {
1384 udelay(IPW_WAIT_RESET_MASTER_ASSERT_COMPLETE_DELAY);
1385 read_register(priv->net_dev, IPW_REG_RESET_REG, ®);
1386
1387 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED)
1388 break;
1389 } while (--i);
1390
1391 priv->status &= ~STATUS_RESET_PENDING;
1392
1393 if (!i) {
1394 IPW_DEBUG_INFO
1395 ("exit - waited too long for master assert stop\n");
1396 return -EIO;
1397 }
1398
1399 write_register(priv->net_dev, IPW_REG_RESET_REG,
1400 IPW_AUX_HOST_RESET_REG_SW_RESET);
1401
1402 /* Reset any fatal_error conditions */
1403 ipw2100_reset_fatalerror(priv);
1404
1405 /* At this point, the adapter is now stopped and disabled */
1406 priv->status &= ~(STATUS_RUNNING | STATUS_ASSOCIATING |
1407 STATUS_ASSOCIATED | STATUS_ENABLED);
1408
1409 return 0;
1410 }
1411
1412 /*
1413 * Send the CARD_DISABLE_PHY_OFF command to the card to disable it
1414 *
1415 * After disabling, if the card was associated, a STATUS_ASSN_LOST will be sent.
1416 *
1417 * STATUS_CARD_DISABLE_NOTIFICATION will be sent regardless of
1418 * if STATUS_ASSN_LOST is sent.
1419 */
1420 static int ipw2100_hw_phy_off(struct ipw2100_priv *priv)
1421 {
1422
1423 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
1424
1425 struct host_command cmd = {
1426 .host_command = CARD_DISABLE_PHY_OFF,
1427 .host_command_sequence = 0,
1428 .host_command_length = 0,
1429 };
1430 int err, i;
1431 u32 val1, val2;
1432
1433 IPW_DEBUG_HC("CARD_DISABLE_PHY_OFF\n");
1434
1435 /* Turn off the radio */
1436 err = ipw2100_hw_send_command(priv, &cmd);
1437 if (err)
1438 return err;
1439
1440 for (i = 0; i < 2500; i++) {
1441 read_nic_dword(priv->net_dev, IPW2100_CONTROL_REG, &val1);
1442 read_nic_dword(priv->net_dev, IPW2100_COMMAND, &val2);
1443
1444 if ((val1 & IPW2100_CONTROL_PHY_OFF) &&
1445 (val2 & IPW2100_COMMAND_PHY_OFF))
1446 return 0;
1447
1448 schedule_timeout_uninterruptible(HW_PHY_OFF_LOOP_DELAY);
1449 }
1450
1451 return -EIO;
1452 }
1453
1454 static int ipw2100_enable_adapter(struct ipw2100_priv *priv)
1455 {
1456 struct host_command cmd = {
1457 .host_command = HOST_COMPLETE,
1458 .host_command_sequence = 0,
1459 .host_command_length = 0
1460 };
1461 int err = 0;
1462
1463 IPW_DEBUG_HC("HOST_COMPLETE\n");
1464
1465 if (priv->status & STATUS_ENABLED)
1466 return 0;
1467
1468 mutex_lock(&priv->adapter_mutex);
1469
1470 if (rf_kill_active(priv)) {
1471 IPW_DEBUG_HC("Command aborted due to RF kill active.\n");
1472 goto fail_up;
1473 }
1474
1475 err = ipw2100_hw_send_command(priv, &cmd);
1476 if (err) {
1477 IPW_DEBUG_INFO("Failed to send HOST_COMPLETE command\n");
1478 goto fail_up;
1479 }
1480
1481 err = ipw2100_wait_for_card_state(priv, IPW_HW_STATE_ENABLED);
1482 if (err) {
1483 IPW_DEBUG_INFO("%s: card not responding to init command.\n",
1484 priv->net_dev->name);
1485 goto fail_up;
1486 }
1487
1488 if (priv->stop_hang_check) {
1489 priv->stop_hang_check = 0;
1490 schedule_delayed_work(&priv->hang_check, HZ / 2);
1491 }
1492
1493 fail_up:
1494 mutex_unlock(&priv->adapter_mutex);
1495 return err;
1496 }
1497
1498 static int ipw2100_hw_stop_adapter(struct ipw2100_priv *priv)
1499 {
1500 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
1501
1502 struct host_command cmd = {
1503 .host_command = HOST_PRE_POWER_DOWN,
1504 .host_command_sequence = 0,
1505 .host_command_length = 0,
1506 };
1507 int err, i;
1508 u32 reg;
1509
1510 if (!(priv->status & STATUS_RUNNING))
1511 return 0;
1512
1513 priv->status |= STATUS_STOPPING;
1514
1515 /* We can only shut down the card if the firmware is operational. So,
1516 * if we haven't reset since a fatal_error, then we can not send the
1517 * shutdown commands. */
1518 if (!priv->fatal_error) {
1519 /* First, make sure the adapter is enabled so that the PHY_OFF
1520 * command can shut it down */
1521 ipw2100_enable_adapter(priv);
1522
1523 err = ipw2100_hw_phy_off(priv);
1524 if (err)
1525 printk(KERN_WARNING DRV_NAME
1526 ": Error disabling radio %d\n", err);
1527
1528 /*
1529 * If in D0-standby mode going directly to D3 may cause a
1530 * PCI bus violation. Therefore we must change out of the D0
1531 * state.
1532 *
1533 * Sending the PREPARE_FOR_POWER_DOWN will restrict the
1534 * hardware from going into standby mode and will transition
1535 * out of D0-standby if it is already in that state.
1536 *
1537 * STATUS_PREPARE_POWER_DOWN_COMPLETE will be sent by the
1538 * driver upon completion. Once received, the driver can
1539 * proceed to the D3 state.
1540 *
1541 * Prepare for power down command to fw. This command would
1542 * take HW out of D0-standby and prepare it for D3 state.
1543 *
1544 * Currently FW does not support event notification for this
1545 * event. Therefore, skip waiting for it. Just wait a fixed
1546 * 100ms
1547 */
1548 IPW_DEBUG_HC("HOST_PRE_POWER_DOWN\n");
1549
1550 err = ipw2100_hw_send_command(priv, &cmd);
1551 if (err)
1552 printk(KERN_WARNING DRV_NAME ": "
1553 "%s: Power down command failed: Error %d\n",
1554 priv->net_dev->name, err);
1555 else
1556 schedule_timeout_uninterruptible(HW_POWER_DOWN_DELAY);
1557 }
1558
1559 priv->status &= ~STATUS_ENABLED;
1560
1561 /*
1562 * Set GPIO 3 writable by FW; GPIO 1 writable
1563 * by driver and enable clock
1564 */
1565 ipw2100_hw_set_gpio(priv);
1566
1567 /*
1568 * Power down adapter. Sequence:
1569 * 1. Stop master assert (RESET_REG[9]=1)
1570 * 2. Wait for stop master (RESET_REG[8]==1)
1571 * 3. S/w reset assert (RESET_REG[7] = 1)
1572 */
1573
1574 /* Stop master assert */
1575 write_register(priv->net_dev, IPW_REG_RESET_REG,
1576 IPW_AUX_HOST_RESET_REG_STOP_MASTER);
1577
1578 /* wait stop master not more than 50 usec.
1579 * Otherwise return error. */
1580 for (i = 5; i > 0; i--) {
1581 udelay(10);
1582
1583 /* Check master stop bit */
1584 read_register(priv->net_dev, IPW_REG_RESET_REG, ®);
1585
1586 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED)
1587 break;
1588 }
1589
1590 if (i == 0)
1591 printk(KERN_WARNING DRV_NAME
1592 ": %s: Could now power down adapter.\n",
1593 priv->net_dev->name);
1594
1595 /* assert s/w reset */
1596 write_register(priv->net_dev, IPW_REG_RESET_REG,
1597 IPW_AUX_HOST_RESET_REG_SW_RESET);
1598
1599 priv->status &= ~(STATUS_RUNNING | STATUS_STOPPING);
1600
1601 return 0;
1602 }
1603
1604 static int ipw2100_disable_adapter(struct ipw2100_priv *priv)
1605 {
1606 struct host_command cmd = {
1607 .host_command = CARD_DISABLE,
1608 .host_command_sequence = 0,
1609 .host_command_length = 0
1610 };
1611 int err = 0;
1612
1613 IPW_DEBUG_HC("CARD_DISABLE\n");
1614
1615 if (!(priv->status & STATUS_ENABLED))
1616 return 0;
1617
1618 /* Make sure we clear the associated state */
1619 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1620
1621 if (!priv->stop_hang_check) {
1622 priv->stop_hang_check = 1;
1623 cancel_delayed_work(&priv->hang_check);
1624 }
1625
1626 mutex_lock(&priv->adapter_mutex);
1627
1628 err = ipw2100_hw_send_command(priv, &cmd);
1629 if (err) {
1630 printk(KERN_WARNING DRV_NAME
1631 ": exit - failed to send CARD_DISABLE command\n");
1632 goto fail_up;
1633 }
1634
1635 err = ipw2100_wait_for_card_state(priv, IPW_HW_STATE_DISABLED);
1636 if (err) {
1637 printk(KERN_WARNING DRV_NAME
1638 ": exit - card failed to change to DISABLED\n");
1639 goto fail_up;
1640 }
1641
1642 IPW_DEBUG_INFO("TODO: implement scan state machine\n");
1643
1644 fail_up:
1645 mutex_unlock(&priv->adapter_mutex);
1646 return err;
1647 }
1648
1649 static int ipw2100_set_scan_options(struct ipw2100_priv *priv)
1650 {
1651 struct host_command cmd = {
1652 .host_command = SET_SCAN_OPTIONS,
1653 .host_command_sequence = 0,
1654 .host_command_length = 8
1655 };
1656 int err;
1657
1658 IPW_DEBUG_INFO("enter\n");
1659
1660 IPW_DEBUG_SCAN("setting scan options\n");
1661
1662 cmd.host_command_parameters[0] = 0;
1663
1664 if (!(priv->config & CFG_ASSOCIATE))
1665 cmd.host_command_parameters[0] |= IPW_SCAN_NOASSOCIATE;
1666 if ((priv->ieee->sec.flags & SEC_ENABLED) && priv->ieee->sec.enabled)
1667 cmd.host_command_parameters[0] |= IPW_SCAN_MIXED_CELL;
1668 if (priv->config & CFG_PASSIVE_SCAN)
1669 cmd.host_command_parameters[0] |= IPW_SCAN_PASSIVE;
1670
1671 cmd.host_command_parameters[1] = priv->channel_mask;
1672
1673 err = ipw2100_hw_send_command(priv, &cmd);
1674
1675 IPW_DEBUG_HC("SET_SCAN_OPTIONS 0x%04X\n",
1676 cmd.host_command_parameters[0]);
1677
1678 return err;
1679 }
1680
1681 static int ipw2100_start_scan(struct ipw2100_priv *priv)
1682 {
1683 struct host_command cmd = {
1684 .host_command = BROADCAST_SCAN,
1685 .host_command_sequence = 0,
1686 .host_command_length = 4
1687 };
1688 int err;
1689
1690 IPW_DEBUG_HC("START_SCAN\n");
1691
1692 cmd.host_command_parameters[0] = 0;
1693
1694 /* No scanning if in monitor mode */
1695 if (priv->ieee->iw_mode == IW_MODE_MONITOR)
1696 return 1;
1697
1698 if (priv->status & STATUS_SCANNING) {
1699 IPW_DEBUG_SCAN("Scan requested while already in scan...\n");
1700 return 0;
1701 }
1702
1703 IPW_DEBUG_INFO("enter\n");
1704
1705 /* Not clearing here; doing so makes iwlist always return nothing...
1706 *
1707 * We should modify the table logic to use aging tables vs. clearing
1708 * the table on each scan start.
1709 */
1710 IPW_DEBUG_SCAN("starting scan\n");
1711
1712 priv->status |= STATUS_SCANNING;
1713 err = ipw2100_hw_send_command(priv, &cmd);
1714 if (err)
1715 priv->status &= ~STATUS_SCANNING;
1716
1717 IPW_DEBUG_INFO("exit\n");
1718
1719 return err;
1720 }
1721
1722 static const struct libipw_geo ipw_geos[] = {
1723 { /* Restricted */
1724 "---",
1725 .bg_channels = 14,
1726 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
1727 {2427, 4}, {2432, 5}, {2437, 6},
1728 {2442, 7}, {2447, 8}, {2452, 9},
1729 {2457, 10}, {2462, 11}, {2467, 12},
1730 {2472, 13}, {2484, 14}},
1731 },
1732 };
1733
1734 static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
1735 {
1736 unsigned long flags;
1737 int rc = 0;
1738 u32 lock;
1739 u32 ord_len = sizeof(lock);
1740
1741 /* Age scan list entries found before suspend */
1742 if (priv->suspend_time) {
1743 libipw_networks_age(priv->ieee, priv->suspend_time);
1744 priv->suspend_time = 0;
1745 }
1746
1747 /* Quiet if manually disabled. */
1748 if (priv->status & STATUS_RF_KILL_SW) {
1749 IPW_DEBUG_INFO("%s: Radio is disabled by Manual Disable "
1750 "switch\n", priv->net_dev->name);
1751 return 0;
1752 }
1753
1754 /* the ipw2100 hardware really doesn't want power management delays
1755 * longer than 175usec
1756 */
1757 pm_qos_update_request(&ipw2100_pm_qos_req, 175);
1758
1759 /* If the interrupt is enabled, turn it off... */
1760 spin_lock_irqsave(&priv->low_lock, flags);
1761 ipw2100_disable_interrupts(priv);
1762
1763 /* Reset any fatal_error conditions */
1764 ipw2100_reset_fatalerror(priv);
1765 spin_unlock_irqrestore(&priv->low_lock, flags);
1766
1767 if (priv->status & STATUS_POWERED ||
1768 (priv->status & STATUS_RESET_PENDING)) {
1769 /* Power cycle the card ... */
1770 if (ipw2100_power_cycle_adapter(priv)) {
1771 printk(KERN_WARNING DRV_NAME
1772 ": %s: Could not cycle adapter.\n",
1773 priv->net_dev->name);
1774 rc = 1;
1775 goto exit;
1776 }
1777 } else
1778 priv->status |= STATUS_POWERED;
1779
1780 /* Load the firmware, start the clocks, etc. */
1781 if (ipw2100_start_adapter(priv)) {
1782 printk(KERN_ERR DRV_NAME
1783 ": %s: Failed to start the firmware.\n",
1784 priv->net_dev->name);
1785 rc = 1;
1786 goto exit;
1787 }
1788
1789 ipw2100_initialize_ordinals(priv);
1790
1791 /* Determine capabilities of this particular HW configuration */
1792 if (ipw2100_get_hw_features(priv)) {
1793 printk(KERN_ERR DRV_NAME
1794 ": %s: Failed to determine HW features.\n",
1795 priv->net_dev->name);
1796 rc = 1;
1797 goto exit;
1798 }
1799
1800 /* Initialize the geo */
1801 libipw_set_geo(priv->ieee, &ipw_geos[0]);
1802 priv->ieee->freq_band = LIBIPW_24GHZ_BAND;
1803
1804 lock = LOCK_NONE;
1805 if (ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len)) {
1806 printk(KERN_ERR DRV_NAME
1807 ": %s: Failed to clear ordinal lock.\n",
1808 priv->net_dev->name);
1809 rc = 1;
1810 goto exit;
1811 }
1812
1813 priv->status &= ~STATUS_SCANNING;
1814
1815 if (rf_kill_active(priv)) {
1816 printk(KERN_INFO "%s: Radio is disabled by RF switch.\n",
1817 priv->net_dev->name);
1818
1819 if (priv->stop_rf_kill) {
1820 priv->stop_rf_kill = 0;
1821 schedule_delayed_work(&priv->rf_kill,
1822 round_jiffies_relative(HZ));
1823 }
1824
1825 deferred = 1;
1826 }
1827
1828 /* Turn on the interrupt so that commands can be processed */
1829 ipw2100_enable_interrupts(priv);
1830
1831 /* Send all of the commands that must be sent prior to
1832 * HOST_COMPLETE */
1833 if (ipw2100_adapter_setup(priv)) {
1834 printk(KERN_ERR DRV_NAME ": %s: Failed to start the card.\n",
1835 priv->net_dev->name);
1836 rc = 1;
1837 goto exit;
1838 }
1839
1840 if (!deferred) {
1841 /* Enable the adapter - sends HOST_COMPLETE */
1842 if (ipw2100_enable_adapter(priv)) {
1843 printk(KERN_ERR DRV_NAME ": "
1844 "%s: failed in call to enable adapter.\n",
1845 priv->net_dev->name);
1846 ipw2100_hw_stop_adapter(priv);
1847 rc = 1;
1848 goto exit;
1849 }
1850
1851 /* Start a scan . . . */
1852 ipw2100_set_scan_options(priv);
1853 ipw2100_start_scan(priv);
1854 }
1855
1856 exit:
1857 return rc;
1858 }
1859
1860 static void ipw2100_down(struct ipw2100_priv *priv)
1861 {
1862 unsigned long flags;
1863 union iwreq_data wrqu = {
1864 .ap_addr = {
1865 .sa_family = ARPHRD_ETHER}
1866 };
1867 int associated = priv->status & STATUS_ASSOCIATED;
1868
1869 /* Kill the RF switch timer */
1870 if (!priv->stop_rf_kill) {
1871 priv->stop_rf_kill = 1;
1872 cancel_delayed_work(&priv->rf_kill);
1873 }
1874
1875 /* Kill the firmware hang check timer */
1876 if (!priv->stop_hang_check) {
1877 priv->stop_hang_check = 1;
1878 cancel_delayed_work(&priv->hang_check);
1879 }
1880
1881 /* Kill any pending resets */
1882 if (priv->status & STATUS_RESET_PENDING)
1883 cancel_delayed_work(&priv->reset_work);
1884
1885 /* Make sure the interrupt is on so that FW commands will be
1886 * processed correctly */
1887 spin_lock_irqsave(&priv->low_lock, flags);
1888 ipw2100_enable_interrupts(priv);
1889 spin_unlock_irqrestore(&priv->low_lock, flags);
1890
1891 if (ipw2100_hw_stop_adapter(priv))
1892 printk(KERN_ERR DRV_NAME ": %s: Error stopping adapter.\n",
1893 priv->net_dev->name);
1894
1895 /* Do not disable the interrupt until _after_ we disable
1896 * the adaptor. Otherwise the CARD_DISABLE command will never
1897 * be ack'd by the firmware */
1898 spin_lock_irqsave(&priv->low_lock, flags);
1899 ipw2100_disable_interrupts(priv);
1900 spin_unlock_irqrestore(&priv->low_lock, flags);
1901
1902 pm_qos_update_request(&ipw2100_pm_qos_req, PM_QOS_DEFAULT_VALUE);
1903
1904 /* We have to signal any supplicant if we are disassociating */
1905 if (associated)
1906 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
1907
1908 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1909 netif_carrier_off(priv->net_dev);
1910 netif_stop_queue(priv->net_dev);
1911 }
1912
1913 static int ipw2100_wdev_init(struct net_device *dev)
1914 {
1915 struct ipw2100_priv *priv = libipw_priv(dev);
1916 const struct libipw_geo *geo = libipw_get_geo(priv->ieee);
1917 struct wireless_dev *wdev = &priv->ieee->wdev;
1918 int i;
1919
1920 memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN);
1921
1922 /* fill-out priv->ieee->bg_band */
1923 if (geo->bg_channels) {
1924 struct ieee80211_supported_band *bg_band = &priv->ieee->bg_band;
1925
1926 bg_band->band = IEEE80211_BAND_2GHZ;
1927 bg_band->n_channels = geo->bg_channels;
1928 bg_band->channels = kcalloc(geo->bg_channels,
1929 sizeof(struct ieee80211_channel),
1930 GFP_KERNEL);
1931 if (!bg_band->channels) {
1932 ipw2100_down(priv);
1933 return -ENOMEM;
1934 }
1935 /* translate geo->bg to bg_band.channels */
1936 for (i = 0; i < geo->bg_channels; i++) {
1937 bg_band->channels[i].band = IEEE80211_BAND_2GHZ;
1938 bg_band->channels[i].center_freq = geo->bg[i].freq;
1939 bg_band->channels[i].hw_value = geo->bg[i].channel;
1940 bg_band->channels[i].max_power = geo->bg[i].max_power;
1941 if (geo->bg[i].flags & LIBIPW_CH_PASSIVE_ONLY)
1942 bg_band->channels[i].flags |=
1943 IEEE80211_CHAN_NO_IR;
1944 if (geo->bg[i].flags & LIBIPW_CH_NO_IBSS)
1945 bg_band->channels[i].flags |=
1946 IEEE80211_CHAN_NO_IR;
1947 if (geo->bg[i].flags & LIBIPW_CH_RADAR_DETECT)
1948 bg_band->channels[i].flags |=
1949 IEEE80211_CHAN_RADAR;
1950 /* No equivalent for LIBIPW_CH_80211H_RULES,
1951 LIBIPW_CH_UNIFORM_SPREADING, or
1952 LIBIPW_CH_B_ONLY... */
1953 }
1954 /* point at bitrate info */
1955 bg_band->bitrates = ipw2100_bg_rates;
1956 bg_band->n_bitrates = RATE_COUNT;
1957
1958 wdev->wiphy->bands[IEEE80211_BAND_2GHZ] = bg_band;
1959 }
1960
1961 wdev->wiphy->cipher_suites = ipw_cipher_suites;
1962 wdev->wiphy->n_cipher_suites = ARRAY_SIZE(ipw_cipher_suites);
1963
1964 set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev);
1965 if (wiphy_register(wdev->wiphy))
1966 return -EIO;
1967 return 0;
1968 }
1969
1970 static void ipw2100_reset_adapter(struct work_struct *work)
1971 {
1972 struct ipw2100_priv *priv =
1973 container_of(work, struct ipw2100_priv, reset_work.work);
1974 unsigned long flags;
1975 union iwreq_data wrqu = {
1976 .ap_addr = {
1977 .sa_family = ARPHRD_ETHER}
1978 };
1979 int associated = priv->status & STATUS_ASSOCIATED;
1980
1981 spin_lock_irqsave(&priv->low_lock, flags);
1982 IPW_DEBUG_INFO(": %s: Restarting adapter.\n", priv->net_dev->name);
1983 priv->resets++;
1984 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1985 priv->status |= STATUS_SECURITY_UPDATED;
1986
1987 /* Force a power cycle even if interface hasn't been opened
1988 * yet */
1989 cancel_delayed_work(&priv->reset_work);
1990 priv->status |= STATUS_RESET_PENDING;
1991 spin_unlock_irqrestore(&priv->low_lock, flags);
1992
1993 mutex_lock(&priv->action_mutex);
1994 /* stop timed checks so that they don't interfere with reset */
1995 priv->stop_hang_check = 1;
1996 cancel_delayed_work(&priv->hang_check);
1997
1998 /* We have to signal any supplicant if we are disassociating */
1999 if (associated)
2000 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
2001
2002 ipw2100_up(priv, 0);
2003 mutex_unlock(&priv->action_mutex);
2004
2005 }
2006
2007 static void isr_indicate_associated(struct ipw2100_priv *priv, u32 status)
2008 {
2009
2010 #define MAC_ASSOCIATION_READ_DELAY (HZ)
2011 int ret;
2012 unsigned int len, essid_len;
2013 char essid[IW_ESSID_MAX_SIZE];
2014 u32 txrate;
2015 u32 chan;
2016 char *txratename;
2017 u8 bssid[ETH_ALEN];
2018 DECLARE_SSID_BUF(ssid);
2019
2020 /*
2021 * TBD: BSSID is usually 00:00:00:00:00:00 here and not
2022 * an actual MAC of the AP. Seems like FW sets this
2023 * address too late. Read it later and expose through
2024 * /proc or schedule a later task to query and update
2025 */
2026
2027 essid_len = IW_ESSID_MAX_SIZE;
2028 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_SSID,
2029 essid, &essid_len);
2030 if (ret) {
2031 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
2032 __LINE__);
2033 return;
2034 }
2035
2036 len = sizeof(u32);
2037 ret = ipw2100_get_ordinal(priv, IPW_ORD_CURRENT_TX_RATE, &txrate, &len);
2038 if (ret) {
2039 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
2040 __LINE__);
2041 return;
2042 }
2043
2044 len = sizeof(u32);
2045 ret = ipw2100_get_ordinal(priv, IPW_ORD_OUR_FREQ, &chan, &len);
2046 if (ret) {
2047 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
2048 __LINE__);
2049 return;
2050 }
2051 len = ETH_ALEN;
2052 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID, bssid,
2053 &len);
2054 if (ret) {
2055 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
2056 __LINE__);
2057 return;
2058 }
2059 memcpy(priv->ieee->bssid, bssid, ETH_ALEN);
2060
2061 switch (txrate) {
2062 case TX_RATE_1_MBIT:
2063 txratename = "1Mbps";
2064 break;
2065 case TX_RATE_2_MBIT:
2066 txratename = "2Mbsp";
2067 break;
2068 case TX_RATE_5_5_MBIT:
2069 txratename = "5.5Mbps";
2070 break;
2071 case TX_RATE_11_MBIT:
2072 txratename = "11Mbps";
2073 break;
2074 default:
2075 IPW_DEBUG_INFO("Unknown rate: %d\n", txrate);
2076 txratename = "unknown rate";
2077 break;
2078 }
2079
2080 IPW_DEBUG_INFO("%s: Associated with '%s' at %s, channel %d (BSSID=%pM)\n",
2081 priv->net_dev->name, print_ssid(ssid, essid, essid_len),
2082 txratename, chan, bssid);
2083
2084 /* now we copy read ssid into dev */
2085 if (!(priv->config & CFG_STATIC_ESSID)) {
2086 priv->essid_len = min((u8) essid_len, (u8) IW_ESSID_MAX_SIZE);
2087 memcpy(priv->essid, essid, priv->essid_len);
2088 }
2089 priv->channel = chan;
2090 memcpy(priv->bssid, bssid, ETH_ALEN);
2091
2092 priv->status |= STATUS_ASSOCIATING;
2093 priv->connect_start = get_seconds();
2094
2095 schedule_delayed_work(&priv->wx_event_work, HZ / 10);
2096 }
2097
2098 static int ipw2100_set_essid(struct ipw2100_priv *priv, char *essid,
2099 int length, int batch_mode)
2100 {
2101 int ssid_len = min(length, IW_ESSID_MAX_SIZE);
2102 struct host_command cmd = {
2103 .host_command = SSID,
2104 .host_command_sequence = 0,
2105 .host_command_length = ssid_len
2106 };
2107 int err;
2108 DECLARE_SSID_BUF(ssid);
2109
2110 IPW_DEBUG_HC("SSID: '%s'\n", print_ssid(ssid, essid, ssid_len));
2111
2112 if (ssid_len)
2113 memcpy(cmd.host_command_parameters, essid, ssid_len);
2114
2115 if (!batch_mode) {
2116 err = ipw2100_disable_adapter(priv);
2117 if (err)
2118 return err;
2119 }
2120
2121 /* Bug in FW currently doesn't honor bit 0 in SET_SCAN_OPTIONS to
2122 * disable auto association -- so we cheat by setting a bogus SSID */
2123 if (!ssid_len && !(priv->config & CFG_ASSOCIATE)) {
2124 int i;
2125 u8 *bogus = (u8 *) cmd.host_command_parameters;
2126 for (i = 0; i < IW_ESSID_MAX_SIZE; i++)
2127 bogus[i] = 0x18 + i;
2128 cmd.host_command_length = IW_ESSID_MAX_SIZE;
2129 }
2130
2131 /* NOTE: We always send the SSID command even if the provided ESSID is
2132 * the same as what we currently think is set. */
2133
2134 err = ipw2100_hw_send_command(priv, &cmd);
2135 if (!err) {
2136 memset(priv->essid + ssid_len, 0, IW_ESSID_MAX_SIZE - ssid_len);
2137 memcpy(priv->essid, essid, ssid_len);
2138 priv->essid_len = ssid_len;
2139 }
2140
2141 if (!batch_mode) {
2142 if (ipw2100_enable_adapter(priv))
2143 err = -EIO;
2144 }
2145
2146 return err;
2147 }
2148
2149 static void isr_indicate_association_lost(struct ipw2100_priv *priv, u32 status)
2150 {
2151 DECLARE_SSID_BUF(ssid);
2152
2153 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE | IPW_DL_ASSOC,
2154 "disassociated: '%s' %pM\n",
2155 print_ssid(ssid, priv->essid, priv->essid_len),
2156 priv->bssid);
2157
2158 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
2159
2160 if (priv->status & STATUS_STOPPING) {
2161 IPW_DEBUG_INFO("Card is stopping itself, discard ASSN_LOST.\n");
2162 return;
2163 }
2164
2165 memset(priv->bssid, 0, ETH_ALEN);
2166 memset(priv->ieee->bssid, 0, ETH_ALEN);
2167
2168 netif_carrier_off(priv->net_dev);
2169 netif_stop_queue(priv->net_dev);
2170
2171 if (!(priv->status & STATUS_RUNNING))
2172 return;
2173
2174 if (priv->status & STATUS_SECURITY_UPDATED)
2175 schedule_delayed_work(&priv->security_work, 0);
2176
2177 schedule_delayed_work(&priv->wx_event_work, 0);
2178 }
2179
2180 static void isr_indicate_rf_kill(struct ipw2100_priv *priv, u32 status)
2181 {
2182 IPW_DEBUG_INFO("%s: RF Kill state changed to radio OFF.\n",
2183 priv->net_dev->name);
2184
2185 /* RF_KILL is now enabled (else we wouldn't be here) */
2186 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true);
2187 priv->status |= STATUS_RF_KILL_HW;
2188
2189 /* Make sure the RF Kill check timer is running */
2190 priv->stop_rf_kill = 0;
2191 mod_delayed_work(system_wq, &priv->rf_kill, round_jiffies_relative(HZ));
2192 }
2193
2194 static void ipw2100_scan_event(struct work_struct *work)
2195 {
2196 struct ipw2100_priv *priv = container_of(work, struct ipw2100_priv,
2197 scan_event.work);
2198 union iwreq_data wrqu;
2199
2200 wrqu.data.length = 0;
2201 wrqu.data.flags = 0;
2202 wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL);
2203 }
2204
2205 static void isr_scan_complete(struct ipw2100_priv *priv, u32 status)
2206 {
2207 IPW_DEBUG_SCAN("scan complete\n");
2208 /* Age the scan results... */
2209 priv->ieee->scans++;
2210 priv->status &= ~STATUS_SCANNING;
2211
2212 /* Only userspace-requested scan completion events go out immediately */
2213 if (!priv->user_requested_scan) {
2214 schedule_delayed_work(&priv->scan_event,
2215 round_jiffies_relative(msecs_to_jiffies(4000)));
2216 } else {
2217 priv->user_requested_scan = 0;
2218 mod_delayed_work(system_wq, &priv->scan_event, 0);
2219 }
2220 }
2221
2222 #ifdef CONFIG_IPW2100_DEBUG
2223 #define IPW2100_HANDLER(v, f) { v, f, # v }
2224 struct ipw2100_status_indicator {
2225 int status;
2226 void (*cb) (struct ipw2100_priv * priv, u32 status);
2227 char *name;
2228 };
2229 #else
2230 #define IPW2100_HANDLER(v, f) { v, f }
2231 struct ipw2100_status_indicator {
2232 int status;
2233 void (*cb) (struct ipw2100_priv * priv, u32 status);
2234 };
2235 #endif /* CONFIG_IPW2100_DEBUG */
2236
2237 static void isr_indicate_scanning(struct ipw2100_priv *priv, u32 status)
2238 {
2239 IPW_DEBUG_SCAN("Scanning...\n");
2240 priv->status |= STATUS_SCANNING;
2241 }
2242
2243 static const struct ipw2100_status_indicator status_handlers[] = {
2244 IPW2100_HANDLER(IPW_STATE_INITIALIZED, NULL),
2245 IPW2100_HANDLER(IPW_STATE_COUNTRY_FOUND, NULL),
2246 IPW2100_HANDLER(IPW_STATE_ASSOCIATED, isr_indicate_associated),
2247 IPW2100_HANDLER(IPW_STATE_ASSN_LOST, isr_indicate_association_lost),
2248 IPW2100_HANDLER(IPW_STATE_ASSN_CHANGED, NULL),
2249 IPW2100_HANDLER(IPW_STATE_SCAN_COMPLETE, isr_scan_complete),
2250 IPW2100_HANDLER(IPW_STATE_ENTERED_PSP, NULL),
2251 IPW2100_HANDLER(IPW_STATE_LEFT_PSP, NULL),
2252 IPW2100_HANDLER(IPW_STATE_RF_KILL, isr_indicate_rf_kill),
2253 IPW2100_HANDLER(IPW_STATE_DISABLED, NULL),
2254 IPW2100_HANDLER(IPW_STATE_POWER_DOWN, NULL),
2255 IPW2100_HANDLER(IPW_STATE_SCANNING, isr_indicate_scanning),
2256 IPW2100_HANDLER(-1, NULL)
2257 };
2258
2259 static void isr_status_change(struct ipw2100_priv *priv, int status)
2260 {
2261 int i;
2262
2263 if (status == IPW_STATE_SCANNING &&
2264 priv->status & STATUS_ASSOCIATED &&
2265 !(priv->status & STATUS_SCANNING)) {
2266 IPW_DEBUG_INFO("Scan detected while associated, with "
2267 "no scan request. Restarting firmware.\n");
2268
2269 /* Wake up any sleeping jobs */
2270 schedule_reset(priv);
2271 }
2272
2273 for (i = 0; status_handlers[i].status != -1; i++) {
2274 if (status == status_handlers[i].status) {
2275 IPW_DEBUG_NOTIF("Status change: %s\n",
2276 status_handlers[i].name);
2277 if (status_handlers[i].cb)
2278 status_handlers[i].cb(priv, status);
2279 priv->wstats.status = status;
2280 return;
2281 }
2282 }
2283
2284 IPW_DEBUG_NOTIF("unknown status received: %04x\n", status);
2285 }
2286
2287 static void isr_rx_complete_command(struct ipw2100_priv *priv,
2288 struct ipw2100_cmd_header *cmd)
2289 {
2290 #ifdef CONFIG_IPW2100_DEBUG
2291 if (cmd->host_command_reg < ARRAY_SIZE(command_types)) {
2292 IPW_DEBUG_HC("Command completed '%s (%d)'\n",
2293 command_types[cmd->host_command_reg],
2294 cmd->host_command_reg);
2295 }
2296 #endif
2297 if (cmd->host_command_reg == HOST_COMPLETE)
2298 priv->status |= STATUS_ENABLED;
2299
2300 if (cmd->host_command_reg == CARD_DISABLE)
2301 priv->status &= ~STATUS_ENABLED;
2302
2303 priv->status &= ~STATUS_CMD_ACTIVE;
2304
2305 wake_up_interruptible(&priv->wait_command_queue);
2306 }
2307
2308 #ifdef CONFIG_IPW2100_DEBUG
2309 static const char *frame_types[] = {
2310 "COMMAND_STATUS_VAL",
2311 "STATUS_CHANGE_VAL",
2312 "P80211_DATA_VAL",
2313 "P8023_DATA_VAL",
2314 "HOST_NOTIFICATION_VAL"
2315 };
2316 #endif
2317
2318 static int ipw2100_alloc_skb(struct ipw2100_priv *priv,
2319 struct ipw2100_rx_packet *packet)
2320 {
2321 packet->skb = dev_alloc_skb(sizeof(struct ipw2100_rx));
2322 if (!packet->skb)
2323 return -ENOMEM;
2324
2325 packet->rxp = (struct ipw2100_rx *)packet->skb->data;
2326 packet->dma_addr = pci_map_single(priv->pci_dev, packet->skb->data,
2327 sizeof(struct ipw2100_rx),
2328 PCI_DMA_FROMDEVICE);
2329 /* NOTE: pci_map_single does not return an error code, and 0 is a valid
2330 * dma_addr */
2331
2332 return 0;
2333 }
2334
2335 #define SEARCH_ERROR 0xffffffff
2336 #define SEARCH_FAIL 0xfffffffe
2337 #define SEARCH_SUCCESS 0xfffffff0
2338 #define SEARCH_DISCARD 0
2339 #define SEARCH_SNAPSHOT 1
2340
2341 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
2342 static void ipw2100_snapshot_free(struct ipw2100_priv *priv)
2343 {
2344 int i;
2345 if (!priv->snapshot[0])
2346 return;
2347 for (i = 0; i < 0x30; i++)
2348 kfree(priv->snapshot[i]);
2349 priv->snapshot[0] = NULL;
2350 }
2351
2352 #ifdef IPW2100_DEBUG_C3
2353 static int ipw2100_snapshot_alloc(struct ipw2100_priv *priv)
2354 {
2355 int i;
2356 if (priv->snapshot[0])
2357 return 1;
2358 for (i = 0; i < 0x30; i++) {
2359 priv->snapshot[i] = kmalloc(0x1000, GFP_ATOMIC);
2360 if (!priv->snapshot[i]) {
2361 IPW_DEBUG_INFO("%s: Error allocating snapshot "
2362 "buffer %d\n", priv->net_dev->name, i);
2363 while (i > 0)
2364 kfree(priv->snapshot[--i]);
2365 priv->snapshot[0] = NULL;
2366 return 0;
2367 }
2368 }
2369
2370 return 1;
2371 }
2372
2373 static u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 * in_buf,
2374 size_t len, int mode)
2375 {
2376 u32 i, j;
2377 u32 tmp;
2378 u8 *s, *d;
2379 u32 ret;
2380
2381 s = in_buf;
2382 if (mode == SEARCH_SNAPSHOT) {
2383 if (!ipw2100_snapshot_alloc(priv))
2384 mode = SEARCH_DISCARD;
2385 }
2386
2387 for (ret = SEARCH_FAIL, i = 0; i < 0x30000; i += 4) {
2388 read_nic_dword(priv->net_dev, i, &tmp);
2389 if (mode == SEARCH_SNAPSHOT)
2390 *(u32 *) SNAPSHOT_ADDR(i) = tmp;
2391 if (ret == SEARCH_FAIL) {
2392 d = (u8 *) & tmp;
2393 for (j = 0; j < 4; j++) {
2394 if (*s != *d) {
2395 s = in_buf;
2396 continue;
2397 }
2398
2399 s++;
2400 d++;
2401
2402 if ((s - in_buf) == len)
2403 ret = (i + j) - len + 1;
2404 }
2405 } else if (mode == SEARCH_DISCARD)
2406 return ret;
2407 }
2408
2409 return ret;
2410 }
2411 #endif
2412
2413 /*
2414 *
2415 * 0) Disconnect the SKB from the firmware (just unmap)
2416 * 1) Pack the ETH header into the SKB
2417 * 2) Pass the SKB to the network stack
2418 *
2419 * When packet is provided by the firmware, it contains the following:
2420 *
2421 * . libipw_hdr
2422 * . libipw_snap_hdr
2423 *
2424 * The size of the constructed ethernet
2425 *
2426 */
2427 #ifdef IPW2100_RX_DEBUG
2428 static u8 packet_data[IPW_RX_NIC_BUFFER_LENGTH];
2429 #endif
2430
2431 static void ipw2100_corruption_detected(struct ipw2100_priv *priv, int i)
2432 {
2433 #ifdef IPW2100_DEBUG_C3
2434 struct ipw2100_status *status = &priv->status_queue.drv[i];
2435 u32 match, reg;
2436 int j;
2437 #endif
2438
2439 IPW_DEBUG_INFO(": PCI latency error detected at 0x%04zX.\n",
2440 i * sizeof(struct ipw2100_status));
2441
2442 #ifdef IPW2100_DEBUG_C3
2443 /* Halt the firmware so we can get a good image */
2444 write_register(priv->net_dev, IPW_REG_RESET_REG,
2445 IPW_AUX_HOST_RESET_REG_STOP_MASTER);
2446 j = 5;
2447 do {
2448 udelay(IPW_WAIT_RESET_MASTER_ASSERT_COMPLETE_DELAY);
2449 read_register(priv->net_dev, IPW_REG_RESET_REG, ®);
2450
2451 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED)
2452 break;
2453 } while (j--);
2454
2455 match = ipw2100_match_buf(priv, (u8 *) status,
2456 sizeof(struct ipw2100_status),
2457 SEARCH_SNAPSHOT);
2458 if (match < SEARCH_SUCCESS)
2459 IPW_DEBUG_INFO("%s: DMA status match in Firmware at "
2460 "offset 0x%06X, length %d:\n",
2461 priv->net_dev->name, match,
2462 sizeof(struct ipw2100_status));
2463 else
2464 IPW_DEBUG_INFO("%s: No DMA status match in "
2465 "Firmware.\n", priv->net_dev->name);
2466
2467 printk_buf((u8 *) priv->status_queue.drv,
2468 sizeof(struct ipw2100_status) * RX_QUEUE_LENGTH);
2469 #endif
2470
2471 priv->fatal_error = IPW2100_ERR_C3_CORRUPTION;
2472 priv->net_dev->stats.rx_errors++;
2473 schedule_reset(priv);
2474 }
2475
2476 static void isr_rx(struct ipw2100_priv *priv, int i,
2477 struct libipw_rx_stats *stats)
2478 {
2479 struct net_device *dev = priv->net_dev;
2480 struct ipw2100_status *status = &priv->status_queue.drv[i];
2481 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i];
2482
2483 IPW_DEBUG_RX("Handler...\n");
2484
2485 if (unlikely(status->frame_size > skb_tailroom(packet->skb))) {
2486 IPW_DEBUG_INFO("%s: frame_size (%u) > skb_tailroom (%u)!"
2487 " Dropping.\n",
2488 dev->name,
2489 status->frame_size, skb_tailroom(packet->skb));
2490 dev->stats.rx_errors++;
2491 return;
2492 }
2493
2494 if (unlikely(!netif_running(dev))) {
2495 dev->stats.rx_errors++;
2496 priv->wstats.discard.misc++;
2497 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
2498 return;
2499 }
2500
2501 if (unlikely(priv->ieee->iw_mode != IW_MODE_MONITOR &&
2502 !(priv->status & STATUS_ASSOCIATED))) {
2503 IPW_DEBUG_DROP("Dropping packet while not associated.\n");
2504 priv->wstats.discard.misc++;
2505 return;
2506 }
2507
2508 pci_unmap_single(priv->pci_dev,
2509 packet->dma_addr,
2510 sizeof(struct ipw2100_rx), PCI_DMA_FROMDEVICE);
2511
2512 skb_put(packet->skb, status->frame_size);
2513
2514 #ifdef IPW2100_RX_DEBUG
2515 /* Make a copy of the frame so we can dump it to the logs if
2516 * libipw_rx fails */
2517 skb_copy_from_linear_data(packet->skb, packet_data,
2518 min_t(u32, status->frame_size,
2519 IPW_RX_NIC_BUFFER_LENGTH));
2520 #endif
2521
2522 if (!libipw_rx(priv->ieee, packet->skb, stats)) {
2523 #ifdef IPW2100_RX_DEBUG
2524 IPW_DEBUG_DROP("%s: Non consumed packet:\n",
2525 dev->name);
2526 printk_buf(IPW_DL_DROP, packet_data, status->frame_size);
2527 #endif
2528 dev->stats.rx_errors++;
2529
2530 /* libipw_rx failed, so it didn't free the SKB */
2531 dev_kfree_skb_any(packet->skb);
2532 packet->skb = NULL;
2533 }
2534
2535 /* We need to allocate a new SKB and attach it to the RDB. */
2536 if (unlikely(ipw2100_alloc_skb(priv, packet))) {
2537 printk(KERN_WARNING DRV_NAME ": "
2538 "%s: Unable to allocate SKB onto RBD ring - disabling "
2539 "adapter.\n", dev->name);
2540 /* TODO: schedule adapter shutdown */
2541 IPW_DEBUG_INFO("TODO: Shutdown adapter...\n");
2542 }
2543
2544 /* Update the RDB entry */
2545 priv->rx_queue.drv[i].host_addr = packet->dma_addr;
2546 }
2547
2548 #ifdef CONFIG_IPW2100_MONITOR
2549
2550 static void isr_rx_monitor(struct ipw2100_priv *priv, int i,
2551 struct libipw_rx_stats *stats)
2552 {
2553 struct net_device *dev = priv->net_dev;
2554 struct ipw2100_status *status = &priv->status_queue.drv[i];
2555 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i];
2556
2557 /* Magic struct that slots into the radiotap header -- no reason
2558 * to build this manually element by element, we can write it much
2559 * more efficiently than we can parse it. ORDER MATTERS HERE */
2560 struct ipw_rt_hdr {
2561 struct ieee80211_radiotap_header rt_hdr;
2562 s8 rt_dbmsignal; /* signal in dbM, kluged to signed */
2563 } *ipw_rt;
2564
2565 IPW_DEBUG_RX("Handler...\n");
2566
2567 if (unlikely(status->frame_size > skb_tailroom(packet->skb) -
2568 sizeof(struct ipw_rt_hdr))) {
2569 IPW_DEBUG_INFO("%s: frame_size (%u) > skb_tailroom (%u)!"
2570 " Dropping.\n",
2571 dev->name,
2572 status->frame_size,
2573 skb_tailroom(packet->skb));
2574 dev->stats.rx_errors++;
2575 return;
2576 }
2577
2578 if (unlikely(!netif_running(dev))) {
2579 dev->stats.rx_errors++;
2580 priv->wstats.discard.misc++;
2581 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
2582 return;
2583 }
2584
2585 if (unlikely(priv->config & CFG_CRC_CHECK &&
2586 status->flags & IPW_STATUS_FLAG_CRC_ERROR)) {
2587 IPW_DEBUG_RX("CRC error in packet. Dropping.\n");
2588 dev->stats.rx_errors++;
2589 return;
2590 }
2591
2592 pci_unmap_single(priv->pci_dev, packet->dma_addr,
2593 sizeof(struct ipw2100_rx), PCI_DMA_FROMDEVICE);
2594 memmove(packet->skb->data + sizeof(struct ipw_rt_hdr),
2595 packet->skb->data, status->frame_size);
2596
2597 ipw_rt = (struct ipw_rt_hdr *) packet->skb->data;
2598
2599 ipw_rt->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION;
2600 ipw_rt->rt_hdr.it_pad = 0; /* always good to zero */
2601 ipw_rt->rt_hdr.it_len = cpu_to_le16(sizeof(struct ipw_rt_hdr)); /* total hdr+data */
2602
2603 ipw_rt->rt_hdr.it_present = cpu_to_le32(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL);
2604
2605 ipw_rt->rt_dbmsignal = status->rssi + IPW2100_RSSI_TO_DBM;
2606
2607 skb_put(packet->skb, status->frame_size + sizeof(struct ipw_rt_hdr));
2608
2609 if (!libipw_rx(priv->ieee, packet->skb, stats)) {
2610 dev->stats.rx_errors++;
2611
2612 /* libipw_rx failed, so it didn't free the SKB */
2613 dev_kfree_skb_any(packet->skb);
2614 packet->skb = NULL;
2615 }
2616
2617 /* We need to allocate a new SKB and attach it to the RDB. */
2618 if (unlikely(ipw2100_alloc_skb(priv, packet))) {
2619 IPW_DEBUG_WARNING(
2620 "%s: Unable to allocate SKB onto RBD ring - disabling "
2621 "adapter.\n", dev->name);
2622 /* TODO: schedule adapter shutdown */
2623 IPW_DEBUG_INFO("TODO: Shutdown adapter...\n");
2624 }
2625
2626 /* Update the RDB entry */
2627 priv->rx_queue.drv[i].host_addr = packet->dma_addr;
2628 }
2629
2630 #endif
2631
2632 static int ipw2100_corruption_check(struct ipw2100_priv *priv, int i)
2633 {
2634 struct ipw2100_status *status = &priv->status_queue.drv[i];
2635 struct ipw2100_rx *u = priv->rx_buffers[i].rxp;
2636 u16 frame_type = status->status_fields & STATUS_TYPE_MASK;
2637
2638 switch (frame_type) {
2639 case COMMAND_STATUS_VAL:
2640 return (status->frame_size != sizeof(u->rx_data.command));
2641 case STATUS_CHANGE_VAL:
2642 return (status->frame_size != sizeof(u->rx_data.status));
2643 case HOST_NOTIFICATION_VAL:
2644 return (status->frame_size < sizeof(u->rx_data.notification));
2645 case P80211_DATA_VAL:
2646 case P8023_DATA_VAL:
2647 #ifdef CONFIG_IPW2100_MONITOR
2648 return 0;
2649 #else
2650 switch (WLAN_FC_GET_TYPE(le16_to_cpu(u->rx_data.header.frame_ctl))) {
2651 case IEEE80211_FTYPE_MGMT:
2652 case IEEE80211_FTYPE_CTL:
2653 return 0;
2654 case IEEE80211_FTYPE_DATA:
2655 return (status->frame_size >
2656 IPW_MAX_802_11_PAYLOAD_LENGTH);
2657 }
2658 #endif
2659 }
2660
2661 return 1;
2662 }
2663
2664 /*
2665 * ipw2100 interrupts are disabled at this point, and the ISR
2666 * is the only code that calls this method. So, we do not need
2667 * to play with any locks.
2668 *
2669 * RX Queue works as follows:
2670 *
2671 * Read index - firmware places packet in entry identified by the
2672 * Read index and advances Read index. In this manner,
2673 * Read index will always point to the next packet to
2674 * be filled--but not yet valid.
2675 *
2676 * Write index - driver fills this entry with an unused RBD entry.
2677 * This entry has not filled by the firmware yet.
2678 *
2679 * In between the W and R indexes are the RBDs that have been received
2680 * but not yet processed.
2681 *
2682 * The process of handling packets will start at WRITE + 1 and advance
2683 * until it reaches the READ index.
2684 *
2685 * The WRITE index is cached in the variable 'priv->rx_queue.next'.
2686 *
2687 */
2688 static void __ipw2100_rx_process(struct ipw2100_priv *priv)
2689 {
2690 struct ipw2100_bd_queue *rxq = &priv->rx_queue;
2691 struct ipw2100_status_queue *sq = &priv->status_queue;
2692 struct ipw2100_rx_packet *packet;
2693 u16 frame_type;
2694 u32 r, w, i, s;
2695 struct ipw2100_rx *u;
2696 struct libipw_rx_stats stats = {
2697 .mac_time = jiffies,
2698 };
2699
2700 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_READ_INDEX, &r);
2701 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, &w);
2702
2703 if (r >= rxq->entries) {
2704 IPW_DEBUG_RX("exit - bad read index\n");
2705 return;
2706 }
2707
2708 i = (rxq->next + 1) % rxq->entries;
2709 s = i;
2710 while (i != r) {
2711 /* IPW_DEBUG_RX("r = %d : w = %d : processing = %d\n",
2712 r, rxq->next, i); */
2713
2714 packet = &priv->rx_buffers[i];
2715
2716 /* Sync the DMA for the RX buffer so CPU is sure to get
2717 * the correct values */
2718 pci_dma_sync_single_for_cpu(priv->pci_dev, packet->dma_addr,
2719 sizeof(struct ipw2100_rx),
2720 PCI_DMA_FROMDEVICE);
2721
2722 if (unlikely(ipw2100_corruption_check(priv, i))) {
2723 ipw2100_corruption_detected(priv, i);
2724 goto increment;
2725 }
2726
2727 u = packet->rxp;
2728 frame_type = sq->drv[i].status_fields & STATUS_TYPE_MASK;
2729 stats.rssi = sq->drv[i].rssi + IPW2100_RSSI_TO_DBM;
2730 stats.len = sq->drv[i].frame_size;
2731
2732 stats.mask = 0;
2733 if (stats.rssi != 0)
2734 stats.mask |= LIBIPW_STATMASK_RSSI;
2735 stats.freq = LIBIPW_24GHZ_BAND;
2736
2737 IPW_DEBUG_RX("%s: '%s' frame type received (%d).\n",
2738 priv->net_dev->name, frame_types[frame_type],
2739 stats.len);
2740
2741 switch (frame_type) {
2742 case COMMAND_STATUS_VAL:
2743 /* Reset Rx watchdog */
2744 isr_rx_complete_command(priv, &u->rx_data.command);
2745 break;
2746
2747 case STATUS_CHANGE_VAL:
2748 isr_status_change(priv, u->rx_data.status);
2749 break;
2750
2751 case P80211_DATA_VAL:
2752 case P8023_DATA_VAL:
2753 #ifdef CONFIG_IPW2100_MONITOR
2754 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
2755 isr_rx_monitor(priv, i, &stats);
2756 break;
2757 }
2758 #endif
2759 if (stats.len < sizeof(struct libipw_hdr_3addr))
2760 break;
2761 switch (WLAN_FC_GET_TYPE(le16_to_cpu(u->rx_data.header.frame_ctl))) {
2762 case IEEE80211_FTYPE_MGMT:
2763 libipw_rx_mgt(priv->ieee,
2764 &u->rx_data.header, &stats);
2765 break;
2766
2767 case IEEE80211_FTYPE_CTL:
2768 break;
2769
2770 case IEEE80211_FTYPE_DATA:
2771 isr_rx(priv, i, &stats);
2772 break;
2773
2774 }
2775 break;
2776 }
2777
2778 increment:
2779 /* clear status field associated with this RBD */
2780 rxq->drv[i].status.info.field = 0;
2781
2782 i = (i + 1) % rxq->entries;
2783 }
2784
2785 if (i != s) {
2786 /* backtrack one entry, wrapping to end if at 0 */
2787 rxq->next = (i ? i : rxq->entries) - 1;
2788
2789 write_register(priv->net_dev,
2790 IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, rxq->next);
2791 }
2792 }
2793
2794 /*
2795 * __ipw2100_tx_process
2796 *
2797 * This routine will determine whether the next packet on
2798 * the fw_pend_list has been processed by the firmware yet.
2799 *
2800 * If not, then it does nothing and returns.
2801 *
2802 * If so, then it removes the item from the fw_pend_list, frees
2803 * any associated storage, and places the item back on the
2804 * free list of its source (either msg_free_list or tx_free_list)
2805 *
2806 * TX Queue works as follows:
2807 *
2808 * Read index - points to the next TBD that the firmware will
2809 * process. The firmware will read the data, and once
2810 * done processing, it will advance the Read index.
2811 *
2812 * Write index - driver fills this entry with an constructed TBD
2813 * entry. The Write index is not advanced until the
2814 * packet has been configured.
2815 *
2816 * In between the W and R indexes are the TBDs that have NOT been
2817 * processed. Lagging behind the R index are packets that have
2818 * been processed but have not been freed by the driver.
2819 *
2820 * In order to free old storage, an internal index will be maintained
2821 * that points to the next packet to be freed. When all used
2822 * packets have been freed, the oldest index will be the same as the
2823 * firmware's read index.
2824 *
2825 * The OLDEST index is cached in the variable 'priv->tx_queue.oldest'
2826 *
2827 * Because the TBD structure can not contain arbitrary data, the
2828 * driver must keep an internal queue of cached allocations such that
2829 * it can put that data back into the tx_free_list and msg_free_list
2830 * for use by future command and data packets.
2831 *
2832 */
2833 static int __ipw2100_tx_process(struct ipw2100_priv *priv)
2834 {
2835 struct ipw2100_bd_queue *txq = &priv->tx_queue;
2836 struct ipw2100_bd *tbd;
2837 struct list_head *element;
2838 struct ipw2100_tx_packet *packet;
2839 int descriptors_used;
2840 int e, i;
2841 u32 r, w, frag_num = 0;
2842
2843 if (list_empty(&priv->fw_pend_list))
2844 return 0;
2845
2846 element = priv->fw_pend_list.next;
2847
2848 packet = list_entry(element, struct ipw2100_tx_packet, list);
2849 tbd = &txq->drv[packet->index];
2850
2851 /* Determine how many TBD entries must be finished... */
2852 switch (packet->type) {
2853 case COMMAND:
2854 /* COMMAND uses only one slot; don't advance */
2855 descriptors_used = 1;
2856 e = txq->oldest;
2857 break;
2858
2859 case DATA:
2860 /* DATA uses two slots; advance and loop position. */
2861 descriptors_used = tbd->num_fragments;
2862 frag_num = tbd->num_fragments - 1;
2863 e = txq->oldest + frag_num;
2864 e %= txq->entries;
2865 break;
2866
2867 default:
2868 printk(KERN_WARNING DRV_NAME ": %s: Bad fw_pend_list entry!\n",
2869 priv->net_dev->name);
2870 return 0;
2871 }
2872
2873 /* if the last TBD is not done by NIC yet, then packet is
2874 * not ready to be released.
2875 *
2876 */
2877 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_READ_INDEX,
2878 &r);
2879 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
2880 &w);
2881 if (w != txq->next)
2882 printk(KERN_WARNING DRV_NAME ": %s: write index mismatch\n",
2883 priv->net_dev->name);
2884
2885 /*
2886 * txq->next is the index of the last packet written txq->oldest is
2887 * the index of the r is the index of the next packet to be read by
2888 * firmware
2889 */
2890
2891 /*
2892 * Quick graphic to help you visualize the following
2893 * if / else statement
2894 *
2895 * ===>| s---->|===============
2896 * e>|
2897 * | a | b | c | d | e | f | g | h | i | j | k | l
2898 * r---->|
2899 * w
2900 *
2901 * w - updated by driver
2902 * r - updated by firmware
2903 * s - start of oldest BD entry (txq->oldest)
2904 * e - end of oldest BD entry
2905 *
2906 */
2907 if (!((r <= w && (e < r || e >= w)) || (e < r && e >= w))) {
2908 IPW_DEBUG_TX("exit - no processed packets ready to release.\n");
2909 return 0;
2910 }
2911
2912 list_del(element);
2913 DEC_STAT(&priv->fw_pend_stat);
2914
2915 #ifdef CONFIG_IPW2100_DEBUG
2916 {
2917 i = txq->oldest;
2918 IPW_DEBUG_TX("TX%d V=%p P=%04X T=%04X L=%d\n", i,
2919 &txq->drv[i],
2920 (u32) (txq->nic + i * sizeof(struct ipw2100_bd)),
2921 txq->drv[i].host_addr, txq->drv[i].buf_length);
2922
2923 if (packet->type == DATA) {
2924 i = (i + 1) % txq->entries;
2925
2926 IPW_DEBUG_TX("TX%d V=%p P=%04X T=%04X L=%d\n", i,
2927 &txq->drv[i],
2928 (u32) (txq->nic + i *
2929 sizeof(struct ipw2100_bd)),
2930 (u32) txq->drv[i].host_addr,
2931 txq->drv[i].buf_length);
2932 }
2933 }
2934 #endif
2935
2936 switch (packet->type) {
2937 case DATA:
2938 if (txq->drv[txq->oldest].status.info.fields.txType != 0)
2939 printk(KERN_WARNING DRV_NAME ": %s: Queue mismatch. "
2940 "Expecting DATA TBD but pulled "
2941 "something else: ids %d=%d.\n",
2942 priv->net_dev->name, txq->oldest, packet->index);
2943
2944 /* DATA packet; we have to unmap and free the SKB */
2945 for (i = 0; i < frag_num; i++) {
2946 tbd = &txq->drv[(packet->index + 1 + i) % txq->entries];
2947
2948 IPW_DEBUG_TX("TX%d P=%08x L=%d\n",
2949 (packet->index + 1 + i) % txq->entries,
2950 tbd->host_addr, tbd->buf_length);
2951
2952 pci_unmap_single(priv->pci_dev,
2953 tbd->host_addr,
2954 tbd->buf_length, PCI_DMA_TODEVICE);
2955 }
2956
2957 libipw_txb_free(packet->info.d_struct.txb);
2958 packet->info.d_struct.txb = NULL;
2959
2960 list_add_tail(element, &priv->tx_free_list);
2961 INC_STAT(&priv->tx_free_stat);
2962
2963 /* We have a free slot in the Tx queue, so wake up the
2964 * transmit layer if it is stopped. */
2965 if (priv->status & STATUS_ASSOCIATED)
2966 netif_wake_queue(priv->net_dev);
2967
2968 /* A packet was processed by the hardware, so update the
2969 * watchdog */
2970 priv->net_dev->trans_start = jiffies;
2971
2972 break;
2973
2974 case COMMAND:
2975 if (txq->drv[txq->oldest].status.info.fields.txType != 1)
2976 printk(KERN_WARNING DRV_NAME ": %s: Queue mismatch. "
2977 "Expecting COMMAND TBD but pulled "
2978 "something else: ids %d=%d.\n",
2979 priv->net_dev->name, txq->oldest, packet->index);
2980
2981 #ifdef CONFIG_IPW2100_DEBUG
2982 if (packet->info.c_struct.cmd->host_command_reg <
2983 ARRAY_SIZE(command_types))
2984 IPW_DEBUG_TX("Command '%s (%d)' processed: %d.\n",
2985 command_types[packet->info.c_struct.cmd->
2986 host_command_reg],
2987 packet->info.c_struct.cmd->
2988 host_command_reg,
2989 packet->info.c_struct.cmd->cmd_status_reg);
2990 #endif
2991
2992 list_add_tail(element, &priv->msg_free_list);
2993 INC_STAT(&priv->msg_free_stat);
2994 break;
2995 }
2996
2997 /* advance oldest used TBD pointer to start of next entry */
2998 txq->oldest = (e + 1) % txq->entries;
2999 /* increase available TBDs number */
3000 txq->available += descriptors_used;
3001 SET_STAT(&priv->txq_stat, txq->available);
3002
3003 IPW_DEBUG_TX("packet latency (send to process) %ld jiffies\n",
3004 jiffies - packet->jiffy_start);
3005
3006 return (!list_empty(&priv->fw_pend_list));
3007 }
3008
3009 static inline void __ipw2100_tx_complete(struct ipw2100_priv *priv)
3010 {
3011 int i = 0;
3012
3013 while (__ipw2100_tx_process(priv) && i < 200)
3014 i++;
3015
3016 if (i == 200) {
3017 printk(KERN_WARNING DRV_NAME ": "
3018 "%s: Driver is running slow (%d iters).\n",
3019 priv->net_dev->name, i);
3020 }
3021 }
3022
3023 static void ipw2100_tx_send_commands(struct ipw2100_priv *priv)
3024 {
3025 struct list_head *element;
3026 struct ipw2100_tx_packet *packet;
3027 struct ipw2100_bd_queue *txq = &priv->tx_queue;
3028 struct ipw2100_bd *tbd;
3029 int next = txq->next;
3030
3031 while (!list_empty(&priv->msg_pend_list)) {
3032 /* if there isn't enough space in TBD queue, then
3033 * don't stuff a new one in.
3034 * NOTE: 3 are needed as a command will take one,
3035 * and there is a minimum of 2 that must be
3036 * maintained between the r and w indexes
3037 */
3038 if (txq->available <= 3) {
3039 IPW_DEBUG_TX("no room in tx_queue\n");
3040 break;
3041 }
3042
3043 element = priv->msg_pend_list.next;
3044 list_del(element);
3045 DEC_STAT(&priv->msg_pend_stat);
3046
3047 packet = list_entry(element, struct ipw2100_tx_packet, list);
3048
3049 IPW_DEBUG_TX("using TBD at virt=%p, phys=%04X\n",
3050 &txq->drv[txq->next],
3051 (u32) (txq->nic + txq->next *
3052 sizeof(struct ipw2100_bd)));
3053
3054 packet->index = txq->next;
3055
3056 tbd = &txq->drv[txq->next];
3057
3058 /* initialize TBD */
3059 tbd->host_addr = packet->info.c_struct.cmd_phys;
3060 tbd->buf_length = sizeof(struct ipw2100_cmd_header);
3061 /* not marking number of fragments causes problems
3062 * with f/w debug version */
3063 tbd->num_fragments = 1;
3064 tbd->status.info.field =
3065 IPW_BD_STATUS_TX_FRAME_COMMAND |
3066 IPW_BD_STATUS_TX_INTERRUPT_ENABLE;
3067
3068 /* update TBD queue counters */
3069 txq->next++;
3070 txq->next %= txq->entries;
3071 txq->available--;
3072 DEC_STAT(&priv->txq_stat);
3073
3074 list_add_tail(element, &priv->fw_pend_list);
3075 INC_STAT(&priv->fw_pend_stat);
3076 }
3077
3078 if (txq->next != next) {
3079 /* kick off the DMA by notifying firmware the
3080 * write index has moved; make sure TBD stores are sync'd */
3081 wmb();
3082 write_register(priv->net_dev,
3083 IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
3084 txq->next);
3085 }
3086 }
3087
3088 /*
3089 * ipw2100_tx_send_data
3090 *
3091 */
3092 static void ipw2100_tx_send_data(struct ipw2100_priv *priv)
3093 {
3094 struct list_head *element;
3095 struct ipw2100_tx_packet *packet;
3096 struct ipw2100_bd_queue *txq = &priv->tx_queue;
3097 struct ipw2100_bd *tbd;
3098 int next = txq->next;
3099 int i = 0;
3100 struct ipw2100_data_header *ipw_hdr;
3101 struct libipw_hdr_3addr *hdr;
3102
3103 while (!list_empty(&priv->tx_pend_list)) {
3104 /* if there isn't enough space in TBD queue, then
3105 * don't stuff a new one in.
3106 * NOTE: 4 are needed as a data will take two,
3107 * and there is a minimum of 2 that must be
3108 * maintained between the r and w indexes
3109 */
3110 element = priv->tx_pend_list.next;
3111 packet = list_entry(element, struct ipw2100_tx_packet, list);
3112
3113 if (unlikely(1 + packet->info.d_struct.txb->nr_frags >
3114 IPW_MAX_BDS)) {
3115 /* TODO: Support merging buffers if more than
3116 * IPW_MAX_BDS are used */
3117 IPW_DEBUG_INFO("%s: Maximum BD threshold exceeded. "
3118 "Increase fragmentation level.\n",
3119 priv->net_dev->name);
3120 }
3121
3122 if (txq->available <= 3 + packet->info.d_struct.txb->nr_frags) {
3123 IPW_DEBUG_TX("no room in tx_queue\n");
3124 break;
3125 }
3126
3127 list_del(element);
3128 DEC_STAT(&priv->tx_pend_stat);
3129
3130 tbd = &txq->drv[txq->next];
3131
3132 packet->index = txq->next;
3133
3134 ipw_hdr = packet->info.d_struct.data;
3135 hdr = (struct libipw_hdr_3addr *)packet->info.d_struct.txb->
3136 fragments[0]->data;
3137
3138 if (priv->ieee->iw_mode == IW_MODE_INFRA) {
3139 /* To DS: Addr1 = BSSID, Addr2 = SA,
3140 Addr3 = DA */
3141 memcpy(ipw_hdr->src_addr, hdr->addr2, ETH_ALEN);
3142 memcpy(ipw_hdr->dst_addr, hdr->addr3, ETH_ALEN);
3143 } else if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
3144 /* not From/To DS: Addr1 = DA, Addr2 = SA,
3145 Addr3 = BSSID */
3146 memcpy(ipw_hdr->src_addr, hdr->addr2, ETH_ALEN);
3147 memcpy(ipw_hdr->dst_addr, hdr->addr1, ETH_ALEN);
3148 }
3149
3150 ipw_hdr->host_command_reg = SEND;
3151 ipw_hdr->host_command_reg1 = 0;
3152
3153 /* For now we only support host based encryption */
3154 ipw_hdr->needs_encryption = 0;
3155 ipw_hdr->encrypted = packet->info.d_struct.txb->encrypted;
3156 if (packet->info.d_struct.txb->nr_frags > 1)
3157 ipw_hdr->fragment_size =
3158 packet->info.d_struct.txb->frag_size -
3159 LIBIPW_3ADDR_LEN;
3160 else
3161 ipw_hdr->fragment_size = 0;
3162
3163 tbd->host_addr = packet->info.d_struct.data_phys;
3164 tbd->buf_length = sizeof(struct ipw2100_data_header);
3165 tbd->num_fragments = 1 + packet->info.d_struct.txb->nr_frags;
3166 tbd->status.info.field =
3167 IPW_BD_STATUS_TX_FRAME_802_3 |
3168 IPW_BD_STATUS_TX_FRAME_NOT_LAST_FRAGMENT;
3169 txq->next++;
3170 txq->next %= txq->entries;
3171
3172 IPW_DEBUG_TX("data header tbd TX%d P=%08x L=%d\n",
3173 packet->index, tbd->host_addr, tbd->buf_length);
3174 #ifdef CONFIG_IPW2100_DEBUG
3175 if (packet->info.d_struct.txb->nr_frags > 1)
3176 IPW_DEBUG_FRAG("fragment Tx: %d frames\n",
3177 packet->info.d_struct.txb->nr_frags);
3178 #endif
3179
3180 for (i = 0; i < packet->info.d_struct.txb->nr_frags; i++) {
3181 tbd = &txq->drv[txq->next];
3182 if (i == packet->info.d_struct.txb->nr_frags - 1)
3183 tbd->status.info.field =
3184 IPW_BD_STATUS_TX_FRAME_802_3 |
3185 IPW_BD_STATUS_TX_INTERRUPT_ENABLE;
3186 else
3187 tbd->status.info.field =
3188 IPW_BD_STATUS_TX_FRAME_802_3 |
3189 IPW_BD_STATUS_TX_FRAME_NOT_LAST_FRAGMENT;
3190
3191 tbd->buf_length = packet->info.d_struct.txb->
3192 fragments[i]->len - LIBIPW_3ADDR_LEN;
3193
3194 tbd->host_addr = pci_map_single(priv->pci_dev,
3195 packet->info.d_struct.
3196 txb->fragments[i]->
3197 data +
3198 LIBIPW_3ADDR_LEN,
3199 tbd->buf_length,
3200 PCI_DMA_TODEVICE);
3201
3202 IPW_DEBUG_TX("data frag tbd TX%d P=%08x L=%d\n",
3203 txq->next, tbd->host_addr,
3204 tbd->buf_length);
3205
3206 pci_dma_sync_single_for_device(priv->pci_dev,
3207 tbd->host_addr,
3208 tbd->buf_length,
3209 PCI_DMA_TODEVICE);
3210
3211 txq->next++;
3212 txq->next %= txq->entries;
3213 }
3214
3215 txq->available -= 1 + packet->info.d_struct.txb->nr_frags;
3216 SET_STAT(&priv->txq_stat, txq->available);
3217
3218 list_add_tail(element, &priv->fw_pend_list);
3219 INC_STAT(&priv->fw_pend_stat);
3220 }
3221
3222 if (txq->next != next) {
3223 /* kick off the DMA by notifying firmware the
3224 * write index has moved; make sure TBD stores are sync'd */
3225 write_register(priv->net_dev,
3226 IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
3227 txq->next);
3228 }
3229 }
3230
3231 static void ipw2100_irq_tasklet(struct ipw2100_priv *priv)
3232 {
3233 struct net_device *dev = priv->net_dev;
3234 unsigned long flags;
3235 u32 inta, tmp;
3236
3237 spin_lock_irqsave(&priv->low_lock, flags);
3238 ipw2100_disable_interrupts(priv);
3239
3240 read_register(dev, IPW_REG_INTA, &inta);
3241
3242 IPW_DEBUG_ISR("enter - INTA: 0x%08lX\n",
3243 (unsigned long)inta & IPW_INTERRUPT_MASK);
3244
3245 priv->in_isr++;
3246 priv->interrupts++;
3247
3248 /* We do not loop and keep polling for more interrupts as this
3249 * is frowned upon and doesn't play nicely with other potentially
3250 * chained IRQs */
3251 IPW_DEBUG_ISR("INTA: 0x%08lX\n",
3252 (unsigned long)inta & IPW_INTERRUPT_MASK);
3253
3254 if (inta & IPW2100_INTA_FATAL_ERROR) {
3255 printk(KERN_WARNING DRV_NAME
3256 ": Fatal interrupt. Scheduling firmware restart.\n");
3257 priv->inta_other++;
3258 write_register(dev, IPW_REG_INTA, IPW2100_INTA_FATAL_ERROR);
3259
3260 read_nic_dword(dev, IPW_NIC_FATAL_ERROR, &priv->fatal_error);
3261 IPW_DEBUG_INFO("%s: Fatal error value: 0x%08X\n",
3262 priv->net_dev->name, priv->fatal_error);
3263
3264 read_nic_dword(dev, IPW_ERROR_ADDR(priv->fatal_error), &tmp);
3265 IPW_DEBUG_INFO("%s: Fatal error address value: 0x%08X\n",
3266 priv->net_dev->name, tmp);
3267
3268 /* Wake up any sleeping jobs */
3269 schedule_reset(priv);
3270 }
3271
3272 if (inta & IPW2100_INTA_PARITY_ERROR) {
3273 printk(KERN_ERR DRV_NAME
3274 ": ***** PARITY ERROR INTERRUPT !!!!\n");
3275 priv->inta_other++;
3276 write_register(dev, IPW_REG_INTA, IPW2100_INTA_PARITY_ERROR);
3277 }
3278
3279 if (inta & IPW2100_INTA_RX_TRANSFER) {
3280 IPW_DEBUG_ISR("RX interrupt\n");
3281
3282 priv->rx_interrupts++;
3283
3284 write_register(dev, IPW_REG_INTA, IPW2100_INTA_RX_TRANSFER);
3285
3286 __ipw2100_rx_process(priv);
3287 __ipw2100_tx_complete(priv);
3288 }
3289
3290 if (inta & IPW2100_INTA_TX_TRANSFER) {
3291 IPW_DEBUG_ISR("TX interrupt\n");
3292
3293 priv->tx_interrupts++;
3294
3295 write_register(dev, IPW_REG_INTA, IPW2100_INTA_TX_TRANSFER);
3296
3297 __ipw2100_tx_complete(priv);
3298 ipw2100_tx_send_commands(priv);
3299 ipw2100_tx_send_data(priv);
3300 }
3301
3302 if (inta & IPW2100_INTA_TX_COMPLETE) {
3303 IPW_DEBUG_ISR("TX complete\n");
3304 priv->inta_other++;
3305 write_register(dev, IPW_REG_INTA, IPW2100_INTA_TX_COMPLETE);
3306
3307 __ipw2100_tx_complete(priv);
3308 }
3309
3310 if (inta & IPW2100_INTA_EVENT_INTERRUPT) {
3311 /* ipw2100_handle_event(dev); */
3312 priv->inta_other++;
3313 write_register(dev, IPW_REG_INTA, IPW2100_INTA_EVENT_INTERRUPT);
3314 }
3315
3316 if (inta & IPW2100_INTA_FW_INIT_DONE) {
3317 IPW_DEBUG_ISR("FW init done interrupt\n");
3318 priv->inta_other++;
3319
3320 read_register(dev, IPW_REG_INTA, &tmp);
3321 if (tmp & (IPW2100_INTA_FATAL_ERROR |
3322 IPW2100_INTA_PARITY_ERROR)) {
3323 write_register(dev, IPW_REG_INTA,
3324 IPW2100_INTA_FATAL_ERROR |
3325 IPW2100_INTA_PARITY_ERROR);
3326 }
3327
3328 write_register(dev, IPW_REG_INTA, IPW2100_INTA_FW_INIT_DONE);
3329 }
3330
3331 if (inta & IPW2100_INTA_STATUS_CHANGE) {
3332 IPW_DEBUG_ISR("Status change interrupt\n");
3333 priv->inta_other++;
3334 write_register(dev, IPW_REG_INTA, IPW2100_INTA_STATUS_CHANGE);
3335 }
3336
3337 if (inta & IPW2100_INTA_SLAVE_MODE_HOST_COMMAND_DONE) {
3338 IPW_DEBUG_ISR("slave host mode interrupt\n");
3339 priv->inta_other++;
3340 write_register(dev, IPW_REG_INTA,
3341 IPW2100_INTA_SLAVE_MODE_HOST_COMMAND_DONE);
3342 }
3343
3344 priv->in_isr--;
3345 ipw2100_enable_interrupts(priv);
3346
3347 spin_unlock_irqrestore(&priv->low_lock, flags);
3348
3349 IPW_DEBUG_ISR("exit\n");
3350 }
3351
3352 static irqreturn_t ipw2100_interrupt(int irq, void *data)
3353 {
3354 struct ipw2100_priv *priv = data;
3355 u32 inta, inta_mask;
3356
3357 if (!data)
3358 return IRQ_NONE;
3359
3360 spin_lock(&priv->low_lock);
3361
3362 /* We check to see if we should be ignoring interrupts before
3363 * we touch the hardware. During ucode load if we try and handle
3364 * an interrupt we can cause keyboard problems as well as cause
3365 * the ucode to fail to initialize */
3366 if (!(priv->status & STATUS_INT_ENABLED)) {
3367 /* Shared IRQ */
3368 goto none;
3369 }
3370
3371 read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask);
3372 read_register(priv->net_dev, IPW_REG_INTA, &inta);
3373
3374 if (inta == 0xFFFFFFFF) {
3375 /* Hardware disappeared */
3376 printk(KERN_WARNING DRV_NAME ": IRQ INTA == 0xFFFFFFFF\n");
3377 goto none;
3378 }
3379
3380 inta &= IPW_INTERRUPT_MASK;
3381
3382 if (!(inta & inta_mask)) {
3383 /* Shared interrupt */
3384 goto none;
3385 }
3386
3387 /* We disable the hardware interrupt here just to prevent unneeded
3388 * calls to be made. We disable this again within the actual
3389 * work tasklet, so if another part of the code re-enables the
3390 * interrupt, that is fine */
3391 ipw2100_disable_interrupts(priv);
3392
3393 tasklet_schedule(&priv->irq_tasklet);
3394 spin_unlock(&priv->low_lock);
3395
3396 return IRQ_HANDLED;
3397 none:
3398 spin_unlock(&priv->low_lock);
3399 return IRQ_NONE;
3400 }
3401
3402 static netdev_tx_t ipw2100_tx(struct libipw_txb *txb,
3403 struct net_device *dev, int pri)
3404 {
3405 struct ipw2100_priv *priv = libipw_priv(dev);
3406 struct list_head *element;
3407 struct ipw2100_tx_packet *packet;
3408 unsigned long flags;
3409
3410 spin_lock_irqsave(&priv->low_lock, flags);
3411
3412 if (!(priv->status & STATUS_ASSOCIATED)) {
3413 IPW_DEBUG_INFO("Can not transmit when not connected.\n");
3414 priv->net_dev->stats.tx_carrier_errors++;
3415 netif_stop_queue(dev);
3416 goto fail_unlock;
3417 }
3418
3419 if (list_empty(&priv->tx_free_list))
3420 goto fail_unlock;
3421
3422 element = priv->tx_free_list.next;
3423 packet = list_entry(element, struct ipw2100_tx_packet, list);
3424
3425 packet->info.d_struct.txb = txb;
3426
3427 IPW_DEBUG_TX("Sending fragment (%d bytes):\n", txb->fragments[0]->len);
3428 printk_buf(IPW_DL_TX, txb->fragments[0]->data, txb->fragments[0]->len);
3429
3430 packet->jiffy_start = jiffies;
3431
3432 list_del(element);
3433 DEC_STAT(&priv->tx_free_stat);
3434
3435 list_add_tail(element, &priv->tx_pend_list);
3436 INC_STAT(&priv->tx_pend_stat);
3437
3438 ipw2100_tx_send_data(priv);
3439
3440 spin_unlock_irqrestore(&priv->low_lock, flags);
3441 return NETDEV_TX_OK;
3442
3443 fail_unlock:
3444 netif_stop_queue(dev);
3445 spin_unlock_irqrestore(&priv->low_lock, flags);
3446 return NETDEV_TX_BUSY;
3447 }
3448
3449 static int ipw2100_msg_allocate(struct ipw2100_priv *priv)
3450 {
3451 int i, j, err = -EINVAL;
3452 void *v;
3453 dma_addr_t p;
3454
3455 priv->msg_buffers =
3456 kmalloc(IPW_COMMAND_POOL_SIZE * sizeof(struct ipw2100_tx_packet),
3457 GFP_KERNEL);
3458 if (!priv->msg_buffers)
3459 return -ENOMEM;
3460
3461 for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++) {
3462 v = pci_alloc_consistent(priv->pci_dev,
3463 sizeof(struct ipw2100_cmd_header), &p);
3464 if (!v) {
3465 printk(KERN_ERR DRV_NAME ": "
3466 "%s: PCI alloc failed for msg "
3467 "buffers.\n", priv->net_dev->name);
3468 err = -ENOMEM;
3469 break;
3470 }
3471
3472 memset(v, 0, sizeof(struct ipw2100_cmd_header));
3473
3474 priv->msg_buffers[i].type = COMMAND;
3475 priv->msg_buffers[i].info.c_struct.cmd =
3476 (struct ipw2100_cmd_header *)v;
3477 priv->msg_buffers[i].info.c_struct.cmd_phys = p;
3478 }
3479
3480 if (i == IPW_COMMAND_POOL_SIZE)
3481 return 0;
3482
3483 for (j = 0; j < i; j++) {
3484 pci_free_consistent(priv->pci_dev,
3485 sizeof(struct ipw2100_cmd_header),
3486 priv->msg_buffers[j].info.c_struct.cmd,
3487 priv->msg_buffers[j].info.c_struct.
3488 cmd_phys);
3489 }
3490
3491 kfree(priv->msg_buffers);
3492 priv->msg_buffers = NULL;
3493
3494 return err;
3495 }
3496
3497 static int ipw2100_msg_initialize(struct ipw2100_priv *priv)
3498 {
3499 int i;
3500
3501 INIT_LIST_HEAD(&priv->msg_free_list);
3502 INIT_LIST_HEAD(&priv->msg_pend_list);
3503
3504 for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++)
3505 list_add_tail(&priv->msg_buffers[i].list, &priv->msg_free_list);
3506 SET_STAT(&priv->msg_free_stat, i);
3507
3508 return 0;
3509 }
3510
3511 static void ipw2100_msg_free(struct ipw2100_priv *priv)
3512 {
3513 int i;
3514
3515 if (!priv->msg_buffers)
3516 return;
3517
3518 for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++) {
3519 pci_free_consistent(priv->pci_dev,
3520 sizeof(struct ipw2100_cmd_header),
3521 priv->msg_buffers[i].info.c_struct.cmd,
3522 priv->msg_buffers[i].info.c_struct.
3523 cmd_phys);
3524 }
3525
3526 kfree(priv->msg_buffers);
3527 priv->msg_buffers = NULL;
3528 }
3529
3530 static ssize_t show_pci(struct device *d, struct device_attribute *attr,
3531 char *buf)
3532 {
3533 struct pci_dev *pci_dev = container_of(d, struct pci_dev, dev);
3534 char *out = buf;
3535 int i, j;
3536 u32 val;
3537
3538 for (i = 0; i < 16; i++) {
3539 out += sprintf(out, "[%08X] ", i * 16);
3540 for (j = 0; j < 16; j += 4) {
3541 pci_read_config_dword(pci_dev, i * 16 + j, &val);
3542 out += sprintf(out, "%08X ", val);
3543 }
3544 out += sprintf(out, "\n");
3545 }
3546
3547 return out - buf;
3548 }
3549
3550 static DEVICE_ATTR(pci, S_IRUGO, show_pci, NULL);
3551
3552 static ssize_t show_cfg(struct device *d, struct device_attribute *attr,
3553 char *buf)
3554 {
3555 struct ipw2100_priv *p = dev_get_drvdata(d);
3556 return sprintf(buf, "0x%08x\n", (int)p->config);
3557 }
3558
3559 static DEVICE_ATTR(cfg, S_IRUGO, show_cfg, NULL);
3560
3561 static ssize_t show_status(struct device *d, struct device_attribute *attr,
3562 char *buf)
3563 {
3564 struct ipw2100_priv *p = dev_get_drvdata(d);
3565 return sprintf(buf, "0x%08x\n", (int)p->status);
3566 }
3567
3568 static DEVICE_ATTR(status, S_IRUGO, show_status, NULL);
3569
3570 static ssize_t show_capability(struct device *d, struct device_attribute *attr,
3571 char *buf)
3572 {
3573 struct ipw2100_priv *p = dev_get_drvdata(d);
3574 return sprintf(buf, "0x%08x\n", (int)p->capability);
3575 }
3576
3577 static DEVICE_ATTR(capability, S_IRUGO, show_capability, NULL);
3578
3579 #define IPW2100_REG(x) { IPW_ ##x, #x }
3580 static const struct {
3581 u32 addr;
3582 const char *name;
3583 } hw_data[] = {
3584 IPW2100_REG(REG_GP_CNTRL),
3585 IPW2100_REG(REG_GPIO),
3586 IPW2100_REG(REG_INTA),
3587 IPW2100_REG(REG_INTA_MASK), IPW2100_REG(REG_RESET_REG),};
3588 #define IPW2100_NIC(x, s) { x, #x, s }
3589 static const struct {
3590 u32 addr;
3591 const char *name;
3592 size_t size;
3593 } nic_data[] = {
3594 IPW2100_NIC(IPW2100_CONTROL_REG, 2),
3595 IPW2100_NIC(0x210014, 1), IPW2100_NIC(0x210000, 1),};
3596 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
3597 static const struct {
3598 u8 index;
3599 const char *name;
3600 const char *desc;
3601 } ord_data[] = {
3602 IPW2100_ORD(STAT_TX_HOST_REQUESTS, "requested Host Tx's (MSDU)"),
3603 IPW2100_ORD(STAT_TX_HOST_COMPLETE,
3604 "successful Host Tx's (MSDU)"),
3605 IPW2100_ORD(STAT_TX_DIR_DATA,
3606 "successful Directed Tx's (MSDU)"),
3607 IPW2100_ORD(STAT_TX_DIR_DATA1,
3608 "successful Directed Tx's (MSDU) @ 1MB"),
3609 IPW2100_ORD(STAT_TX_DIR_DATA2,
3610 "successful Directed Tx's (MSDU) @ 2MB"),
3611 IPW2100_ORD(STAT_TX_DIR_DATA5_5,
3612 "successful Directed Tx's (MSDU) @ 5_5MB"),
3613 IPW2100_ORD(STAT_TX_DIR_DATA11,
3614 "successful Directed Tx's (MSDU) @ 11MB"),
3615 IPW2100_ORD(STAT_TX_NODIR_DATA1,
3616 "successful Non_Directed Tx's (MSDU) @ 1MB"),
3617 IPW2100_ORD(STAT_TX_NODIR_DATA2,
3618 "successful Non_Directed Tx's (MSDU) @ 2MB"),
3619 IPW2100_ORD(STAT_TX_NODIR_DATA5_5,
3620 "successful Non_Directed Tx's (MSDU) @ 5.5MB"),
3621 IPW2100_ORD(STAT_TX_NODIR_DATA11,
3622 "successful Non_Directed Tx's (MSDU) @ 11MB"),
3623 IPW2100_ORD(STAT_NULL_DATA, "successful NULL data Tx's"),
3624 IPW2100_ORD(STAT_TX_RTS, "successful Tx RTS"),
3625 IPW2100_ORD(STAT_TX_CTS, "successful Tx CTS"),
3626 IPW2100_ORD(STAT_TX_ACK, "successful Tx ACK"),
3627 IPW2100_ORD(STAT_TX_ASSN, "successful Association Tx's"),
3628 IPW2100_ORD(STAT_TX_ASSN_RESP,
3629 "successful Association response Tx's"),
3630 IPW2100_ORD(STAT_TX_REASSN,
3631 "successful Reassociation Tx's"),
3632 IPW2100_ORD(STAT_TX_REASSN_RESP,
3633 "successful Reassociation response Tx's"),
3634 IPW2100_ORD(STAT_TX_PROBE,
3635 "probes successfully transmitted"),
3636 IPW2100_ORD(STAT_TX_PROBE_RESP,
3637 "probe responses successfully transmitted"),
3638 IPW2100_ORD(STAT_TX_BEACON, "tx beacon"),
3639 IPW2100_ORD(STAT_TX_ATIM, "Tx ATIM"),
3640 IPW2100_ORD(STAT_TX_DISASSN,
3641 "successful Disassociation TX"),
3642 IPW2100_ORD(STAT_TX_AUTH, "successful Authentication Tx"),
3643 IPW2100_ORD(STAT_TX_DEAUTH,
3644 "successful Deauthentication TX"),
3645 IPW2100_ORD(STAT_TX_TOTAL_BYTES,
3646 "Total successful Tx data bytes"),
3647 IPW2100_ORD(STAT_TX_RETRIES, "Tx retries"),
3648 IPW2100_ORD(STAT_TX_RETRY1, "Tx retries at 1MBPS"),
3649 IPW2100_ORD(STAT_TX_RETRY2, "Tx retries at 2MBPS"),
3650 IPW2100_ORD(STAT_TX_RETRY5_5, "Tx retries at 5.5MBPS"),
3651 IPW2100_ORD(STAT_TX_RETRY11, "Tx retries at 11MBPS"),
3652 IPW2100_ORD(STAT_TX_FAILURES, "Tx Failures"),
3653 IPW2100_ORD(STAT_TX_MAX_TRIES_IN_HOP,
3654 "times max tries in a hop failed"),
3655 IPW2100_ORD(STAT_TX_DISASSN_FAIL,
3656 "times disassociation failed"),
3657 IPW2100_ORD(STAT_TX_ERR_CTS, "missed/bad CTS frames"),
3658 IPW2100_ORD(STAT_TX_ERR_ACK, "tx err due to acks"),
3659 IPW2100_ORD(STAT_RX_HOST, "packets passed to host"),
3660 IPW2100_ORD(STAT_RX_DIR_DATA, "directed packets"),
3661 IPW2100_ORD(STAT_RX_DIR_DATA1, "directed packets at 1MB"),
3662 IPW2100_ORD(STAT_RX_DIR_DATA2, "directed packets at 2MB"),
3663 IPW2100_ORD(STAT_RX_DIR_DATA5_5,
3664 "directed packets at 5.5MB"),
3665 IPW2100_ORD(STAT_RX_DIR_DATA11, "directed packets at 11MB"),
3666 IPW2100_ORD(STAT_RX_NODIR_DATA, "nondirected packets"),
3667 IPW2100_ORD(STAT_RX_NODIR_DATA1,
3668 "nondirected packets at 1MB"),
3669 IPW2100_ORD(STAT_RX_NODIR_DATA2,
3670 "nondirected packets at 2MB"),
3671 IPW2100_ORD(STAT_RX_NODIR_DATA5_5,
3672 "nondirected packets at 5.5MB"),
3673 IPW2100_ORD(STAT_RX_NODIR_DATA11,
3674 "nondirected packets at 11MB"),
3675 IPW2100_ORD(STAT_RX_NULL_DATA, "null data rx's"),
3676 IPW2100_ORD(STAT_RX_RTS, "Rx RTS"), IPW2100_ORD(STAT_RX_CTS,
3677 "Rx CTS"),
3678 IPW2100_ORD(STAT_RX_ACK, "Rx ACK"),
3679 IPW2100_ORD(STAT_RX_CFEND, "Rx CF End"),
3680 IPW2100_ORD(STAT_RX_CFEND_ACK, "Rx CF End + CF Ack"),
3681 IPW2100_ORD(STAT_RX_ASSN, "Association Rx's"),
3682 IPW2100_ORD(STAT_RX_ASSN_RESP, "Association response Rx's"),
3683 IPW2100_ORD(STAT_RX_REASSN, "Reassociation Rx's"),
3684 IPW2100_ORD(STAT_RX_REASSN_RESP,
3685 "Reassociation response Rx's"),
3686 IPW2100_ORD(STAT_RX_PROBE, "probe Rx's"),
3687 IPW2100_ORD(STAT_RX_PROBE_RESP, "probe response Rx's"),
3688 IPW2100_ORD(STAT_RX_BEACON, "Rx beacon"),
3689 IPW2100_ORD(STAT_RX_ATIM, "Rx ATIM"),
3690 IPW2100_ORD(STAT_RX_DISASSN, "disassociation Rx"),
3691 IPW2100_ORD(STAT_RX_AUTH, "authentication Rx"),
3692 IPW2100_ORD(STAT_RX_DEAUTH, "deauthentication Rx"),
3693 IPW2100_ORD(STAT_RX_TOTAL_BYTES,
3694 "Total rx data bytes received"),
3695 IPW2100_ORD(STAT_RX_ERR_CRC, "packets with Rx CRC error"),
3696 IPW2100_ORD(STAT_RX_ERR_CRC1, "Rx CRC errors at 1MB"),
3697 IPW2100_ORD(STAT_RX_ERR_CRC2, "Rx CRC errors at 2MB"),
3698 IPW2100_ORD(STAT_RX_ERR_CRC5_5, "Rx CRC errors at 5.5MB"),
3699 IPW2100_ORD(STAT_RX_ERR_CRC11, "Rx CRC errors at 11MB"),
3700 IPW2100_ORD(STAT_RX_DUPLICATE1,
3701 "duplicate rx packets at 1MB"),
3702 IPW2100_ORD(STAT_RX_DUPLICATE2,
3703 "duplicate rx packets at 2MB"),
3704 IPW2100_ORD(STAT_RX_DUPLICATE5_5,
3705 "duplicate rx packets at 5.5MB"),
3706 IPW2100_ORD(STAT_RX_DUPLICATE11,
3707 "duplicate rx packets at 11MB"),
3708 IPW2100_ORD(STAT_RX_DUPLICATE, "duplicate rx packets"),
3709 IPW2100_ORD(PERS_DB_LOCK, "locking fw permanent db"),
3710 IPW2100_ORD(PERS_DB_SIZE, "size of fw permanent db"),
3711 IPW2100_ORD(PERS_DB_ADDR, "address of fw permanent db"),
3712 IPW2100_ORD(STAT_RX_INVALID_PROTOCOL,
3713 "rx frames with invalid protocol"),
3714 IPW2100_ORD(SYS_BOOT_TIME, "Boot time"),
3715 IPW2100_ORD(STAT_RX_NO_BUFFER,
3716 "rx frames rejected due to no buffer"),
3717 IPW2100_ORD(STAT_RX_MISSING_FRAG,
3718 "rx frames dropped due to missing fragment"),
3719 IPW2100_ORD(STAT_RX_ORPHAN_FRAG,
3720 "rx frames dropped due to non-sequential fragment"),
3721 IPW2100_ORD(STAT_RX_ORPHAN_FRAME,
3722 "rx frames dropped due to unmatched 1st frame"),
3723 IPW2100_ORD(STAT_RX_FRAG_AGEOUT,
3724 "rx frames dropped due to uncompleted frame"),
3725 IPW2100_ORD(STAT_RX_ICV_ERRORS,
3726 "ICV errors during decryption"),
3727 IPW2100_ORD(STAT_PSP_SUSPENSION, "times adapter suspended"),
3728 IPW2100_ORD(STAT_PSP_BCN_TIMEOUT, "beacon timeout"),
3729 IPW2100_ORD(STAT_PSP_POLL_TIMEOUT,
3730 "poll response timeouts"),
3731 IPW2100_ORD(STAT_PSP_NONDIR_TIMEOUT,
3732 "timeouts waiting for last {broad,multi}cast pkt"),
3733 IPW2100_ORD(STAT_PSP_RX_DTIMS, "PSP DTIMs received"),
3734 IPW2100_ORD(STAT_PSP_RX_TIMS, "PSP TIMs received"),
3735 IPW2100_ORD(STAT_PSP_STATION_ID, "PSP Station ID"),
3736 IPW2100_ORD(LAST_ASSN_TIME, "RTC time of last association"),
3737 IPW2100_ORD(STAT_PERCENT_MISSED_BCNS,
3738 "current calculation of % missed beacons"),
3739 IPW2100_ORD(STAT_PERCENT_RETRIES,
3740 "current calculation of % missed tx retries"),
3741 IPW2100_ORD(ASSOCIATED_AP_PTR,
3742 "0 if not associated, else pointer to AP table entry"),
3743 IPW2100_ORD(AVAILABLE_AP_CNT,
3744 "AP's decsribed in the AP table"),
3745 IPW2100_ORD(AP_LIST_PTR, "Ptr to list of available APs"),
3746 IPW2100_ORD(STAT_AP_ASSNS, "associations"),
3747 IPW2100_ORD(STAT_ASSN_FAIL, "association failures"),
3748 IPW2100_ORD(STAT_ASSN_RESP_FAIL,
3749 "failures due to response fail"),
3750 IPW2100_ORD(STAT_FULL_SCANS, "full scans"),
3751 IPW2100_ORD(CARD_DISABLED, "Card Disabled"),
3752 IPW2100_ORD(STAT_ROAM_INHIBIT,
3753 "times roaming was inhibited due to activity"),
3754 IPW2100_ORD(RSSI_AT_ASSN,
3755 "RSSI of associated AP at time of association"),
3756 IPW2100_ORD(STAT_ASSN_CAUSE1,
3757 "reassociation: no probe response or TX on hop"),
3758 IPW2100_ORD(STAT_ASSN_CAUSE2,
3759 "reassociation: poor tx/rx quality"),
3760 IPW2100_ORD(STAT_ASSN_CAUSE3,
3761 "reassociation: tx/rx quality (excessive AP load"),
3762 IPW2100_ORD(STAT_ASSN_CAUSE4,
3763 "reassociation: AP RSSI level"),
3764 IPW2100_ORD(STAT_ASSN_CAUSE5,
3765 "reassociations due to load leveling"),
3766 IPW2100_ORD(STAT_AUTH_FAIL, "times authentication failed"),
3767 IPW2100_ORD(STAT_AUTH_RESP_FAIL,
3768 "times authentication response failed"),
3769 IPW2100_ORD(STATION_TABLE_CNT,
3770 "entries in association table"),
3771 IPW2100_ORD(RSSI_AVG_CURR, "Current avg RSSI"),
3772 IPW2100_ORD(POWER_MGMT_MODE, "Power mode - 0=CAM, 1=PSP"),
3773 IPW2100_ORD(COUNTRY_CODE,
3774 "IEEE country code as recv'd from beacon"),
3775 IPW2100_ORD(COUNTRY_CHANNELS,
3776 "channels supported by country"),
3777 IPW2100_ORD(RESET_CNT, "adapter resets (warm)"),
3778 IPW2100_ORD(BEACON_INTERVAL, "Beacon interval"),
3779 IPW2100_ORD(ANTENNA_DIVERSITY,
3780 "TRUE if antenna diversity is disabled"),
3781 IPW2100_ORD(DTIM_PERIOD, "beacon intervals between DTIMs"),
3782 IPW2100_ORD(OUR_FREQ,
3783 "current radio freq lower digits - channel ID"),
3784 IPW2100_ORD(RTC_TIME, "current RTC time"),
3785 IPW2100_ORD(PORT_TYPE, "operating mode"),
3786 IPW2100_ORD(CURRENT_TX_RATE, "current tx rate"),
3787 IPW2100_ORD(SUPPORTED_RATES, "supported tx rates"),
3788 IPW2100_ORD(ATIM_WINDOW, "current ATIM Window"),
3789 IPW2100_ORD(BASIC_RATES, "basic tx rates"),
3790 IPW2100_ORD(NIC_HIGHEST_RATE, "NIC highest tx rate"),
3791 IPW2100_ORD(AP_HIGHEST_RATE, "AP highest tx rate"),
3792 IPW2100_ORD(CAPABILITIES,
3793 "Management frame capability field"),
3794 IPW2100_ORD(AUTH_TYPE, "Type of authentication"),
3795 IPW2100_ORD(RADIO_TYPE, "Adapter card platform type"),
3796 IPW2100_ORD(RTS_THRESHOLD,
3797 "Min packet length for RTS handshaking"),
3798 IPW2100_ORD(INT_MODE, "International mode"),
3799 IPW2100_ORD(FRAGMENTATION_THRESHOLD,
3800 "protocol frag threshold"),
3801 IPW2100_ORD(EEPROM_SRAM_DB_BLOCK_START_ADDRESS,
3802 "EEPROM offset in SRAM"),
3803 IPW2100_ORD(EEPROM_SRAM_DB_BLOCK_SIZE,
3804 "EEPROM size in SRAM"),
3805 IPW2100_ORD(EEPROM_SKU_CAPABILITY, "EEPROM SKU Capability"),
3806 IPW2100_ORD(EEPROM_IBSS_11B_CHANNELS,
3807 "EEPROM IBSS 11b channel set"),
3808 IPW2100_ORD(MAC_VERSION, "MAC Version"),
3809 IPW2100_ORD(MAC_REVISION, "MAC Revision"),
3810 IPW2100_ORD(RADIO_VERSION, "Radio Version"),
3811 IPW2100_ORD(NIC_MANF_DATE_TIME, "MANF Date/Time STAMP"),
3812 IPW2100_ORD(UCODE_VERSION, "Ucode Version"),};
3813
3814 static ssize_t show_registers(struct device *d, struct device_attribute *attr,
3815 char *buf)
3816 {
3817 int i;
3818 struct ipw2100_priv *priv = dev_get_drvdata(d);
3819 struct net_device *dev = priv->net_dev;
3820 char *out = buf;
3821 u32 val = 0;
3822
3823 out += sprintf(out, "%30s [Address ] : Hex\n", "Register");
3824
3825 for (i = 0; i < ARRAY_SIZE(hw_data); i++) {
3826 read_register(dev, hw_data[i].addr, &val);
3827 out += sprintf(out, "%30s [%08X] : %08X\n",
3828 hw_data[i].name, hw_data[i].addr, val);
3829 }
3830
3831 return out - buf;
3832 }
3833
3834 static DEVICE_ATTR(registers, S_IRUGO, show_registers, NULL);
3835
3836 static ssize_t show_hardware(struct device *d, struct device_attribute *attr,
3837 char *buf)
3838 {
3839 struct ipw2100_priv *priv = dev_get_drvdata(d);
3840 struct net_device *dev = priv->net_dev;
3841 char *out = buf;
3842 int i;
3843
3844 out += sprintf(out, "%30s [Address ] : Hex\n", "NIC entry");
3845
3846 for (i = 0; i < ARRAY_SIZE(nic_data); i++) {
3847 u8 tmp8;
3848 u16 tmp16;
3849 u32 tmp32;
3850
3851 switch (nic_data[i].size) {
3852 case 1:
3853 read_nic_byte(dev, nic_data[i].addr, &tmp8);
3854 out += sprintf(out, "%30s [%08X] : %02X\n",
3855 nic_data[i].name, nic_data[i].addr,
3856 tmp8);
3857 break;
3858 case 2:
3859 read_nic_word(dev, nic_data[i].addr, &tmp16);
3860 out += sprintf(out, "%30s [%08X] : %04X\n",
3861 nic_data[i].name, nic_data[i].addr,
3862 tmp16);
3863 break;
3864 case 4:
3865 read_nic_dword(dev, nic_data[i].addr, &tmp32);
3866 out += sprintf(out, "%30s [%08X] : %08X\n",
3867 nic_data[i].name, nic_data[i].addr,
3868 tmp32);
3869 break;
3870 }
3871 }
3872 return out - buf;
3873 }
3874
3875 static DEVICE_ATTR(hardware, S_IRUGO, show_hardware, NULL);
3876
3877 static ssize_t show_memory(struct device *d, struct device_attribute *attr,
3878 char *buf)
3879 {
3880 struct ipw2100_priv *priv = dev_get_drvdata(d);
3881 struct net_device *dev = priv->net_dev;
3882 static unsigned long loop = 0;
3883 int len = 0;
3884 u32 buffer[4];
3885 int i;
3886 char line[81];
3887
3888 if (loop >= 0x30000)
3889 loop = 0;
3890
3891 /* sysfs provides us PAGE_SIZE buffer */
3892 while (len < PAGE_SIZE - 128 && loop < 0x30000) {
3893
3894 if (priv->snapshot[0])
3895 for (i = 0; i < 4; i++)
3896 buffer[i] =
3897 *(u32 *) SNAPSHOT_ADDR(loop + i * 4);
3898 else
3899 for (i = 0; i < 4; i++)
3900 read_nic_dword(dev, loop + i * 4, &buffer[i]);
3901
3902 if (priv->dump_raw)
3903 len += sprintf(buf + len,
3904 "%c%c%c%c"
3905 "%c%c%c%c"
3906 "%c%c%c%c"
3907 "%c%c%c%c",
3908 ((u8 *) buffer)[0x0],
3909 ((u8 *) buffer)[0x1],
3910 ((u8 *) buffer)[0x2],
3911 ((u8 *) buffer)[0x3],
3912 ((u8 *) buffer)[0x4],
3913 ((u8 *) buffer)[0x5],
3914 ((u8 *) buffer)[0x6],
3915 ((u8 *) buffer)[0x7],
3916 ((u8 *) buffer)[0x8],
3917 ((u8 *) buffer)[0x9],
3918 ((u8 *) buffer)[0xa],
3919 ((u8 *) buffer)[0xb],
3920 ((u8 *) buffer)[0xc],
3921 ((u8 *) buffer)[0xd],
3922 ((u8 *) buffer)[0xe],
3923 ((u8 *) buffer)[0xf]);
3924 else
3925 len += sprintf(buf + len, "%s\n",
3926 snprint_line(line, sizeof(line),
3927 (u8 *) buffer, 16, loop));
3928 loop += 16;
3929 }
3930
3931 return len;
3932 }
3933
3934 static ssize_t store_memory(struct device *d, struct device_attribute *attr,
3935 const char *buf, size_t count)
3936 {
3937 struct ipw2100_priv *priv = dev_get_drvdata(d);
3938 struct net_device *dev = priv->net_dev;
3939 const char *p = buf;
3940
3941 (void)dev; /* kill unused-var warning for debug-only code */
3942
3943 if (count < 1)
3944 return count;
3945
3946 if (p[0] == '1' ||
3947 (count >= 2 && tolower(p[0]) == 'o' && tolower(p[1]) == 'n')) {
3948 IPW_DEBUG_INFO("%s: Setting memory dump to RAW mode.\n",
3949 dev->name);
3950 priv->dump_raw = 1;
3951
3952 } else if (p[0] == '0' || (count >= 2 && tolower(p[0]) == 'o' &&
3953 tolower(p[1]) == 'f')) {
3954 IPW_DEBUG_INFO("%s: Setting memory dump to HEX mode.\n",
3955 dev->name);
3956 priv->dump_raw = 0;
3957
3958 } else if (tolower(p[0]) == 'r') {
3959 IPW_DEBUG_INFO("%s: Resetting firmware snapshot.\n", dev->name);
3960 ipw2100_snapshot_free(priv);
3961
3962 } else
3963 IPW_DEBUG_INFO("%s: Usage: 0|on = HEX, 1|off = RAW, "
3964 "reset = clear memory snapshot\n", dev->name);
3965
3966 return count;
3967 }
3968
3969 static DEVICE_ATTR(memory, S_IWUSR | S_IRUGO, show_memory, store_memory);
3970
3971 static ssize_t show_ordinals(struct device *d, struct device_attribute *attr,
3972 char *buf)
3973 {
3974 struct ipw2100_priv *priv = dev_get_drvdata(d);
3975 u32 val = 0;
3976 int len = 0;
3977 u32 val_len;
3978 static int loop = 0;
3979
3980 if (priv->status & STATUS_RF_KILL_MASK)
3981 return 0;
3982
3983 if (loop >= ARRAY_SIZE(ord_data))
3984 loop = 0;
3985
3986 /* sysfs provides us PAGE_SIZE buffer */
3987 while (len < PAGE_SIZE - 128 && loop < ARRAY_SIZE(ord_data)) {
3988 val_len = sizeof(u32);
3989
3990 if (ipw2100_get_ordinal(priv, ord_data[loop].index, &val,
3991 &val_len))
3992 len += sprintf(buf + len, "[0x%02X] = ERROR %s\n",
3993 ord_data[loop].index,
3994 ord_data[loop].desc);
3995 else
3996 len += sprintf(buf + len, "[0x%02X] = 0x%08X %s\n",
3997 ord_data[loop].index, val,
3998 ord_data[loop].desc);
3999 loop++;
4000 }
4001
4002 return len;
4003 }
4004
4005 static DEVICE_ATTR(ordinals, S_IRUGO, show_ordinals, NULL);
4006
4007 static ssize_t show_stats(struct device *d, struct device_attribute *attr,
4008 char *buf)
4009 {
4010 struct ipw2100_priv *priv = dev_get_drvdata(d);
4011 char *out = buf;
4012
4013 out += sprintf(out, "interrupts: %d {tx: %d, rx: %d, other: %d}\n",
4014 priv->interrupts, priv->tx_interrupts,
4015 priv->rx_interrupts, priv->inta_other);
4016 out += sprintf(out, "firmware resets: %d\n", priv->resets);
4017 out += sprintf(out, "firmware hangs: %d\n", priv->hangs);
4018 #ifdef CONFIG_IPW2100_DEBUG
4019 out += sprintf(out, "packet mismatch image: %s\n",
4020 priv->snapshot[0] ? "YES" : "NO");
4021 #endif
4022
4023 return out - buf;
4024 }
4025
4026 static DEVICE_ATTR(stats, S_IRUGO, show_stats, NULL);
4027
4028 static int ipw2100_switch_mode(struct ipw2100_priv *priv, u32 mode)
4029 {
4030 int err;
4031
4032 if (mode == priv->ieee->iw_mode)
4033 return 0;
4034
4035 err = ipw2100_disable_adapter(priv);
4036 if (err) {
4037 printk(KERN_ERR DRV_NAME ": %s: Could not disable adapter %d\n",
4038 priv->net_dev->name, err);
4039 return err;
4040 }
4041
4042 switch (mode) {
4043 case IW_MODE_INFRA:
4044 priv->net_dev->type = ARPHRD_ETHER;
4045 break;
4046 case IW_MODE_ADHOC:
4047 priv->net_dev->type = ARPHRD_ETHER;
4048 break;
4049 #ifdef CONFIG_IPW2100_MONITOR
4050 case IW_MODE_MONITOR:
4051 priv->last_mode = priv->ieee->iw_mode;
4052 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP;
4053 break;
4054 #endif /* CONFIG_IPW2100_MONITOR */
4055 }
4056
4057 priv->ieee->iw_mode = mode;
4058
4059 #ifdef CONFIG_PM
4060 /* Indicate ipw2100_download_firmware download firmware
4061 * from disk instead of memory. */
4062 ipw2100_firmware.version = 0;
4063 #endif
4064
4065 printk(KERN_INFO "%s: Resetting on mode change.\n", priv->net_dev->name);
4066 priv->reset_backoff = 0;
4067 schedule_reset(priv);
4068
4069 return 0;
4070 }
4071
4072 static ssize_t show_internals(struct device *d, struct device_attribute *attr,
4073 char *buf)
4074 {
4075 struct ipw2100_priv *priv = dev_get_drvdata(d);
4076 int len = 0;
4077
4078 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
4079
4080 if (priv->status & STATUS_ASSOCIATED)
4081 len += sprintf(buf + len, "connected: %lu\n",
4082 get_seconds() - priv->connect_start);
4083 else
4084 len += sprintf(buf + len, "not connected\n");
4085
4086 DUMP_VAR(ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx], "p");
4087 DUMP_VAR(status, "08lx");
4088 DUMP_VAR(config, "08lx");
4089 DUMP_VAR(capability, "08lx");
4090
4091 len +=
4092 sprintf(buf + len, "last_rtc: %lu\n",
4093 (unsigned long)priv->last_rtc);
4094
4095 DUMP_VAR(fatal_error, "d");
4096 DUMP_VAR(stop_hang_check, "d");
4097 DUMP_VAR(stop_rf_kill, "d");
4098 DUMP_VAR(messages_sent, "d");
4099
4100 DUMP_VAR(tx_pend_stat.value, "d");
4101 DUMP_VAR(tx_pend_stat.hi, "d");
4102
4103 DUMP_VAR(tx_free_stat.value, "d");
4104 DUMP_VAR(tx_free_stat.lo, "d");
4105
4106 DUMP_VAR(msg_free_stat.value, "d");
4107 DUMP_VAR(msg_free_stat.lo, "d");
4108
4109 DUMP_VAR(msg_pend_stat.value, "d");
4110 DUMP_VAR(msg_pend_stat.hi, "d");
4111
4112 DUMP_VAR(fw_pend_stat.value, "d");
4113 DUMP_VAR(fw_pend_stat.hi, "d");
4114
4115 DUMP_VAR(txq_stat.value, "d");
4116 DUMP_VAR(txq_stat.lo, "d");
4117
4118 DUMP_VAR(ieee->scans, "d");
4119 DUMP_VAR(reset_backoff, "d");
4120
4121 return len;
4122 }
4123
4124 static DEVICE_ATTR(internals, S_IRUGO, show_internals, NULL);
4125
4126 static ssize_t show_bssinfo(struct device *d, struct device_attribute *attr,
4127 char *buf)
4128 {
4129 struct ipw2100_priv *priv = dev_get_drvdata(d);
4130 char essid[IW_ESSID_MAX_SIZE + 1];
4131 u8 bssid[ETH_ALEN];
4132 u32 chan = 0;
4133 char *out = buf;
4134 unsigned int length;
4135 int ret;
4136
4137 if (priv->status & STATUS_RF_KILL_MASK)
4138 return 0;
4139
4140 memset(essid, 0, sizeof(essid));
4141 memset(bssid, 0, sizeof(bssid));
4142
4143 length = IW_ESSID_MAX_SIZE;
4144 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_SSID, essid, &length);
4145 if (ret)
4146 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
4147 __LINE__);
4148
4149 length = sizeof(bssid);
4150 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID,
4151 bssid, &length);
4152 if (ret)
4153 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
4154 __LINE__);
4155
4156 length = sizeof(u32);
4157 ret = ipw2100_get_ordinal(priv, IPW_ORD_OUR_FREQ, &chan, &length);
4158 if (ret)
4159 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
4160 __LINE__);
4161
4162 out += sprintf(out, "ESSID: %s\n", essid);
4163 out += sprintf(out, "BSSID: %pM\n", bssid);
4164 out += sprintf(out, "Channel: %d\n", chan);
4165
4166 return out - buf;
4167 }
4168
4169 static DEVICE_ATTR(bssinfo, S_IRUGO, show_bssinfo, NULL);
4170
4171 #ifdef CONFIG_IPW2100_DEBUG
4172 static ssize_t show_debug_level(struct device_driver *d, char *buf)
4173 {
4174 return sprintf(buf, "0x%08X\n", ipw2100_debug_level);
4175 }
4176
4177 static ssize_t store_debug_level(struct device_driver *d,
4178 const char *buf, size_t count)
4179 {
4180 u32 val;
4181 int ret;
4182
4183 ret = kstrtou32(buf, 0, &val);
4184 if (ret)
4185 IPW_DEBUG_INFO(": %s is not in hex or decimal form.\n", buf);
4186 else
4187 ipw2100_debug_level = val;
4188
4189 return strnlen(buf, count);
4190 }
4191
4192 static DRIVER_ATTR(debug_level, S_IWUSR | S_IRUGO, show_debug_level,
4193 store_debug_level);
4194 #endif /* CONFIG_IPW2100_DEBUG */
4195
4196 static ssize_t show_fatal_error(struct device *d,
4197 struct device_attribute *attr, char *buf)
4198 {
4199 struct ipw2100_priv *priv = dev_get_drvdata(d);
4200 char *out = buf;
4201 int i;
4202
4203 if (priv->fatal_error)
4204 out += sprintf(out, "0x%08X\n", priv->fatal_error);
4205 else
4206 out += sprintf(out, "0\n");
4207
4208 for (i = 1; i <= IPW2100_ERROR_QUEUE; i++) {
4209 if (!priv->fatal_errors[(priv->fatal_index - i) %
4210 IPW2100_ERROR_QUEUE])
4211 continue;
4212
4213 out += sprintf(out, "%d. 0x%08X\n", i,
4214 priv->fatal_errors[(priv->fatal_index - i) %
4215 IPW2100_ERROR_QUEUE]);
4216 }
4217
4218 return out - buf;
4219 }
4220
4221 static ssize_t store_fatal_error(struct device *d,
4222 struct device_attribute *attr, const char *buf,
4223 size_t count)
4224 {
4225 struct ipw2100_priv *priv = dev_get_drvdata(d);
4226 schedule_reset(priv);
4227 return count;
4228 }
4229
4230 static DEVICE_ATTR(fatal_error, S_IWUSR | S_IRUGO, show_fatal_error,
4231 store_fatal_error);
4232
4233 static ssize_t show_scan_age(struct device *d, struct device_attribute *attr,
4234 char *buf)
4235 {
4236 struct ipw2100_priv *priv = dev_get_drvdata(d);
4237 return sprintf(buf, "%d\n", priv->ieee->scan_age);
4238 }
4239
4240 static ssize_t store_scan_age(struct device *d, struct device_attribute *attr,
4241 const char *buf, size_t count)
4242 {
4243 struct ipw2100_priv *priv = dev_get_drvdata(d);
4244 struct net_device *dev = priv->net_dev;
4245 unsigned long val;
4246 int ret;
4247
4248 (void)dev; /* kill unused-var warning for debug-only code */
4249
4250 IPW_DEBUG_INFO("enter\n");
4251
4252 ret = kstrtoul(buf, 0, &val);
4253 if (ret) {
4254 IPW_DEBUG_INFO("%s: user supplied invalid value.\n", dev->name);
4255 } else {
4256 priv->ieee->scan_age = val;
4257 IPW_DEBUG_INFO("set scan_age = %u\n", priv->ieee->scan_age);
4258 }
4259
4260 IPW_DEBUG_INFO("exit\n");
4261 return strnlen(buf, count);
4262 }
4263
4264 static DEVICE_ATTR(scan_age, S_IWUSR | S_IRUGO, show_scan_age, store_scan_age);
4265
4266 static ssize_t show_rf_kill(struct device *d, struct device_attribute *attr,
4267 char *buf)
4268 {
4269 /* 0 - RF kill not enabled
4270 1 - SW based RF kill active (sysfs)
4271 2 - HW based RF kill active
4272 3 - Both HW and SW baed RF kill active */
4273 struct ipw2100_priv *priv = dev_get_drvdata(d);
4274 int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) |
4275 (rf_kill_active(priv) ? 0x2 : 0x0);
4276 return sprintf(buf, "%i\n", val);
4277 }
4278
4279 static int ipw_radio_kill_sw(struct ipw2100_priv *priv, int disable_radio)
4280 {
4281 if ((disable_radio ? 1 : 0) ==
4282 (priv->status & STATUS_RF_KILL_SW ? 1 : 0))
4283 return 0;
4284
4285 IPW_DEBUG_RF_KILL("Manual SW RF Kill set to: RADIO %s\n",
4286 disable_radio ? "OFF" : "ON");
4287
4288 mutex_lock(&priv->action_mutex);
4289
4290 if (disable_radio) {
4291 priv->status |= STATUS_RF_KILL_SW;
4292 ipw2100_down(priv);
4293 } else {
4294 priv->status &= ~STATUS_RF_KILL_SW;
4295 if (rf_kill_active(priv)) {
4296 IPW_DEBUG_RF_KILL("Can not turn radio back on - "
4297 "disabled by HW switch\n");
4298 /* Make sure the RF_KILL check timer is running */
4299 priv->stop_rf_kill = 0;
4300 mod_delayed_work(system_wq, &priv->rf_kill,
4301 round_jiffies_relative(HZ));
4302 } else
4303 schedule_reset(priv);
4304 }
4305
4306 mutex_unlock(&priv->action_mutex);
4307 return 1;
4308 }
4309
4310 static ssize_t store_rf_kill(struct device *d, struct device_attribute *attr,
4311 const char *buf, size_t count)
4312 {
4313 struct ipw2100_priv *priv = dev_get_drvdata(d);
4314 ipw_radio_kill_sw(priv, buf[0] == '1');
4315 return count;
4316 }
4317
4318 static DEVICE_ATTR(rf_kill, S_IWUSR | S_IRUGO, show_rf_kill, store_rf_kill);
4319
4320 static struct attribute *ipw2100_sysfs_entries[] = {
4321 &dev_attr_hardware.attr,
4322 &dev_attr_registers.attr,
4323 &dev_attr_ordinals.attr,
4324 &dev_attr_pci.attr,
4325 &dev_attr_stats.attr,
4326 &dev_attr_internals.attr,
4327 &dev_attr_bssinfo.attr,
4328 &dev_attr_memory.attr,
4329 &dev_attr_scan_age.attr,
4330 &dev_attr_fatal_error.attr,
4331 &dev_attr_rf_kill.attr,
4332 &dev_attr_cfg.attr,
4333 &dev_attr_status.attr,
4334 &dev_attr_capability.attr,
4335 NULL,
4336 };
4337
4338 static struct attribute_group ipw2100_attribute_group = {
4339 .attrs = ipw2100_sysfs_entries,
4340 };
4341
4342 static int status_queue_allocate(struct ipw2100_priv *priv, int entries)
4343 {
4344 struct ipw2100_status_queue *q = &priv->status_queue;
4345
4346 IPW_DEBUG_INFO("enter\n");
4347
4348 q->size = entries * sizeof(struct ipw2100_status);
4349 q->drv =
4350 (struct ipw2100_status *)pci_alloc_consistent(priv->pci_dev,
4351 q->size, &q->nic);
4352 if (!q->drv) {
4353 IPW_DEBUG_WARNING("Can not allocate status queue.\n");
4354 return -ENOMEM;
4355 }
4356
4357 memset(q->drv, 0, q->size);
4358
4359 IPW_DEBUG_INFO("exit\n");
4360
4361 return 0;
4362 }
4363
4364 static void status_queue_free(struct ipw2100_priv *priv)
4365 {
4366 IPW_DEBUG_INFO("enter\n");
4367
4368 if (priv->status_queue.drv) {
4369 pci_free_consistent(priv->pci_dev, priv->status_queue.size,
4370 priv->status_queue.drv,
4371 priv->status_queue.nic);
4372 priv->status_queue.drv = NULL;
4373 }
4374
4375 IPW_DEBUG_INFO("exit\n");
4376 }
4377
4378 static int bd_queue_allocate(struct ipw2100_priv *priv,
4379 struct ipw2100_bd_queue *q, int entries)
4380 {
4381 IPW_DEBUG_INFO("enter\n");
4382
4383 memset(q, 0, sizeof(struct ipw2100_bd_queue));
4384
4385 q->entries = entries;
4386 q->size = entries * sizeof(struct ipw2100_bd);
4387 q->drv = pci_alloc_consistent(priv->pci_dev, q->size, &q->nic);
4388 if (!q->drv) {
4389 IPW_DEBUG_INFO
4390 ("can't allocate shared memory for buffer descriptors\n");
4391 return -ENOMEM;
4392 }
4393 memset(q->drv, 0, q->size);
4394
4395 IPW_DEBUG_INFO("exit\n");
4396
4397 return 0;
4398 }
4399
4400 static void bd_queue_free(struct ipw2100_priv *priv, struct ipw2100_bd_queue *q)
4401 {
4402 IPW_DEBUG_INFO("enter\n");
4403
4404 if (!q)
4405 return;
4406
4407 if (q->drv) {
4408 pci_free_consistent(priv->pci_dev, q->size, q->drv, q->nic);
4409 q->drv = NULL;
4410 }
4411
4412 IPW_DEBUG_INFO("exit\n");
4413 }
4414
4415 static void bd_queue_initialize(struct ipw2100_priv *priv,
4416 struct ipw2100_bd_queue *q, u32 base, u32 size,
4417 u32 r, u32 w)
4418 {
4419 IPW_DEBUG_INFO("enter\n");
4420
4421 IPW_DEBUG_INFO("initializing bd queue at virt=%p, phys=%08x\n", q->drv,
4422 (u32) q->nic);
4423
4424 write_register(priv->net_dev, base, q->nic);
4425 write_register(priv->net_dev, size, q->entries);
4426 write_register(priv->net_dev, r, q->oldest);
4427 write_register(priv->net_dev, w, q->next);
4428
4429 IPW_DEBUG_INFO("exit\n");
4430 }
4431
4432 static void ipw2100_kill_works(struct ipw2100_priv *priv)
4433 {
4434 priv->stop_rf_kill = 1;
4435 priv->stop_hang_check = 1;
4436 cancel_delayed_work_sync(&priv->reset_work);
4437 cancel_delayed_work_sync(&priv->security_work);
4438 cancel_delayed_work_sync(&priv->wx_event_work);
4439 cancel_delayed_work_sync(&priv->hang_check);
4440 cancel_delayed_work_sync(&priv->rf_kill);
4441 cancel_delayed_work_sync(&priv->scan_event);
4442 }
4443
4444 static int ipw2100_tx_allocate(struct ipw2100_priv *priv)
4445 {
4446 int i, j, err = -EINVAL;
4447 void *v;
4448 dma_addr_t p;
4449
4450 IPW_DEBUG_INFO("enter\n");
4451
4452 err = bd_queue_allocate(priv, &priv->tx_queue, TX_QUEUE_LENGTH);
4453 if (err) {
4454 IPW_DEBUG_ERROR("%s: failed bd_queue_allocate\n",
4455 priv->net_dev->name);
4456 return err;
4457 }
4458
4459 priv->tx_buffers = kmalloc_array(TX_PENDED_QUEUE_LENGTH,
4460 sizeof(struct ipw2100_tx_packet),
4461 GFP_ATOMIC);
4462 if (!priv->tx_buffers) {
4463 bd_queue_free(priv, &priv->tx_queue);
4464 return -ENOMEM;
4465 }
4466
4467 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4468 v = pci_alloc_consistent(priv->pci_dev,
4469 sizeof(struct ipw2100_data_header),
4470 &p);
4471 if (!v) {
4472 printk(KERN_ERR DRV_NAME
4473 ": %s: PCI alloc failed for tx " "buffers.\n",
4474 priv->net_dev->name);
4475 err = -ENOMEM;
4476 break;
4477 }
4478
4479 priv->tx_buffers[i].type = DATA;
4480 priv->tx_buffers[i].info.d_struct.data =
4481 (struct ipw2100_data_header *)v;
4482 priv->tx_buffers[i].info.d_struct.data_phys = p;
4483 priv->tx_buffers[i].info.d_struct.txb = NULL;
4484 }
4485
4486 if (i == TX_PENDED_QUEUE_LENGTH)
4487 return 0;
4488
4489 for (j = 0; j < i; j++) {
4490 pci_free_consistent(priv->pci_dev,
4491 sizeof(struct ipw2100_data_header),
4492 priv->tx_buffers[j].info.d_struct.data,
4493 priv->tx_buffers[j].info.d_struct.
4494 data_phys);
4495 }
4496
4497 kfree(priv->tx_buffers);
4498 priv->tx_buffers = NULL;
4499
4500 return err;
4501 }
4502
4503 static void ipw2100_tx_initialize(struct ipw2100_priv *priv)
4504 {
4505 int i;
4506
4507 IPW_DEBUG_INFO("enter\n");
4508
4509 /*
4510 * reinitialize packet info lists
4511 */
4512 INIT_LIST_HEAD(&priv->fw_pend_list);
4513 INIT_STAT(&priv->fw_pend_stat);
4514
4515 /*
4516 * reinitialize lists
4517 */
4518 INIT_LIST_HEAD(&priv->tx_pend_list);
4519 INIT_LIST_HEAD(&priv->tx_free_list);
4520 INIT_STAT(&priv->tx_pend_stat);
4521 INIT_STAT(&priv->tx_free_stat);
4522
4523 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4524 /* We simply drop any SKBs that have been queued for
4525 * transmit */
4526 if (priv->tx_buffers[i].info.d_struct.txb) {
4527 libipw_txb_free(priv->tx_buffers[i].info.d_struct.
4528 txb);
4529 priv->tx_buffers[i].info.d_struct.txb = NULL;
4530 }
4531
4532 list_add_tail(&priv->tx_buffers[i].list, &priv->tx_free_list);
4533 }
4534
4535 SET_STAT(&priv->tx_free_stat, i);
4536
4537 priv->tx_queue.oldest = 0;
4538 priv->tx_queue.available = priv->tx_queue.entries;
4539 priv->tx_queue.next = 0;
4540 INIT_STAT(&priv->txq_stat);
4541 SET_STAT(&priv->txq_stat, priv->tx_queue.available);
4542
4543 bd_queue_initialize(priv, &priv->tx_queue,
4544 IPW_MEM_HOST_SHARED_TX_QUEUE_BD_BASE,
4545 IPW_MEM_HOST_SHARED_TX_QUEUE_BD_SIZE,
4546 IPW_MEM_HOST_SHARED_TX_QUEUE_READ_INDEX,
4547 IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX);
4548
4549 IPW_DEBUG_INFO("exit\n");
4550
4551 }
4552
4553 static void ipw2100_tx_free(struct ipw2100_priv *priv)
4554 {
4555 int i;
4556
4557 IPW_DEBUG_INFO("enter\n");
4558
4559 bd_queue_free(priv, &priv->tx_queue);
4560
4561 if (!priv->tx_buffers)
4562 return;
4563
4564 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4565 if (priv->tx_buffers[i].info.d_struct.txb) {
4566 libipw_txb_free(priv->tx_buffers[i].info.d_struct.
4567 txb);
4568 priv->tx_buffers[i].info.d_struct.txb = NULL;
4569 }
4570 if (priv->tx_buffers[i].info.d_struct.data)
4571 pci_free_consistent(priv->pci_dev,
4572 sizeof(struct ipw2100_data_header),
4573 priv->tx_buffers[i].info.d_struct.
4574 data,
4575 priv->tx_buffers[i].info.d_struct.
4576 data_phys);
4577 }
4578
4579 kfree(priv->tx_buffers);
4580 priv->tx_buffers = NULL;
4581
4582 IPW_DEBUG_INFO("exit\n");
4583 }
4584
4585 static int ipw2100_rx_allocate(struct ipw2100_priv *priv)
4586 {
4587 int i, j, err = -EINVAL;
4588
4589 IPW_DEBUG_INFO("enter\n");
4590
4591 err = bd_queue_allocate(priv, &priv->rx_queue, RX_QUEUE_LENGTH);
4592 if (err) {
4593 IPW_DEBUG_INFO("failed bd_queue_allocate\n");
4594 return err;
4595 }
4596
4597 err = status_queue_allocate(priv, RX_QUEUE_LENGTH);
4598 if (err) {
4599 IPW_DEBUG_INFO("failed status_queue_allocate\n");
4600 bd_queue_free(priv, &priv->rx_queue);
4601 return err;
4602 }
4603
4604 /*
4605 * allocate packets
4606 */
4607 priv->rx_buffers = kmalloc(RX_QUEUE_LENGTH *
4608 sizeof(struct ipw2100_rx_packet),
4609 GFP_KERNEL);
4610 if (!priv->rx_buffers) {
4611 IPW_DEBUG_INFO("can't allocate rx packet buffer table\n");
4612
4613 bd_queue_free(priv, &priv->rx_queue);
4614
4615 status_queue_free(priv);
4616
4617 return -ENOMEM;
4618 }
4619
4620 for (i = 0; i < RX_QUEUE_LENGTH; i++) {
4621 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i];
4622
4623 err = ipw2100_alloc_skb(priv, packet);
4624 if (unlikely(err)) {
4625 err = -ENOMEM;
4626 break;
4627 }
4628
4629 /* The BD holds the cache aligned address */
4630 priv->rx_queue.drv[i].host_addr = packet->dma_addr;
4631 priv->rx_queue.drv[i].buf_length = IPW_RX_NIC_BUFFER_LENGTH;
4632 priv->status_queue.drv[i].status_fields = 0;
4633 }
4634
4635 if (i == RX_QUEUE_LENGTH)
4636 return 0;
4637
4638 for (j = 0; j < i; j++) {
4639 pci_unmap_single(priv->pci_dev, priv->rx_buffers[j].dma_addr,
4640 sizeof(struct ipw2100_rx_packet),
4641 PCI_DMA_FROMDEVICE);
4642 dev_kfree_skb(priv->rx_buffers[j].skb);
4643 }
4644
4645 kfree(priv->rx_buffers);
4646 priv->rx_buffers = NULL;
4647
4648 bd_queue_free(priv, &priv->rx_queue);
4649
4650 status_queue_free(priv);
4651
4652 return err;
4653 }
4654
4655 static void ipw2100_rx_initialize(struct ipw2100_priv *priv)
4656 {
4657 IPW_DEBUG_INFO("enter\n");
4658
4659 priv->rx_queue.oldest = 0;
4660 priv->rx_queue.available = priv->rx_queue.entries - 1;
4661 priv->rx_queue.next = priv->rx_queue.entries - 1;
4662
4663 INIT_STAT(&priv->rxq_stat);
4664 SET_STAT(&priv->rxq_stat, priv->rx_queue.available);
4665
4666 bd_queue_initialize(priv, &priv->rx_queue,
4667 IPW_MEM_HOST_SHARED_RX_BD_BASE,
4668 IPW_MEM_HOST_SHARED_RX_BD_SIZE,
4669 IPW_MEM_HOST_SHARED_RX_READ_INDEX,
4670 IPW_MEM_HOST_SHARED_RX_WRITE_INDEX);
4671
4672 /* set up the status queue */
4673 write_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_STATUS_BASE,
4674 priv->status_queue.nic);
4675
4676 IPW_DEBUG_INFO("exit\n");
4677 }
4678
4679 static void ipw2100_rx_free(struct ipw2100_priv *priv)
4680 {
4681 int i;
4682
4683 IPW_DEBUG_INFO("enter\n");
4684
4685 bd_queue_free(priv, &priv->rx_queue);
4686 status_queue_free(priv);
4687
4688 if (!priv->rx_buffers)
4689 return;
4690
4691 for (i = 0; i < RX_QUEUE_LENGTH; i++) {
4692 if (priv->rx_buffers[i].rxp) {
4693 pci_unmap_single(priv->pci_dev,
4694 priv->rx_buffers[i].dma_addr,
4695 sizeof(struct ipw2100_rx),
4696 PCI_DMA_FROMDEVICE);
4697 dev_kfree_skb(priv->rx_buffers[i].skb);
4698 }
4699 }
4700
4701 kfree(priv->rx_buffers);
4702 priv->rx_buffers = NULL;
4703
4704 IPW_DEBUG_INFO("exit\n");
4705 }
4706
4707 static int ipw2100_read_mac_address(struct ipw2100_priv *priv)
4708 {
4709 u32 length = ETH_ALEN;
4710 u8 addr[ETH_ALEN];
4711
4712 int err;
4713
4714 err = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ADAPTER_MAC, addr, &length);
4715 if (err) {
4716 IPW_DEBUG_INFO("MAC address read failed\n");
4717 return -EIO;
4718 }
4719
4720 memcpy(priv->net_dev->dev_addr, addr, ETH_ALEN);
4721 IPW_DEBUG_INFO("card MAC is %pM\n", priv->net_dev->dev_addr);
4722
4723 return 0;
4724 }
4725
4726 /********************************************************************
4727 *
4728 * Firmware Commands
4729 *
4730 ********************************************************************/
4731
4732 static int ipw2100_set_mac_address(struct ipw2100_priv *priv, int batch_mode)
4733 {
4734 struct host_command cmd = {
4735 .host_command = ADAPTER_ADDRESS,
4736 .host_command_sequence = 0,
4737 .host_command_length = ETH_ALEN
4738 };
4739 int err;
4740
4741 IPW_DEBUG_HC("SET_MAC_ADDRESS\n");
4742
4743 IPW_DEBUG_INFO("enter\n");
4744
4745 if (priv->config & CFG_CUSTOM_MAC) {
4746 memcpy(cmd.host_command_parameters, priv->mac_addr, ETH_ALEN);
4747 memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN);
4748 } else
4749 memcpy(cmd.host_command_parameters, priv->net_dev->dev_addr,
4750 ETH_ALEN);
4751
4752 err = ipw2100_hw_send_command(priv, &cmd);
4753
4754 IPW_DEBUG_INFO("exit\n");
4755 return err;
4756 }
4757
4758 static int ipw2100_set_port_type(struct ipw2100_priv *priv, u32 port_type,
4759 int batch_mode)
4760 {
4761 struct host_command cmd = {
4762 .host_command = PORT_TYPE,
4763 .host_command_sequence = 0,
4764 .host_command_length = sizeof(u32)
4765 };
4766 int err;
4767
4768 switch (port_type) {
4769 case IW_MODE_INFRA:
4770 cmd.host_command_parameters[0] = IPW_BSS;
4771 break;
4772 case IW_MODE_ADHOC:
4773 cmd.host_command_parameters[0] = IPW_IBSS;
4774 break;
4775 }
4776
4777 IPW_DEBUG_HC("PORT_TYPE: %s\n",
4778 port_type == IPW_IBSS ? "Ad-Hoc" : "Managed");
4779
4780 if (!batch_mode) {
4781 err = ipw2100_disable_adapter(priv);
4782 if (err) {
4783 printk(KERN_ERR DRV_NAME
4784 ": %s: Could not disable adapter %d\n",
4785 priv->net_dev->name, err);
4786 return err;
4787 }
4788 }
4789
4790 /* send cmd to firmware */
4791 err = ipw2100_hw_send_command(priv, &cmd);
4792
4793 if (!batch_mode)
4794 ipw2100_enable_adapter(priv);
4795
4796 return err;
4797 }
4798
4799 static int ipw2100_set_channel(struct ipw2100_priv *priv, u32 channel,
4800 int batch_mode)
4801 {
4802 struct host_command cmd = {
4803 .host_command = CHANNEL,
4804 .host_command_sequence = 0,
4805 .host_command_length = sizeof(u32)
4806 };
4807 int err;
4808
4809 cmd.host_command_parameters[0] = channel;
4810
4811 IPW_DEBUG_HC("CHANNEL: %d\n", channel);
4812
4813 /* If BSS then we don't support channel selection */
4814 if (priv->ieee->iw_mode == IW_MODE_INFRA)
4815 return 0;
4816
4817 if ((channel != 0) &&
4818 ((channel < REG_MIN_CHANNEL) || (channel > REG_MAX_CHANNEL)))
4819 return -EINVAL;
4820
4821 if (!batch_mode) {
4822 err = ipw2100_disable_adapter(priv);
4823 if (err)
4824 return err;
4825 }
4826
4827 err = ipw2100_hw_send_command(priv, &cmd);
4828 if (err) {
4829 IPW_DEBUG_INFO("Failed to set channel to %d", channel);
4830 return err;
4831 }
4832
4833 if (channel)
4834 priv->config |= CFG_STATIC_CHANNEL;
4835 else
4836 priv->config &= ~CFG_STATIC_CHANNEL;
4837
4838 priv->channel = channel;
4839
4840 if (!batch_mode) {
4841 err = ipw2100_enable_adapter(priv);
4842 if (err)
4843 return err;
4844 }
4845
4846 return 0;
4847 }
4848
4849 static int ipw2100_system_config(struct ipw2100_priv *priv, int batch_mode)
4850 {
4851 struct host_command cmd = {
4852 .host_command = SYSTEM_CONFIG,
4853 .host_command_sequence = 0,
4854 .host_command_length = 12,
4855 };
4856 u32 ibss_mask, len = sizeof(u32);
4857 int err;
4858
4859 /* Set system configuration */
4860
4861 if (!batch_mode) {
4862 err = ipw2100_disable_adapter(priv);
4863 if (err)
4864 return err;
4865 }
4866
4867 if (priv->ieee->iw_mode == IW_MODE_ADHOC)
4868 cmd.host_command_parameters[0] |= IPW_CFG_IBSS_AUTO_START;
4869
4870 cmd.host_command_parameters[0] |= IPW_CFG_IBSS_MASK |
4871 IPW_CFG_BSS_MASK | IPW_CFG_802_1x_ENABLE;
4872
4873 if (!(priv->config & CFG_LONG_PREAMBLE))
4874 cmd.host_command_parameters[0] |= IPW_CFG_PREAMBLE_AUTO;
4875
4876 err = ipw2100_get_ordinal(priv,
4877 IPW_ORD_EEPROM_IBSS_11B_CHANNELS,
4878 &ibss_mask, &len);
4879 if (err)
4880 ibss_mask = IPW_IBSS_11B_DEFAULT_MASK;
4881
4882 cmd.host_command_parameters[1] = REG_CHANNEL_MASK;
4883 cmd.host_command_parameters[2] = REG_CHANNEL_MASK & ibss_mask;
4884
4885 /* 11b only */
4886 /*cmd.host_command_parameters[0] |= DIVERSITY_ANTENNA_A; */
4887
4888 err = ipw2100_hw_send_command(priv, &cmd);
4889 if (err)
4890 return err;
4891
4892 /* If IPv6 is configured in the kernel then we don't want to filter out all
4893 * of the multicast packets as IPv6 needs some. */
4894 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
4895 cmd.host_command = ADD_MULTICAST;
4896 cmd.host_command_sequence = 0;
4897 cmd.host_command_length = 0;
4898
4899 ipw2100_hw_send_command(priv, &cmd);
4900 #endif
4901 if (!batch_mode) {
4902 err = ipw2100_enable_adapter(priv);
4903 if (err)
4904 return err;
4905 }
4906
4907 return 0;
4908 }
4909
4910 static int ipw2100_set_tx_rates(struct ipw2100_priv *priv, u32 rate,
4911 int batch_mode)
4912 {
4913 struct host_command cmd = {
4914 .host_command = BASIC_TX_RATES,
4915 .host_command_sequence = 0,
4916 .host_command_length = 4
4917 };
4918 int err;
4919
4920 cmd.host_command_parameters[0] = rate & TX_RATE_MASK;
4921
4922 if (!batch_mode) {
4923 err = ipw2100_disable_adapter(priv);
4924 if (err)
4925 return err;
4926 }
4927
4928 /* Set BASIC TX Rate first */
4929 ipw2100_hw_send_command(priv, &cmd);
4930
4931 /* Set TX Rate */
4932 cmd.host_command = TX_RATES;
4933 ipw2100_hw_send_command(priv, &cmd);
4934
4935 /* Set MSDU TX Rate */
4936 cmd.host_command = MSDU_TX_RATES;
4937 ipw2100_hw_send_command(priv, &cmd);
4938
4939 if (!batch_mode) {
4940 err = ipw2100_enable_adapter(priv);
4941 if (err)
4942 return err;
4943 }
4944
4945 priv->tx_rates = rate;
4946
4947 return 0;
4948 }
4949
4950 static int ipw2100_set_power_mode(struct ipw2100_priv *priv, int power_level)
4951 {
4952 struct host_command cmd = {
4953 .host_command = POWER_MODE,
4954 .host_command_sequence = 0,
4955 .host_command_length = 4
4956 };
4957 int err;
4958
4959 cmd.host_command_parameters[0] = power_level;
4960
4961 err = ipw2100_hw_send_command(priv, &cmd);
4962 if (err)
4963 return err;
4964
4965 if (power_level == IPW_POWER_MODE_CAM)
4966 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode);
4967 else
4968 priv->power_mode = IPW_POWER_ENABLED | power_level;
4969
4970 #ifdef IPW2100_TX_POWER
4971 if (priv->port_type == IBSS && priv->adhoc_power != DFTL_IBSS_TX_POWER) {
4972 /* Set beacon interval */
4973 cmd.host_command = TX_POWER_INDEX;
4974 cmd.host_command_parameters[0] = (u32) priv->adhoc_power;
4975
4976 err = ipw2100_hw_send_command(priv, &cmd);
4977 if (err)
4978 return err;
4979 }
4980 #endif
4981
4982 return 0;
4983 }
4984
4985 static int ipw2100_set_rts_threshold(struct ipw2100_priv *priv, u32 threshold)
4986 {
4987 struct host_command cmd = {
4988 .host_command = RTS_THRESHOLD,
4989 .host_command_sequence = 0,
4990 .host_command_length = 4
4991 };
4992 int err;
4993
4994 if (threshold & RTS_DISABLED)
4995 cmd.host_command_parameters[0] = MAX_RTS_THRESHOLD;
4996 else
4997 cmd.host_command_parameters[0] = threshold & ~RTS_DISABLED;
4998
4999 err = ipw2100_hw_send_command(priv, &cmd);
5000 if (err)
5001 return err;
5002
5003 priv->rts_threshold = threshold;
5004
5005 return 0;
5006 }
5007
5008 #if 0
5009 int ipw2100_set_fragmentation_threshold(struct ipw2100_priv *priv,
5010 u32 threshold, int batch_mode)
5011 {
5012 struct host_command cmd = {
5013 .host_command = FRAG_THRESHOLD,
5014 .host_command_sequence = 0,
5015 .host_command_length = 4,
5016 .host_command_parameters[0] = 0,
5017 };
5018 int err;
5019
5020 if (!batch_mode) {
5021 err = ipw2100_disable_adapter(priv);
5022 if (err)
5023 return err;
5024 }
5025
5026 if (threshold == 0)
5027 threshold = DEFAULT_FRAG_THRESHOLD;
5028 else {
5029 threshold = max(threshold, MIN_FRAG_THRESHOLD);
5030 threshold = min(threshold, MAX_FRAG_THRESHOLD);
5031 }
5032
5033 cmd.host_command_parameters[0] = threshold;
5034
5035 IPW_DEBUG_HC("FRAG_THRESHOLD: %u\n", threshold);
5036
5037 err = ipw2100_hw_send_command(priv, &cmd);
5038
5039 if (!batch_mode)
5040 ipw2100_enable_adapter(priv);
5041
5042 if (!err)
5043 priv->frag_threshold = threshold;
5044
5045 return err;
5046 }
5047 #endif
5048
5049 static int ipw2100_set_short_retry(struct ipw2100_priv *priv, u32 retry)
5050 {
5051 struct host_command cmd = {
5052 .host_command = SHORT_RETRY_LIMIT,
5053 .host_command_sequence = 0,
5054 .host_command_length = 4
5055 };
5056 int err;
5057
5058 cmd.host_command_parameters[0] = retry;
5059
5060 err = ipw2100_hw_send_command(priv, &cmd);
5061 if (err)
5062 return err;
5063
5064 priv->short_retry_limit = retry;
5065
5066 return 0;
5067 }
5068
5069 static int ipw2100_set_long_retry(struct ipw2100_priv *priv, u32 retry)
5070 {
5071 struct host_command cmd = {
5072 .host_command = LONG_RETRY_LIMIT,
5073 .host_command_sequence = 0,
5074 .host_command_length = 4
5075 };
5076 int err;
5077
5078 cmd.host_command_parameters[0] = retry;
5079
5080 err = ipw2100_hw_send_command(priv, &cmd);
5081 if (err)
5082 return err;
5083
5084 priv->long_retry_limit = retry;
5085
5086 return 0;
5087 }
5088
5089 static int ipw2100_set_mandatory_bssid(struct ipw2100_priv *priv, u8 * bssid,
5090 int batch_mode)
5091 {
5092 struct host_command cmd = {
5093 .host_command = MANDATORY_BSSID,
5094 .host_command_sequence = 0,
5095 .host_command_length = (bssid == NULL) ? 0 : ETH_ALEN
5096 };
5097 int err;
5098
5099 #ifdef CONFIG_IPW2100_DEBUG
5100 if (bssid != NULL)
5101 IPW_DEBUG_HC("MANDATORY_BSSID: %pM\n", bssid);
5102 else
5103 IPW_DEBUG_HC("MANDATORY_BSSID: <clear>\n");
5104 #endif
5105 /* if BSSID is empty then we disable mandatory bssid mode */
5106 if (bssid != NULL)
5107 memcpy(cmd.host_command_parameters, bssid, ETH_ALEN);
5108
5109 if (!batch_mode) {
5110 err = ipw2100_disable_adapter(priv);
5111 if (err)
5112 return err;
5113 }
5114
5115 err = ipw2100_hw_send_command(priv, &cmd);
5116
5117 if (!batch_mode)
5118 ipw2100_enable_adapter(priv);
5119
5120 return err;
5121 }
5122
5123 static int ipw2100_disassociate_bssid(struct ipw2100_priv *priv)
5124 {
5125 struct host_command cmd = {
5126 .host_command = DISASSOCIATION_BSSID,
5127 .host_command_sequence = 0,
5128 .host_command_length = ETH_ALEN
5129 };
5130 int err;
5131 int len;
5132
5133 IPW_DEBUG_HC("DISASSOCIATION_BSSID\n");
5134
5135 len = ETH_ALEN;
5136 /* The Firmware currently ignores the BSSID and just disassociates from
5137 * the currently associated AP -- but in the off chance that a future
5138 * firmware does use the BSSID provided here, we go ahead and try and
5139 * set it to the currently associated AP's BSSID */
5140 memcpy(cmd.host_command_parameters, priv->bssid, ETH_ALEN);
5141
5142 err = ipw2100_hw_send_command(priv, &cmd);
5143
5144 return err;
5145 }
5146
5147 static int ipw2100_set_wpa_ie(struct ipw2100_priv *,
5148 struct ipw2100_wpa_assoc_frame *, int)
5149 __attribute__ ((unused));
5150
5151 static int ipw2100_set_wpa_ie(struct ipw2100_priv *priv,
5152 struct ipw2100_wpa_assoc_frame *wpa_frame,
5153 int batch_mode)
5154 {
5155 struct host_command cmd = {
5156 .host_command = SET_WPA_IE,
5157 .host_command_sequence = 0,
5158 .host_command_length = sizeof(struct ipw2100_wpa_assoc_frame),
5159 };
5160 int err;
5161
5162 IPW_DEBUG_HC("SET_WPA_IE\n");
5163
5164 if (!batch_mode) {
5165 err = ipw2100_disable_adapter(priv);
5166 if (err)
5167 return err;
5168 }
5169
5170 memcpy(cmd.host_command_parameters, wpa_frame,
5171 sizeof(struct ipw2100_wpa_assoc_frame));
5172
5173 err = ipw2100_hw_send_command(priv, &cmd);
5174
5175 if (!batch_mode) {
5176 if (ipw2100_enable_adapter(priv))
5177 err = -EIO;
5178 }
5179
5180 return err;
5181 }
5182
5183 struct security_info_params {
5184 u32 allowed_ciphers;
5185 u16 version;
5186 u8 auth_mode;
5187 u8 replay_counters_number;
5188 u8 unicast_using_group;
5189 } __packed;
5190
5191 static int ipw2100_set_security_information(struct ipw2100_priv *priv,
5192 int auth_mode,
5193 int security_level,
5194 int unicast_using_group,
5195 int batch_mode)
5196 {
5197 struct host_command cmd = {
5198 .host_command = SET_SECURITY_INFORMATION,
5199 .host_command_sequence = 0,
5200 .host_command_length = sizeof(struct security_info_params)
5201 };
5202 struct security_info_params *security =
5203 (struct security_info_params *)&cmd.host_command_parameters;
5204 int err;
5205 memset(security, 0, sizeof(*security));
5206
5207 /* If shared key AP authentication is turned on, then we need to
5208 * configure the firmware to try and use it.
5209 *
5210 * Actual data encryption/decryption is handled by the host. */
5211 security->auth_mode = auth_mode;
5212 security->unicast_using_group = unicast_using_group;
5213
5214 switch (security_level) {
5215 default:
5216 case SEC_LEVEL_0:
5217 security->allowed_ciphers = IPW_NONE_CIPHER;
5218 break;
5219 case SEC_LEVEL_1:
5220 security->allowed_ciphers = IPW_WEP40_CIPHER |
5221 IPW_WEP104_CIPHER;
5222 break;
5223 case SEC_LEVEL_2:
5224 security->allowed_ciphers = IPW_WEP40_CIPHER |
5225 IPW_WEP104_CIPHER | IPW_TKIP_CIPHER;
5226 break;
5227 case SEC_LEVEL_2_CKIP:
5228 security->allowed_ciphers = IPW_WEP40_CIPHER |
5229 IPW_WEP104_CIPHER | IPW_CKIP_CIPHER;
5230 break;
5231 case SEC_LEVEL_3:
5232 security->allowed_ciphers = IPW_WEP40_CIPHER |
5233 IPW_WEP104_CIPHER | IPW_TKIP_CIPHER | IPW_CCMP_CIPHER;
5234 break;
5235 }
5236
5237 IPW_DEBUG_HC
5238 ("SET_SECURITY_INFORMATION: auth:%d cipher:0x%02X (level %d)\n",
5239 security->auth_mode, security->allowed_ciphers, security_level);
5240
5241 security->replay_counters_number = 0;
5242
5243 if (!batch_mode) {
5244 err = ipw2100_disable_adapter(priv);
5245 if (err)
5246 return err;
5247 }
5248
5249 err = ipw2100_hw_send_command(priv, &cmd);
5250
5251 if (!batch_mode)
5252 ipw2100_enable_adapter(priv);
5253
5254 return err;
5255 }
5256
5257 static int ipw2100_set_tx_power(struct ipw2100_priv *priv, u32 tx_power)
5258 {
5259 struct host_command cmd = {
5260 .host_command = TX_POWER_INDEX,
5261 .host_command_sequence = 0,
5262 .host_command_length = 4
5263 };
5264 int err = 0;
5265 u32 tmp = tx_power;
5266
5267 if (tx_power != IPW_TX_POWER_DEFAULT)
5268 tmp = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 /
5269 (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM);
5270
5271 cmd.host_command_parameters[0] = tmp;
5272
5273 if (priv->ieee->iw_mode == IW_MODE_ADHOC)
5274 err = ipw2100_hw_send_command(priv, &cmd);
5275 if (!err)
5276 priv->tx_power = tx_power;
5277
5278 return 0;
5279 }
5280
5281 static int ipw2100_set_ibss_beacon_interval(struct ipw2100_priv *priv,
5282 u32 interval, int batch_mode)
5283 {
5284 struct host_command cmd = {
5285 .host_command = BEACON_INTERVAL,
5286 .host_command_sequence = 0,
5287 .host_command_length = 4
5288 };
5289 int err;
5290
5291 cmd.host_command_parameters[0] = interval;
5292
5293 IPW_DEBUG_INFO("enter\n");
5294
5295 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5296 if (!batch_mode) {
5297 err = ipw2100_disable_adapter(priv);
5298 if (err)
5299 return err;
5300 }
5301
5302 ipw2100_hw_send_command(priv, &cmd);
5303
5304 if (!batch_mode) {
5305 err = ipw2100_enable_adapter(priv);
5306 if (err)
5307 return err;
5308 }
5309 }
5310
5311 IPW_DEBUG_INFO("exit\n");
5312
5313 return 0;
5314 }
5315
5316 static void ipw2100_queues_initialize(struct ipw2100_priv *priv)
5317 {
5318 ipw2100_tx_initialize(priv);
5319 ipw2100_rx_initialize(priv);
5320 ipw2100_msg_initialize(priv);
5321 }
5322
5323 static void ipw2100_queues_free(struct ipw2100_priv *priv)
5324 {
5325 ipw2100_tx_free(priv);
5326 ipw2100_rx_free(priv);
5327 ipw2100_msg_free(priv);
5328 }
5329
5330 static int ipw2100_queues_allocate(struct ipw2100_priv *priv)
5331 {
5332 if (ipw2100_tx_allocate(priv) ||
5333 ipw2100_rx_allocate(priv) || ipw2100_msg_allocate(priv))
5334 goto fail;
5335
5336 return 0;
5337
5338 fail:
5339 ipw2100_tx_free(priv);
5340 ipw2100_rx_free(priv);
5341 ipw2100_msg_free(priv);
5342 return -ENOMEM;
5343 }
5344
5345 #define IPW_PRIVACY_CAPABLE 0x0008
5346
5347 static int ipw2100_set_wep_flags(struct ipw2100_priv *priv, u32 flags,
5348 int batch_mode)
5349 {
5350 struct host_command cmd = {
5351 .host_command = WEP_FLAGS,
5352 .host_command_sequence = 0,
5353 .host_command_length = 4
5354 };
5355 int err;
5356
5357 cmd.host_command_parameters[0] = flags;
5358
5359 IPW_DEBUG_HC("WEP_FLAGS: flags = 0x%08X\n", flags);
5360
5361 if (!batch_mode) {
5362 err = ipw2100_disable_adapter(priv);
5363 if (err) {
5364 printk(KERN_ERR DRV_NAME
5365 ": %s: Could not disable adapter %d\n",
5366 priv->net_dev->name, err);
5367 return err;
5368 }
5369 }
5370
5371 /* send cmd to firmware */
5372 err = ipw2100_hw_send_command(priv, &cmd);
5373
5374 if (!batch_mode)
5375 ipw2100_enable_adapter(priv);
5376
5377 return err;
5378 }
5379
5380 struct ipw2100_wep_key {
5381 u8 idx;
5382 u8 len;
5383 u8 key[13];
5384 };
5385
5386 /* Macros to ease up priting WEP keys */
5387 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
5388 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
5389 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
5390 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
5391
5392 /**
5393 * Set a the wep key
5394 *
5395 * @priv: struct to work on
5396 * @idx: index of the key we want to set
5397 * @key: ptr to the key data to set
5398 * @len: length of the buffer at @key
5399 * @batch_mode: FIXME perform the operation in batch mode, not
5400 * disabling the device.
5401 *
5402 * @returns 0 if OK, < 0 errno code on error.
5403 *
5404 * Fill out a command structure with the new wep key, length an
5405 * index and send it down the wire.
5406 */
5407 static int ipw2100_set_key(struct ipw2100_priv *priv,
5408 int idx, char *key, int len, int batch_mode)
5409 {
5410 int keylen = len ? (len <= 5 ? 5 : 13) : 0;
5411 struct host_command cmd = {
5412 .host_command = WEP_KEY_INFO,
5413 .host_command_sequence = 0,
5414 .host_command_length = sizeof(struct ipw2100_wep_key),
5415 };
5416 struct ipw2100_wep_key *wep_key = (void *)cmd.host_command_parameters;
5417 int err;
5418
5419 IPW_DEBUG_HC("WEP_KEY_INFO: index = %d, len = %d/%d\n",
5420 idx, keylen, len);
5421
5422 /* NOTE: We don't check cached values in case the firmware was reset
5423 * or some other problem is occurring. If the user is setting the key,
5424 * then we push the change */
5425
5426 wep_key->idx = idx;
5427 wep_key->len = keylen;
5428
5429 if (keylen) {
5430 memcpy(wep_key->key, key, len);
5431 memset(wep_key->key + len, 0, keylen - len);
5432 }
5433
5434 /* Will be optimized out on debug not being configured in */
5435 if (keylen == 0)
5436 IPW_DEBUG_WEP("%s: Clearing key %d\n",
5437 priv->net_dev->name, wep_key->idx);
5438 else if (keylen == 5)
5439 IPW_DEBUG_WEP("%s: idx: %d, len: %d key: " WEP_FMT_64 "\n",
5440 priv->net_dev->name, wep_key->idx, wep_key->len,
5441 WEP_STR_64(wep_key->key));
5442 else
5443 IPW_DEBUG_WEP("%s: idx: %d, len: %d key: " WEP_FMT_128
5444 "\n",
5445 priv->net_dev->name, wep_key->idx, wep_key->len,
5446 WEP_STR_128(wep_key->key));
5447
5448 if (!batch_mode) {
5449 err = ipw2100_disable_adapter(priv);
5450 /* FIXME: IPG: shouldn't this prink be in _disable_adapter()? */
5451 if (err) {
5452 printk(KERN_ERR DRV_NAME
5453 ": %s: Could not disable adapter %d\n",
5454 priv->net_dev->name, err);
5455 return err;
5456 }
5457 }
5458
5459 /* send cmd to firmware */
5460 err = ipw2100_hw_send_command(priv, &cmd);
5461
5462 if (!batch_mode) {
5463 int err2 = ipw2100_enable_adapter(priv);
5464 if (err == 0)
5465 err = err2;
5466 }
5467 return err;
5468 }
5469
5470 static int ipw2100_set_key_index(struct ipw2100_priv *priv,
5471 int idx, int batch_mode)
5472 {
5473 struct host_command cmd = {
5474 .host_command = WEP_KEY_INDEX,
5475 .host_command_sequence = 0,
5476 .host_command_length = 4,
5477 .host_command_parameters = {idx},
5478 };
5479 int err;
5480
5481 IPW_DEBUG_HC("WEP_KEY_INDEX: index = %d\n", idx);
5482
5483 if (idx < 0 || idx > 3)
5484 return -EINVAL;
5485
5486 if (!batch_mode) {
5487 err = ipw2100_disable_adapter(priv);
5488 if (err) {
5489 printk(KERN_ERR DRV_NAME
5490 ": %s: Could not disable adapter %d\n",
5491 priv->net_dev->name, err);
5492 return err;
5493 }
5494 }
5495
5496 /* send cmd to firmware */
5497 err = ipw2100_hw_send_command(priv, &cmd);
5498
5499 if (!batch_mode)
5500 ipw2100_enable_adapter(priv);
5501
5502 return err;
5503 }
5504
5505 static int ipw2100_configure_security(struct ipw2100_priv *priv, int batch_mode)
5506 {
5507 int i, err, auth_mode, sec_level, use_group;
5508
5509 if (!(priv->status & STATUS_RUNNING))
5510 return 0;
5511
5512 if (!batch_mode) {
5513 err = ipw2100_disable_adapter(priv);
5514 if (err)
5515 return err;
5516 }
5517
5518 if (!priv->ieee->sec.enabled) {
5519 err =
5520 ipw2100_set_security_information(priv, IPW_AUTH_OPEN,
5521 SEC_LEVEL_0, 0, 1);
5522 } else {
5523 auth_mode = IPW_AUTH_OPEN;
5524 if (priv->ieee->sec.flags & SEC_AUTH_MODE) {
5525 if (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY)
5526 auth_mode = IPW_AUTH_SHARED;
5527 else if (priv->ieee->sec.auth_mode == WLAN_AUTH_LEAP)
5528 auth_mode = IPW_AUTH_LEAP_CISCO_ID;
5529 }
5530
5531 sec_level = SEC_LEVEL_0;
5532 if (priv->ieee->sec.flags & SEC_LEVEL)
5533 sec_level = priv->ieee->sec.level;
5534
5535 use_group = 0;
5536 if (priv->ieee->sec.flags & SEC_UNICAST_GROUP)
5537 use_group = priv->ieee->sec.unicast_uses_group;
5538
5539 err =
5540 ipw2100_set_security_information(priv, auth_mode, sec_level,
5541 use_group, 1);
5542 }
5543
5544 if (err)
5545 goto exit;
5546
5547 if (priv->ieee->sec.enabled) {
5548 for (i = 0; i < 4; i++) {
5549 if (!(priv->ieee->sec.flags & (1 << i))) {
5550 memset(priv->ieee->sec.keys[i], 0, WEP_KEY_LEN);
5551 priv->ieee->sec.key_sizes[i] = 0;
5552 } else {
5553 err = ipw2100_set_key(priv, i,
5554 priv->ieee->sec.keys[i],
5555 priv->ieee->sec.
5556 key_sizes[i], 1);
5557 if (err)
5558 goto exit;
5559 }
5560 }
5561
5562 ipw2100_set_key_index(priv, priv->ieee->crypt_info.tx_keyidx, 1);
5563 }
5564
5565 /* Always enable privacy so the Host can filter WEP packets if
5566 * encrypted data is sent up */
5567 err =
5568 ipw2100_set_wep_flags(priv,
5569 priv->ieee->sec.
5570 enabled ? IPW_PRIVACY_CAPABLE : 0, 1);
5571 if (err)
5572 goto exit;
5573
5574 priv->status &= ~STATUS_SECURITY_UPDATED;
5575
5576 exit:
5577 if (!batch_mode)
5578 ipw2100_enable_adapter(priv);
5579
5580 return err;
5581 }
5582
5583 static void ipw2100_security_work(struct work_struct *work)
5584 {
5585 struct ipw2100_priv *priv =
5586 container_of(work, struct ipw2100_priv, security_work.work);
5587
5588 /* If we happen to have reconnected before we get a chance to
5589 * process this, then update the security settings--which causes
5590 * a disassociation to occur */
5591 if (!(priv->status & STATUS_ASSOCIATED) &&
5592 priv->status & STATUS_SECURITY_UPDATED)
5593 ipw2100_configure_security(priv, 0);
5594 }
5595
5596 static void shim__set_security(struct net_device *dev,
5597 struct libipw_security *sec)
5598 {
5599 struct ipw2100_priv *priv = libipw_priv(dev);
5600 int i, force_update = 0;
5601
5602 mutex_lock(&priv->action_mutex);
5603 if (!(priv->status & STATUS_INITIALIZED))
5604 goto done;
5605
5606 for (i = 0; i < 4; i++) {
5607 if (sec->flags & (1 << i)) {
5608 priv->ieee->sec.key_sizes[i] = sec->key_sizes[i];
5609 if (sec->key_sizes[i] == 0)
5610 priv->ieee->sec.flags &= ~(1 << i);
5611 else
5612 memcpy(priv->ieee->sec.keys[i], sec->keys[i],
5613 sec->key_sizes[i]);
5614 if (sec->level == SEC_LEVEL_1) {
5615 priv->ieee->sec.flags |= (1 << i);
5616 priv->status |= STATUS_SECURITY_UPDATED;
5617 } else
5618 priv->ieee->sec.flags &= ~(1 << i);
5619 }
5620 }
5621
5622 if ((sec->flags & SEC_ACTIVE_KEY) &&
5623 priv->ieee->sec.active_key != sec->active_key) {
5624 if (sec->active_key <= 3) {
5625 priv->ieee->sec.active_key = sec->active_key;
5626 priv->ieee->sec.flags |= SEC_ACTIVE_KEY;
5627 } else
5628 priv->ieee->sec.flags &= ~SEC_ACTIVE_KEY;
5629
5630 priv->status |= STATUS_SECURITY_UPDATED;
5631 }
5632
5633 if ((sec->flags & SEC_AUTH_MODE) &&
5634 (priv->ieee->sec.auth_mode != sec->auth_mode)) {
5635 priv->ieee->sec.auth_mode = sec->auth_mode;
5636 priv->ieee->sec.flags |= SEC_AUTH_MODE;
5637 priv->status |= STATUS_SECURITY_UPDATED;
5638 }
5639
5640 if (sec->flags & SEC_ENABLED && priv->ieee->sec.enabled != sec->enabled) {
5641 priv->ieee->sec.flags |= SEC_ENABLED;
5642 priv->ieee->sec.enabled = sec->enabled;
5643 priv->status |= STATUS_SECURITY_UPDATED;
5644 force_update = 1;
5645 }
5646
5647 if (sec->flags & SEC_ENCRYPT)
5648 priv->ieee->sec.encrypt = sec->encrypt;
5649
5650 if (sec->flags & SEC_LEVEL && priv->ieee->sec.level != sec->level) {
5651 priv->ieee->sec.level = sec->level;
5652 priv->ieee->sec.flags |= SEC_LEVEL;
5653 priv->status |= STATUS_SECURITY_UPDATED;
5654 }
5655
5656 IPW_DEBUG_WEP("Security flags: %c %c%c%c%c %c%c%c%c\n",
5657 priv->ieee->sec.flags & (1 << 8) ? '1' : '0',
5658 priv->ieee->sec.flags & (1 << 7) ? '1' : '0',
5659 priv->ieee->sec.flags & (1 << 6) ? '1' : '0',
5660 priv->ieee->sec.flags & (1 << 5) ? '1' : '0',
5661 priv->ieee->sec.flags & (1 << 4) ? '1' : '0',
5662 priv->ieee->sec.flags & (1 << 3) ? '1' : '0',
5663 priv->ieee->sec.flags & (1 << 2) ? '1' : '0',
5664 priv->ieee->sec.flags & (1 << 1) ? '1' : '0',
5665 priv->ieee->sec.flags & (1 << 0) ? '1' : '0');
5666
5667 /* As a temporary work around to enable WPA until we figure out why
5668 * wpa_supplicant toggles the security capability of the driver, which
5669 * forces a disassocation with force_update...
5670 *
5671 * if (force_update || !(priv->status & STATUS_ASSOCIATED))*/
5672 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)))
5673 ipw2100_configure_security(priv, 0);
5674 done:
5675 mutex_unlock(&priv->action_mutex);
5676 }
5677
5678 static int ipw2100_adapter_setup(struct ipw2100_priv *priv)
5679 {
5680 int err;
5681 int batch_mode = 1;
5682 u8 *bssid;
5683
5684 IPW_DEBUG_INFO("enter\n");
5685
5686 err = ipw2100_disable_adapter(priv);
5687 if (err)
5688 return err;
5689 #ifdef CONFIG_IPW2100_MONITOR
5690 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
5691 err = ipw2100_set_channel(priv, priv->channel, batch_mode);
5692 if (err)
5693 return err;
5694
5695 IPW_DEBUG_INFO("exit\n");
5696
5697 return 0;
5698 }
5699 #endif /* CONFIG_IPW2100_MONITOR */
5700
5701 err = ipw2100_read_mac_address(priv);
5702 if (err)
5703 return -EIO;
5704
5705 err = ipw2100_set_mac_address(priv, batch_mode);
5706 if (err)
5707 return err;
5708
5709 err = ipw2100_set_port_type(priv, priv->ieee->iw_mode, batch_mode);
5710 if (err)
5711 return err;
5712
5713 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5714 err = ipw2100_set_channel(priv, priv->channel, batch_mode);
5715 if (err)
5716 return err;
5717 }
5718
5719 err = ipw2100_system_config(priv, batch_mode);
5720 if (err)
5721 return err;
5722
5723 err = ipw2100_set_tx_rates(priv, priv->tx_rates, batch_mode);
5724 if (err)
5725 return err;
5726
5727 /* Default to power mode OFF */
5728 err = ipw2100_set_power_mode(priv, IPW_POWER_MODE_CAM);
5729 if (err)
5730 return err;
5731
5732 err = ipw2100_set_rts_threshold(priv, priv->rts_threshold);
5733 if (err)
5734 return err;
5735
5736 if (priv->config & CFG_STATIC_BSSID)
5737 bssid = priv->bssid;
5738 else
5739 bssid = NULL;
5740 err = ipw2100_set_mandatory_bssid(priv, bssid, batch_mode);
5741 if (err)
5742 return err;
5743
5744 if (priv->config & CFG_STATIC_ESSID)
5745 err = ipw2100_set_essid(priv, priv->essid, priv->essid_len,
5746 batch_mode);
5747 else
5748 err = ipw2100_set_essid(priv, NULL, 0, batch_mode);
5749 if (err)
5750 return err;
5751
5752 err = ipw2100_configure_security(priv, batch_mode);
5753 if (err)
5754 return err;
5755
5756 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5757 err =
5758 ipw2100_set_ibss_beacon_interval(priv,
5759 priv->beacon_interval,
5760 batch_mode);
5761 if (err)
5762 return err;
5763
5764 err = ipw2100_set_tx_power(priv, priv->tx_power);
5765 if (err)
5766 return err;
5767 }
5768
5769 /*
5770 err = ipw2100_set_fragmentation_threshold(
5771 priv, priv->frag_threshold, batch_mode);
5772 if (err)
5773 return err;
5774 */
5775
5776 IPW_DEBUG_INFO("exit\n");
5777
5778 return 0;
5779 }
5780
5781 /*************************************************************************
5782 *
5783 * EXTERNALLY CALLED METHODS
5784 *
5785 *************************************************************************/
5786
5787 /* This method is called by the network layer -- not to be confused with
5788 * ipw2100_set_mac_address() declared above called by this driver (and this
5789 * method as well) to talk to the firmware */
5790 static int ipw2100_set_address(struct net_device *dev, void *p)
5791 {
5792 struct ipw2100_priv *priv = libipw_priv(dev);
5793 struct sockaddr *addr = p;
5794 int err = 0;
5795
5796 if (!is_valid_ether_addr(addr->sa_data))
5797 return -EADDRNOTAVAIL;
5798
5799 mutex_lock(&priv->action_mutex);
5800
5801 priv->config |= CFG_CUSTOM_MAC;
5802 memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN);
5803
5804 err = ipw2100_set_mac_address(priv, 0);
5805 if (err)
5806 goto done;
5807
5808 priv->reset_backoff = 0;
5809 mutex_unlock(&priv->action_mutex);
5810 ipw2100_reset_adapter(&priv->reset_work.work);
5811 return 0;
5812
5813 done:
5814 mutex_unlock(&priv->action_mutex);
5815 return err;
5816 }
5817
5818 static int ipw2100_open(struct net_device *dev)
5819 {
5820 struct ipw2100_priv *priv = libipw_priv(dev);
5821 unsigned long flags;
5822 IPW_DEBUG_INFO("dev->open\n");
5823
5824 spin_lock_irqsave(&priv->low_lock, flags);
5825 if (priv->status & STATUS_ASSOCIATED) {
5826 netif_carrier_on(dev);
5827 netif_start_queue(dev);
5828 }
5829 spin_unlock_irqrestore(&priv->low_lock, flags);
5830
5831 return 0;
5832 }
5833
5834 static int ipw2100_close(struct net_device *dev)
5835 {
5836 struct ipw2100_priv *priv = libipw_priv(dev);
5837 unsigned long flags;
5838 struct list_head *element;
5839 struct ipw2100_tx_packet *packet;
5840
5841 IPW_DEBUG_INFO("enter\n");
5842
5843 spin_lock_irqsave(&priv->low_lock, flags);
5844
5845 if (priv->status & STATUS_ASSOCIATED)
5846 netif_carrier_off(dev);
5847 netif_stop_queue(dev);
5848
5849 /* Flush the TX queue ... */
5850 while (!list_empty(&priv->tx_pend_list)) {
5851 element = priv->tx_pend_list.next;
5852 packet = list_entry(element, struct ipw2100_tx_packet, list);
5853
5854 list_del(element);
5855 DEC_STAT(&priv->tx_pend_stat);
5856
5857 libipw_txb_free(packet->info.d_struct.txb);
5858 packet->info.d_struct.txb = NULL;
5859
5860 list_add_tail(element, &priv->tx_free_list);
5861 INC_STAT(&priv->tx_free_stat);
5862 }
5863 spin_unlock_irqrestore(&priv->low_lock, flags);
5864
5865 IPW_DEBUG_INFO("exit\n");
5866
5867 return 0;
5868 }
5869
5870 /*
5871 * TODO: Fix this function... its just wrong
5872 */
5873 static void ipw2100_tx_timeout(struct net_device *dev)
5874 {
5875 struct ipw2100_priv *priv = libipw_priv(dev);
5876
5877 dev->stats.tx_errors++;
5878
5879 #ifdef CONFIG_IPW2100_MONITOR
5880 if (priv->ieee->iw_mode == IW_MODE_MONITOR)
5881 return;
5882 #endif
5883
5884 IPW_DEBUG_INFO("%s: TX timed out. Scheduling firmware restart.\n",
5885 dev->name);
5886 schedule_reset(priv);
5887 }
5888
5889 static int ipw2100_wpa_enable(struct ipw2100_priv *priv, int value)
5890 {
5891 /* This is called when wpa_supplicant loads and closes the driver
5892 * interface. */
5893 priv->ieee->wpa_enabled = value;
5894 return 0;
5895 }
5896
5897 static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value)
5898 {
5899
5900 struct libipw_device *ieee = priv->ieee;
5901 struct libipw_security sec = {
5902 .flags = SEC_AUTH_MODE,
5903 };
5904 int ret = 0;
5905
5906 if (value & IW_AUTH_ALG_SHARED_KEY) {
5907 sec.auth_mode = WLAN_AUTH_SHARED_KEY;
5908 ieee->open_wep = 0;
5909 } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) {
5910 sec.auth_mode = WLAN_AUTH_OPEN;
5911 ieee->open_wep = 1;
5912 } else if (value & IW_AUTH_ALG_LEAP) {
5913 sec.auth_mode = WLAN_AUTH_LEAP;
5914 ieee->open_wep = 1;
5915 } else
5916 return -EINVAL;
5917
5918 if (ieee->set_security)
5919 ieee->set_security(ieee->dev, &sec);
5920 else
5921 ret = -EOPNOTSUPP;
5922
5923 return ret;
5924 }
5925
5926 static void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv,
5927 char *wpa_ie, int wpa_ie_len)
5928 {
5929
5930 struct ipw2100_wpa_assoc_frame frame;
5931
5932 frame.fixed_ie_mask = 0;
5933
5934 /* copy WPA IE */
5935 memcpy(frame.var_ie, wpa_ie, wpa_ie_len);
5936 frame.var_ie_len = wpa_ie_len;
5937
5938 /* make sure WPA is enabled */
5939 ipw2100_wpa_enable(priv, 1);
5940 ipw2100_set_wpa_ie(priv, &frame, 0);
5941 }
5942
5943 static void ipw_ethtool_get_drvinfo(struct net_device *dev,
5944 struct ethtool_drvinfo *info)
5945 {
5946 struct ipw2100_priv *priv = libipw_priv(dev);
5947 char fw_ver[64], ucode_ver[64];
5948
5949 strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
5950 strlcpy(info->version, DRV_VERSION, sizeof(info->version));
5951
5952 ipw2100_get_fwversion(priv, fw_ver, sizeof(fw_ver));
5953 ipw2100_get_ucodeversion(priv, ucode_ver, sizeof(ucode_ver));
5954
5955 snprintf(info->fw_version, sizeof(info->fw_version), "%s:%d:%s",
5956 fw_ver, priv->eeprom_version, ucode_ver);
5957
5958 strlcpy(info->bus_info, pci_name(priv->pci_dev),
5959 sizeof(info->bus_info));
5960 }
5961
5962 static u32 ipw2100_ethtool_get_link(struct net_device *dev)
5963 {
5964 struct ipw2100_priv *priv = libipw_priv(dev);
5965 return (priv->status & STATUS_ASSOCIATED) ? 1 : 0;
5966 }
5967
5968 static const struct ethtool_ops ipw2100_ethtool_ops = {
5969 .get_link = ipw2100_ethtool_get_link,
5970 .get_drvinfo = ipw_ethtool_get_drvinfo,
5971 };
5972
5973 static void ipw2100_hang_check(struct work_struct *work)
5974 {
5975 struct ipw2100_priv *priv =
5976 container_of(work, struct ipw2100_priv, hang_check.work);
5977 unsigned long flags;
5978 u32 rtc = 0xa5a5a5a5;
5979 u32 len = sizeof(rtc);
5980 int restart = 0;
5981
5982 spin_lock_irqsave(&priv->low_lock, flags);
5983
5984 if (priv->fatal_error != 0) {
5985 /* If fatal_error is set then we need to restart */
5986 IPW_DEBUG_INFO("%s: Hardware fatal error detected.\n",
5987 priv->net_dev->name);
5988
5989 restart = 1;
5990 } else if (ipw2100_get_ordinal(priv, IPW_ORD_RTC_TIME, &rtc, &len) ||
5991 (rtc == priv->last_rtc)) {
5992 /* Check if firmware is hung */
5993 IPW_DEBUG_INFO("%s: Firmware RTC stalled.\n",
5994 priv->net_dev->name);
5995
5996 restart = 1;
5997 }
5998
5999 if (restart) {
6000 /* Kill timer */
6001 priv->stop_hang_check = 1;
6002 priv->hangs++;
6003
6004 /* Restart the NIC */
6005 schedule_reset(priv);
6006 }
6007
6008 priv->last_rtc = rtc;
6009
6010 if (!priv->stop_hang_check)
6011 schedule_delayed_work(&priv->hang_check, HZ / 2);
6012
6013 spin_unlock_irqrestore(&priv->low_lock, flags);
6014 }
6015
6016 static void ipw2100_rf_kill(struct work_struct *work)
6017 {
6018 struct ipw2100_priv *priv =
6019 container_of(work, struct ipw2100_priv, rf_kill.work);
6020 unsigned long flags;
6021
6022 spin_lock_irqsave(&priv->low_lock, flags);
6023
6024 if (rf_kill_active(priv)) {
6025 IPW_DEBUG_RF_KILL("RF Kill active, rescheduling GPIO check\n");
6026 if (!priv->stop_rf_kill)
6027 schedule_delayed_work(&priv->rf_kill,
6028 round_jiffies_relative(HZ));
6029 goto exit_unlock;
6030 }
6031
6032 /* RF Kill is now disabled, so bring the device back up */
6033
6034 if (!(priv->status & STATUS_RF_KILL_MASK)) {
6035 IPW_DEBUG_RF_KILL("HW RF Kill no longer active, restarting "
6036 "device\n");
6037 schedule_reset(priv);
6038 } else
6039 IPW_DEBUG_RF_KILL("HW RF Kill deactivated. SW RF Kill still "
6040 "enabled\n");
6041
6042 exit_unlock:
6043 spin_unlock_irqrestore(&priv->low_lock, flags);
6044 }
6045
6046 static void ipw2100_irq_tasklet(struct ipw2100_priv *priv);
6047
6048 static const struct net_device_ops ipw2100_netdev_ops = {
6049 .ndo_open = ipw2100_open,
6050 .ndo_stop = ipw2100_close,
6051 .ndo_start_xmit = libipw_xmit,
6052 .ndo_change_mtu = libipw_change_mtu,
6053 .ndo_tx_timeout = ipw2100_tx_timeout,
6054 .ndo_set_mac_address = ipw2100_set_address,
6055 .ndo_validate_addr = eth_validate_addr,
6056 };
6057
6058 /* Look into using netdev destructor to shutdown libipw? */
6059
6060 static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev,
6061 void __iomem * ioaddr)
6062 {
6063 struct ipw2100_priv *priv;
6064 struct net_device *dev;
6065
6066 dev = alloc_libipw(sizeof(struct ipw2100_priv), 0);
6067 if (!dev)
6068 return NULL;
6069 priv = libipw_priv(dev);
6070 priv->ieee = netdev_priv(dev);
6071 priv->pci_dev = pci_dev;
6072 priv->net_dev = dev;
6073 priv->ioaddr = ioaddr;
6074
6075 priv->ieee->hard_start_xmit = ipw2100_tx;
6076 priv->ieee->set_security = shim__set_security;
6077
6078 priv->ieee->perfect_rssi = -20;
6079 priv->ieee->worst_rssi = -85;
6080
6081 dev->netdev_ops = &ipw2100_netdev_ops;
6082 dev->ethtool_ops = &ipw2100_ethtool_ops;
6083 dev->wireless_handlers = &ipw2100_wx_handler_def;
6084 priv->wireless_data.libipw = priv->ieee;
6085 dev->wireless_data = &priv->wireless_data;
6086 dev->watchdog_timeo = 3 * HZ;
6087 dev->irq = 0;
6088
6089 /* NOTE: We don't use the wireless_handlers hook
6090 * in dev as the system will start throwing WX requests
6091 * to us before we're actually initialized and it just
6092 * ends up causing problems. So, we just handle
6093 * the WX extensions through the ipw2100_ioctl interface */
6094
6095 /* memset() puts everything to 0, so we only have explicitly set
6096 * those values that need to be something else */
6097
6098 /* If power management is turned on, default to AUTO mode */
6099 priv->power_mode = IPW_POWER_AUTO;
6100
6101 #ifdef CONFIG_IPW2100_MONITOR
6102 priv->config |= CFG_CRC_CHECK;
6103 #endif
6104 priv->ieee->wpa_enabled = 0;
6105 priv->ieee->drop_unencrypted = 0;
6106 priv->ieee->privacy_invoked = 0;
6107 priv->ieee->ieee802_1x = 1;
6108
6109 /* Set module parameters */
6110 switch (network_mode) {
6111 case 1:
6112 priv->ieee->iw_mode = IW_MODE_ADHOC;
6113 break;
6114 #ifdef CONFIG_IPW2100_MONITOR
6115 case 2:
6116 priv->ieee->iw_mode = IW_MODE_MONITOR;
6117 break;
6118 #endif
6119 default:
6120 case 0:
6121 priv->ieee->iw_mode = IW_MODE_INFRA;
6122 break;
6123 }
6124
6125 if (disable == 1)
6126 priv->status |= STATUS_RF_KILL_SW;
6127
6128 if (channel != 0 &&
6129 ((channel >= REG_MIN_CHANNEL) && (channel <= REG_MAX_CHANNEL))) {
6130 priv->config |= CFG_STATIC_CHANNEL;
6131 priv->channel = channel;
6132 }
6133
6134 if (associate)
6135 priv->config |= CFG_ASSOCIATE;
6136
6137 priv->beacon_interval = DEFAULT_BEACON_INTERVAL;
6138 priv->short_retry_limit = DEFAULT_SHORT_RETRY_LIMIT;
6139 priv->long_retry_limit = DEFAULT_LONG_RETRY_LIMIT;
6140 priv->rts_threshold = DEFAULT_RTS_THRESHOLD | RTS_DISABLED;
6141 priv->frag_threshold = DEFAULT_FTS | FRAG_DISABLED;
6142 priv->tx_power = IPW_TX_POWER_DEFAULT;
6143 priv->tx_rates = DEFAULT_TX_RATES;
6144
6145 strcpy(priv->nick, "ipw2100");
6146
6147 spin_lock_init(&priv->low_lock);
6148 mutex_init(&priv->action_mutex);
6149 mutex_init(&priv->adapter_mutex);
6150
6151 init_waitqueue_head(&priv->wait_command_queue);
6152
6153 netif_carrier_off(dev);
6154
6155 INIT_LIST_HEAD(&priv->msg_free_list);
6156 INIT_LIST_HEAD(&priv->msg_pend_list);
6157 INIT_STAT(&priv->msg_free_stat);
6158 INIT_STAT(&priv->msg_pend_stat);
6159
6160 INIT_LIST_HEAD(&priv->tx_free_list);
6161 INIT_LIST_HEAD(&priv->tx_pend_list);
6162 INIT_STAT(&priv->tx_free_stat);
6163 INIT_STAT(&priv->tx_pend_stat);
6164
6165 INIT_LIST_HEAD(&priv->fw_pend_list);
6166 INIT_STAT(&priv->fw_pend_stat);
6167
6168 INIT_DELAYED_WORK(&priv->reset_work, ipw2100_reset_adapter);
6169 INIT_DELAYED_WORK(&priv->security_work, ipw2100_security_work);
6170 INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work);
6171 INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check);
6172 INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill);
6173 INIT_DELAYED_WORK(&priv->scan_event, ipw2100_scan_event);
6174
6175 tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long))
6176 ipw2100_irq_tasklet, (unsigned long)priv);
6177
6178 /* NOTE: We do not start the deferred work for status checks yet */
6179 priv->stop_rf_kill = 1;
6180 priv->stop_hang_check = 1;
6181
6182 return dev;
6183 }
6184
6185 static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
6186 const struct pci_device_id *ent)
6187 {
6188 void __iomem *ioaddr;
6189 struct net_device *dev = NULL;
6190 struct ipw2100_priv *priv = NULL;
6191 int err = 0;
6192 int registered = 0;
6193 u32 val;
6194
6195 IPW_DEBUG_INFO("enter\n");
6196
6197 if (!(pci_resource_flags(pci_dev, 0) & IORESOURCE_MEM)) {
6198 IPW_DEBUG_INFO("weird - resource type is not memory\n");
6199 err = -ENODEV;
6200 goto out;
6201 }
6202
6203 ioaddr = pci_iomap(pci_dev, 0, 0);
6204 if (!ioaddr) {
6205 printk(KERN_WARNING DRV_NAME
6206 "Error calling ioremap_nocache.\n");
6207 err = -EIO;
6208 goto fail;
6209 }
6210
6211 /* allocate and initialize our net_device */
6212 dev = ipw2100_alloc_device(pci_dev, ioaddr);
6213 if (!dev) {
6214 printk(KERN_WARNING DRV_NAME
6215 "Error calling ipw2100_alloc_device.\n");
6216 err = -ENOMEM;
6217 goto fail;
6218 }
6219
6220 /* set up PCI mappings for device */
6221 err = pci_enable_device(pci_dev);
6222 if (err) {
6223 printk(KERN_WARNING DRV_NAME
6224 "Error calling pci_enable_device.\n");
6225 return err;
6226 }
6227
6228 priv = libipw_priv(dev);
6229
6230 pci_set_master(pci_dev);
6231 pci_set_drvdata(pci_dev, priv);
6232
6233 err = pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32));
6234 if (err) {
6235 printk(KERN_WARNING DRV_NAME
6236 "Error calling pci_set_dma_mask.\n");
6237 pci_disable_device(pci_dev);
6238 return err;
6239 }
6240
6241 err = pci_request_regions(pci_dev, DRV_NAME);
6242 if (err) {
6243 printk(KERN_WARNING DRV_NAME
6244 "Error calling pci_request_regions.\n");
6245 pci_disable_device(pci_dev);
6246 return err;
6247 }
6248
6249 /* We disable the RETRY_TIMEOUT register (0x41) to keep
6250 * PCI Tx retries from interfering with C3 CPU state */
6251 pci_read_config_dword(pci_dev, 0x40, &val);
6252 if ((val & 0x0000ff00) != 0)
6253 pci_write_config_dword(pci_dev, 0x40, val & 0xffff00ff);
6254
6255 if (!ipw2100_hw_is_adapter_in_system(dev)) {
6256 printk(KERN_WARNING DRV_NAME
6257 "Device not found via register read.\n");
6258 err = -ENODEV;
6259 goto fail;
6260 }
6261
6262 SET_NETDEV_DEV(dev, &pci_dev->dev);
6263
6264 /* Force interrupts to be shut off on the device */
6265 priv->status |= STATUS_INT_ENABLED;
6266 ipw2100_disable_interrupts(priv);
6267
6268 /* Allocate and initialize the Tx/Rx queues and lists */
6269 if (ipw2100_queues_allocate(priv)) {
6270 printk(KERN_WARNING DRV_NAME
6271 "Error calling ipw2100_queues_allocate.\n");
6272 err = -ENOMEM;
6273 goto fail;
6274 }
6275 ipw2100_queues_initialize(priv);
6276
6277 err = request_irq(pci_dev->irq,
6278 ipw2100_interrupt, IRQF_SHARED, dev->name, priv);
6279 if (err) {
6280 printk(KERN_WARNING DRV_NAME
6281 "Error calling request_irq: %d.\n", pci_dev->irq);
6282 goto fail;
6283 }
6284 dev->irq = pci_dev->irq;
6285
6286 IPW_DEBUG_INFO("Attempting to register device...\n");
6287
6288 printk(KERN_INFO DRV_NAME
6289 ": Detected Intel PRO/Wireless 2100 Network Connection\n");
6290
6291 err = ipw2100_up(priv, 1);
6292 if (err)
6293 goto fail;
6294
6295 err = ipw2100_wdev_init(dev);
6296 if (err)
6297 goto fail;
6298 registered = 1;
6299
6300 /* Bring up the interface. Pre 0.46, after we registered the
6301 * network device we would call ipw2100_up. This introduced a race
6302 * condition with newer hotplug configurations (network was coming
6303 * up and making calls before the device was initialized).
6304 */
6305 err = register_netdev(dev);
6306 if (err) {
6307 printk(KERN_WARNING DRV_NAME
6308 "Error calling register_netdev.\n");
6309 goto fail;
6310 }
6311 registered = 2;
6312
6313 mutex_lock(&priv->action_mutex);
6314
6315 IPW_DEBUG_INFO("%s: Bound to %s\n", dev->name, pci_name(pci_dev));
6316
6317 /* perform this after register_netdev so that dev->name is set */
6318 err = sysfs_create_group(&pci_dev->dev.kobj, &ipw2100_attribute_group);
6319 if (err)
6320 goto fail_unlock;
6321
6322 /* If the RF Kill switch is disabled, go ahead and complete the
6323 * startup sequence */
6324 if (!(priv->status & STATUS_RF_KILL_MASK)) {
6325 /* Enable the adapter - sends HOST_COMPLETE */
6326 if (ipw2100_enable_adapter(priv)) {
6327 printk(KERN_WARNING DRV_NAME
6328 ": %s: failed in call to enable adapter.\n",
6329 priv->net_dev->name);
6330 ipw2100_hw_stop_adapter(priv);
6331 err = -EIO;
6332 goto fail_unlock;
6333 }
6334
6335 /* Start a scan . . . */
6336 ipw2100_set_scan_options(priv);
6337 ipw2100_start_scan(priv);
6338 }
6339
6340 IPW_DEBUG_INFO("exit\n");
6341
6342 priv->status |= STATUS_INITIALIZED;
6343
6344 mutex_unlock(&priv->action_mutex);
6345 out:
6346 return err;
6347
6348 fail_unlock:
6349 mutex_unlock(&priv->action_mutex);
6350 fail:
6351 if (dev) {
6352 if (registered >= 2)
6353 unregister_netdev(dev);
6354
6355 if (registered) {
6356 wiphy_unregister(priv->ieee->wdev.wiphy);
6357 kfree(priv->ieee->bg_band.channels);
6358 }
6359
6360 ipw2100_hw_stop_adapter(priv);
6361
6362 ipw2100_disable_interrupts(priv);
6363
6364 if (dev->irq)
6365 free_irq(dev->irq, priv);
6366
6367 ipw2100_kill_works(priv);
6368
6369 /* These are safe to call even if they weren't allocated */
6370 ipw2100_queues_free(priv);
6371 sysfs_remove_group(&pci_dev->dev.kobj,
6372 &ipw2100_attribute_group);
6373
6374 free_libipw(dev, 0);
6375 }
6376
6377 pci_iounmap(pci_dev, ioaddr);
6378
6379 pci_release_regions(pci_dev);
6380 pci_disable_device(pci_dev);
6381 goto out;
6382 }
6383
6384 static void ipw2100_pci_remove_one(struct pci_dev *pci_dev)
6385 {
6386 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6387 struct net_device *dev = priv->net_dev;
6388
6389 mutex_lock(&priv->action_mutex);
6390
6391 priv->status &= ~STATUS_INITIALIZED;
6392
6393 sysfs_remove_group(&pci_dev->dev.kobj, &ipw2100_attribute_group);
6394
6395 #ifdef CONFIG_PM
6396 if (ipw2100_firmware.version)
6397 ipw2100_release_firmware(priv, &ipw2100_firmware);
6398 #endif
6399 /* Take down the hardware */
6400 ipw2100_down(priv);
6401
6402 /* Release the mutex so that the network subsystem can
6403 * complete any needed calls into the driver... */
6404 mutex_unlock(&priv->action_mutex);
6405
6406 /* Unregister the device first - this results in close()
6407 * being called if the device is open. If we free storage
6408 * first, then close() will crash.
6409 * FIXME: remove the comment above. */
6410 unregister_netdev(dev);
6411
6412 ipw2100_kill_works(priv);
6413
6414 ipw2100_queues_free(priv);
6415
6416 /* Free potential debugging firmware snapshot */
6417 ipw2100_snapshot_free(priv);
6418
6419 free_irq(dev->irq, priv);
6420
6421 pci_iounmap(pci_dev, priv->ioaddr);
6422
6423 /* wiphy_unregister needs to be here, before free_libipw */
6424 wiphy_unregister(priv->ieee->wdev.wiphy);
6425 kfree(priv->ieee->bg_band.channels);
6426 free_libipw(dev, 0);
6427
6428 pci_release_regions(pci_dev);
6429 pci_disable_device(pci_dev);
6430
6431 IPW_DEBUG_INFO("exit\n");
6432 }
6433
6434 #ifdef CONFIG_PM
6435 static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state)
6436 {
6437 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6438 struct net_device *dev = priv->net_dev;
6439
6440 IPW_DEBUG_INFO("%s: Going into suspend...\n", dev->name);
6441
6442 mutex_lock(&priv->action_mutex);
6443 if (priv->status & STATUS_INITIALIZED) {
6444 /* Take down the device; powers it off, etc. */
6445 ipw2100_down(priv);
6446 }
6447
6448 /* Remove the PRESENT state of the device */
6449 netif_device_detach(dev);
6450
6451 pci_save_state(pci_dev);
6452 pci_disable_device(pci_dev);
6453 pci_set_power_state(pci_dev, PCI_D3hot);
6454
6455 priv->suspend_at = get_seconds();
6456
6457 mutex_unlock(&priv->action_mutex);
6458
6459 return 0;
6460 }
6461
6462 static int ipw2100_resume(struct pci_dev *pci_dev)
6463 {
6464 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6465 struct net_device *dev = priv->net_dev;
6466 int err;
6467 u32 val;
6468
6469 if (IPW2100_PM_DISABLED)
6470 return 0;
6471
6472 mutex_lock(&priv->action_mutex);
6473
6474 IPW_DEBUG_INFO("%s: Coming out of suspend...\n", dev->name);
6475
6476 pci_set_power_state(pci_dev, PCI_D0);
6477 err = pci_enable_device(pci_dev);
6478 if (err) {
6479 printk(KERN_ERR "%s: pci_enable_device failed on resume\n",
6480 dev->name);
6481 mutex_unlock(&priv->action_mutex);
6482 return err;
6483 }
6484 pci_restore_state(pci_dev);
6485
6486 /*
6487 * Suspend/Resume resets the PCI configuration space, so we have to
6488 * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries
6489 * from interfering with C3 CPU state. pci_restore_state won't help
6490 * here since it only restores the first 64 bytes pci config header.
6491 */
6492 pci_read_config_dword(pci_dev, 0x40, &val);
6493 if ((val & 0x0000ff00) != 0)
6494 pci_write_config_dword(pci_dev, 0x40, val & 0xffff00ff);
6495
6496 /* Set the device back into the PRESENT state; this will also wake
6497 * the queue of needed */
6498 netif_device_attach(dev);
6499
6500 priv->suspend_time = get_seconds() - priv->suspend_at;
6501
6502 /* Bring the device back up */
6503 if (!(priv->status & STATUS_RF_KILL_SW))
6504 ipw2100_up(priv, 0);
6505
6506 mutex_unlock(&priv->action_mutex);
6507
6508 return 0;
6509 }
6510 #endif
6511
6512 static void ipw2100_shutdown(struct pci_dev *pci_dev)
6513 {
6514 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6515
6516 /* Take down the device; powers it off, etc. */
6517 ipw2100_down(priv);
6518
6519 pci_disable_device(pci_dev);
6520 }
6521
6522 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
6523
6524 static DEFINE_PCI_DEVICE_TABLE(ipw2100_pci_id_table) = {
6525 IPW2100_DEV_ID(0x2520), /* IN 2100A mPCI 3A */
6526 IPW2100_DEV_ID(0x2521), /* IN 2100A mPCI 3B */
6527 IPW2100_DEV_ID(0x2524), /* IN 2100A mPCI 3B */
6528 IPW2100_DEV_ID(0x2525), /* IN 2100A mPCI 3B */
6529 IPW2100_DEV_ID(0x2526), /* IN 2100A mPCI Gen A3 */
6530 IPW2100_DEV_ID(0x2522), /* IN 2100 mPCI 3B */
6531 IPW2100_DEV_ID(0x2523), /* IN 2100 mPCI 3A */
6532 IPW2100_DEV_ID(0x2527), /* IN 2100 mPCI 3B */
6533 IPW2100_DEV_ID(0x2528), /* IN 2100 mPCI 3B */
6534 IPW2100_DEV_ID(0x2529), /* IN 2100 mPCI 3B */
6535 IPW2100_DEV_ID(0x252B), /* IN 2100 mPCI 3A */
6536 IPW2100_DEV_ID(0x252C), /* IN 2100 mPCI 3A */
6537 IPW2100_DEV_ID(0x252D), /* IN 2100 mPCI 3A */
6538
6539 IPW2100_DEV_ID(0x2550), /* IB 2100A mPCI 3B */
6540 IPW2100_DEV_ID(0x2551), /* IB 2100 mPCI 3B */
6541 IPW2100_DEV_ID(0x2553), /* IB 2100 mPCI 3B */
6542 IPW2100_DEV_ID(0x2554), /* IB 2100 mPCI 3B */
6543 IPW2100_DEV_ID(0x2555), /* IB 2100 mPCI 3B */
6544
6545 IPW2100_DEV_ID(0x2560), /* DE 2100A mPCI 3A */
6546 IPW2100_DEV_ID(0x2562), /* DE 2100A mPCI 3A */
6547 IPW2100_DEV_ID(0x2563), /* DE 2100A mPCI 3A */
6548 IPW2100_DEV_ID(0x2561), /* DE 2100 mPCI 3A */
6549 IPW2100_DEV_ID(0x2565), /* DE 2100 mPCI 3A */
6550 IPW2100_DEV_ID(0x2566), /* DE 2100 mPCI 3A */
6551 IPW2100_DEV_ID(0x2567), /* DE 2100 mPCI 3A */
6552
6553 IPW2100_DEV_ID(0x2570), /* GA 2100 mPCI 3B */
6554
6555 IPW2100_DEV_ID(0x2580), /* TO 2100A mPCI 3B */
6556 IPW2100_DEV_ID(0x2582), /* TO 2100A mPCI 3B */
6557 IPW2100_DEV_ID(0x2583), /* TO 2100A mPCI 3B */
6558 IPW2100_DEV_ID(0x2581), /* TO 2100 mPCI 3B */
6559 IPW2100_DEV_ID(0x2585), /* TO 2100 mPCI 3B */
6560 IPW2100_DEV_ID(0x2586), /* TO 2100 mPCI 3B */
6561 IPW2100_DEV_ID(0x2587), /* TO 2100 mPCI 3B */
6562
6563 IPW2100_DEV_ID(0x2590), /* SO 2100A mPCI 3B */
6564 IPW2100_DEV_ID(0x2592), /* SO 2100A mPCI 3B */
6565 IPW2100_DEV_ID(0x2591), /* SO 2100 mPCI 3B */
6566 IPW2100_DEV_ID(0x2593), /* SO 2100 mPCI 3B */
6567 IPW2100_DEV_ID(0x2596), /* SO 2100 mPCI 3B */
6568 IPW2100_DEV_ID(0x2598), /* SO 2100 mPCI 3B */
6569
6570 IPW2100_DEV_ID(0x25A0), /* HP 2100 mPCI 3B */
6571 {0,},
6572 };
6573
6574 MODULE_DEVICE_TABLE(pci, ipw2100_pci_id_table);
6575
6576 static struct pci_driver ipw2100_pci_driver = {
6577 .name = DRV_NAME,
6578 .id_table = ipw2100_pci_id_table,
6579 .probe = ipw2100_pci_init_one,
6580 .remove = ipw2100_pci_remove_one,
6581 #ifdef CONFIG_PM
6582 .suspend = ipw2100_suspend,
6583 .resume = ipw2100_resume,
6584 #endif
6585 .shutdown = ipw2100_shutdown,
6586 };
6587
6588 /**
6589 * Initialize the ipw2100 driver/module
6590 *
6591 * @returns 0 if ok, < 0 errno node con error.
6592 *
6593 * Note: we cannot init the /proc stuff until the PCI driver is there,
6594 * or we risk an unlikely race condition on someone accessing
6595 * uninitialized data in the PCI dev struct through /proc.
6596 */
6597 static int __init ipw2100_init(void)
6598 {
6599 int ret;
6600
6601 printk(KERN_INFO DRV_NAME ": %s, %s\n", DRV_DESCRIPTION, DRV_VERSION);
6602 printk(KERN_INFO DRV_NAME ": %s\n", DRV_COPYRIGHT);
6603
6604 pm_qos_add_request(&ipw2100_pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
6605 PM_QOS_DEFAULT_VALUE);
6606
6607 ret = pci_register_driver(&ipw2100_pci_driver);
6608 if (ret)
6609 goto out;
6610
6611 #ifdef CONFIG_IPW2100_DEBUG
6612 ipw2100_debug_level = debug;
6613 ret = driver_create_file(&ipw2100_pci_driver.driver,
6614 &driver_attr_debug_level);
6615 #endif
6616
6617 out:
6618 return ret;
6619 }
6620
6621 /**
6622 * Cleanup ipw2100 driver registration
6623 */
6624 static void __exit ipw2100_exit(void)
6625 {
6626 /* FIXME: IPG: check that we have no instances of the devices open */
6627 #ifdef CONFIG_IPW2100_DEBUG
6628 driver_remove_file(&ipw2100_pci_driver.driver,
6629 &driver_attr_debug_level);
6630 #endif
6631 pci_unregister_driver(&ipw2100_pci_driver);
6632 pm_qos_remove_request(&ipw2100_pm_qos_req);
6633 }
6634
6635 module_init(ipw2100_init);
6636 module_exit(ipw2100_exit);
6637
6638 static int ipw2100_wx_get_name(struct net_device *dev,
6639 struct iw_request_info *info,
6640 union iwreq_data *wrqu, char *extra)
6641 {
6642 /*
6643 * This can be called at any time. No action lock required
6644 */
6645
6646 struct ipw2100_priv *priv = libipw_priv(dev);
6647 if (!(priv->status & STATUS_ASSOCIATED))
6648 strcpy(wrqu->name, "unassociated");
6649 else
6650 snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11b");
6651
6652 IPW_DEBUG_WX("Name: %s\n", wrqu->name);
6653 return 0;
6654 }
6655
6656 static int ipw2100_wx_set_freq(struct net_device *dev,
6657 struct iw_request_info *info,
6658 union iwreq_data *wrqu, char *extra)
6659 {
6660 struct ipw2100_priv *priv = libipw_priv(dev);
6661 struct iw_freq *fwrq = &wrqu->freq;
6662 int err = 0;
6663
6664 if (priv->ieee->iw_mode == IW_MODE_INFRA)
6665 return -EOPNOTSUPP;
6666
6667 mutex_lock(&priv->action_mutex);
6668 if (!(priv->status & STATUS_INITIALIZED)) {
6669 err = -EIO;
6670 goto done;
6671 }
6672
6673 /* if setting by freq convert to channel */
6674 if (fwrq->e == 1) {
6675 if ((fwrq->m >= (int)2.412e8 && fwrq->m <= (int)2.487e8)) {
6676 int f = fwrq->m / 100000;
6677 int c = 0;
6678
6679 while ((c < REG_MAX_CHANNEL) &&
6680 (f != ipw2100_frequencies[c]))
6681 c++;
6682
6683 /* hack to fall through */
6684 fwrq->e = 0;
6685 fwrq->m = c + 1;
6686 }
6687 }
6688
6689 if (fwrq->e > 0 || fwrq->m > 1000) {
6690 err = -EOPNOTSUPP;
6691 goto done;
6692 } else { /* Set the channel */
6693 IPW_DEBUG_WX("SET Freq/Channel -> %d\n", fwrq->m);
6694 err = ipw2100_set_channel(priv, fwrq->m, 0);
6695 }
6696
6697 done:
6698 mutex_unlock(&priv->action_mutex);
6699 return err;
6700 }
6701
6702 static int ipw2100_wx_get_freq(struct net_device *dev,
6703 struct iw_request_info *info,
6704 union iwreq_data *wrqu, char *extra)
6705 {
6706 /*
6707 * This can be called at any time. No action lock required
6708 */
6709
6710 struct ipw2100_priv *priv = libipw_priv(dev);
6711
6712 wrqu->freq.e = 0;
6713
6714 /* If we are associated, trying to associate, or have a statically
6715 * configured CHANNEL then return that; otherwise return ANY */
6716 if (priv->config & CFG_STATIC_CHANNEL ||
6717 priv->status & STATUS_ASSOCIATED)
6718 wrqu->freq.m = priv->channel;
6719 else
6720 wrqu->freq.m = 0;
6721
6722 IPW_DEBUG_WX("GET Freq/Channel -> %d\n", priv->channel);
6723 return 0;
6724
6725 }
6726
6727 static int ipw2100_wx_set_mode(struct net_device *dev,
6728 struct iw_request_info *info,
6729 union iwreq_data *wrqu, char *extra)
6730 {
6731 struct ipw2100_priv *priv = libipw_priv(dev);
6732 int err = 0;
6733
6734 IPW_DEBUG_WX("SET Mode -> %d\n", wrqu->mode);
6735
6736 if (wrqu->mode == priv->ieee->iw_mode)
6737 return 0;
6738
6739 mutex_lock(&priv->action_mutex);
6740 if (!(priv->status & STATUS_INITIALIZED)) {
6741 err = -EIO;
6742 goto done;
6743 }
6744
6745 switch (wrqu->mode) {
6746 #ifdef CONFIG_IPW2100_MONITOR
6747 case IW_MODE_MONITOR:
6748 err = ipw2100_switch_mode(priv, IW_MODE_MONITOR);
6749 break;
6750 #endif /* CONFIG_IPW2100_MONITOR */
6751 case IW_MODE_ADHOC:
6752 err = ipw2100_switch_mode(priv, IW_MODE_ADHOC);
6753 break;
6754 case IW_MODE_INFRA:
6755 case IW_MODE_AUTO:
6756 default:
6757 err = ipw2100_switch_mode(priv, IW_MODE_INFRA);
6758 break;
6759 }
6760
6761 done:
6762 mutex_unlock(&priv->action_mutex);
6763 return err;
6764 }
6765
6766 static int ipw2100_wx_get_mode(struct net_device *dev,
6767 struct iw_request_info *info,
6768 union iwreq_data *wrqu, char *extra)
6769 {
6770 /*
6771 * This can be called at any time. No action lock required
6772 */
6773
6774 struct ipw2100_priv *priv = libipw_priv(dev);
6775
6776 wrqu->mode = priv->ieee->iw_mode;
6777 IPW_DEBUG_WX("GET Mode -> %d\n", wrqu->mode);
6778
6779 return 0;
6780 }
6781
6782 #define POWER_MODES 5
6783
6784 /* Values are in microsecond */
6785 static const s32 timeout_duration[POWER_MODES] = {
6786 350000,
6787 250000,
6788 75000,
6789 37000,
6790 25000,
6791 };
6792
6793 static const s32 period_duration[POWER_MODES] = {
6794 400000,
6795 700000,
6796 1000000,
6797 1000000,
6798 1000000
6799 };
6800
6801 static int ipw2100_wx_get_range(struct net_device *dev,
6802 struct iw_request_info *info,
6803 union iwreq_data *wrqu, char *extra)
6804 {
6805 /*
6806 * This can be called at any time. No action lock required
6807 */
6808
6809 struct ipw2100_priv *priv = libipw_priv(dev);
6810 struct iw_range *range = (struct iw_range *)extra;
6811 u16 val;
6812 int i, level;
6813
6814 wrqu->data.length = sizeof(*range);
6815 memset(range, 0, sizeof(*range));
6816
6817 /* Let's try to keep this struct in the same order as in
6818 * linux/include/wireless.h
6819 */
6820
6821 /* TODO: See what values we can set, and remove the ones we can't
6822 * set, or fill them with some default data.
6823 */
6824
6825 /* ~5 Mb/s real (802.11b) */
6826 range->throughput = 5 * 1000 * 1000;
6827
6828 // range->sensitivity; /* signal level threshold range */
6829
6830 range->max_qual.qual = 100;
6831 /* TODO: Find real max RSSI and stick here */
6832 range->max_qual.level = 0;
6833 range->max_qual.noise = 0;
6834 range->max_qual.updated = 7; /* Updated all three */
6835
6836 range->avg_qual.qual = 70; /* > 8% missed beacons is 'bad' */
6837 /* TODO: Find real 'good' to 'bad' threshold value for RSSI */
6838 range->avg_qual.level = 20 + IPW2100_RSSI_TO_DBM;
6839 range->avg_qual.noise = 0;
6840 range->avg_qual.updated = 7; /* Updated all three */
6841
6842 range->num_bitrates = RATE_COUNT;
6843
6844 for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) {
6845 range->bitrate[i] = ipw2100_bg_rates[i].bitrate * 100 * 1000;
6846 }
6847
6848 range->min_rts = MIN_RTS_THRESHOLD;
6849 range->max_rts = MAX_RTS_THRESHOLD;
6850 range->min_frag = MIN_FRAG_THRESHOLD;
6851 range->max_frag = MAX_FRAG_THRESHOLD;
6852
6853 range->min_pmp = period_duration[0]; /* Minimal PM period */
6854 range->max_pmp = period_duration[POWER_MODES - 1]; /* Maximal PM period */
6855 range->min_pmt = timeout_duration[POWER_MODES - 1]; /* Minimal PM timeout */
6856 range->max_pmt = timeout_duration[0]; /* Maximal PM timeout */
6857
6858 /* How to decode max/min PM period */
6859 range->pmp_flags = IW_POWER_PERIOD;
6860 /* How to decode max/min PM period */
6861 range->pmt_flags = IW_POWER_TIMEOUT;
6862 /* What PM options are supported */
6863 range->pm_capa = IW_POWER_TIMEOUT | IW_POWER_PERIOD;
6864
6865 range->encoding_size[0] = 5;
6866 range->encoding_size[1] = 13; /* Different token sizes */
6867 range->num_encoding_sizes = 2; /* Number of entry in the list */
6868 range->max_encoding_tokens = WEP_KEYS; /* Max number of tokens */
6869 // range->encoding_login_index; /* token index for login token */
6870
6871 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
6872 range->txpower_capa = IW_TXPOW_DBM;
6873 range->num_txpower = IW_MAX_TXPOWER;
6874 for (i = 0, level = (IPW_TX_POWER_MAX_DBM * 16);
6875 i < IW_MAX_TXPOWER;
6876 i++, level -=
6877 ((IPW_TX_POWER_MAX_DBM -
6878 IPW_TX_POWER_MIN_DBM) * 16) / (IW_MAX_TXPOWER - 1))
6879 range->txpower[i] = level / 16;
6880 } else {
6881 range->txpower_capa = 0;
6882 range->num_txpower = 0;
6883 }
6884
6885 /* Set the Wireless Extension versions */
6886 range->we_version_compiled = WIRELESS_EXT;
6887 range->we_version_source = 18;
6888
6889 // range->retry_capa; /* What retry options are supported */
6890 // range->retry_flags; /* How to decode max/min retry limit */
6891 // range->r_time_flags; /* How to decode max/min retry life */
6892 // range->min_retry; /* Minimal number of retries */
6893 // range->max_retry; /* Maximal number of retries */
6894 // range->min_r_time; /* Minimal retry lifetime */
6895 // range->max_r_time; /* Maximal retry lifetime */
6896
6897 range->num_channels = FREQ_COUNT;
6898
6899 val = 0;
6900 for (i = 0; i < FREQ_COUNT; i++) {
6901 // TODO: Include only legal frequencies for some countries
6902 // if (local->channel_mask & (1 << i)) {
6903 range->freq[val].i = i + 1;
6904 range->freq[val].m = ipw2100_frequencies[i] * 100000;
6905 range->freq[val].e = 1;
6906 val++;
6907 // }
6908 if (val == IW_MAX_FREQUENCIES)
6909 break;
6910 }
6911 range->num_frequency = val;
6912
6913 /* Event capability (kernel + driver) */
6914 range->event_capa[0] = (IW_EVENT_CAPA_K_0 |
6915 IW_EVENT_CAPA_MASK(SIOCGIWAP));
6916 range->event_capa[1] = IW_EVENT_CAPA_K_1;
6917
6918 range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 |
6919 IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;
6920
6921 IPW_DEBUG_WX("GET Range\n");
6922
6923 return 0;
6924 }
6925
6926 static int ipw2100_wx_set_wap(struct net_device *dev,
6927 struct iw_request_info *info,
6928 union iwreq_data *wrqu, char *extra)
6929 {
6930 struct ipw2100_priv *priv = libipw_priv(dev);
6931 int err = 0;
6932
6933 // sanity checks
6934 if (wrqu->ap_addr.sa_family != ARPHRD_ETHER)
6935 return -EINVAL;
6936
6937 mutex_lock(&priv->action_mutex);
6938 if (!(priv->status & STATUS_INITIALIZED)) {
6939 err = -EIO;
6940 goto done;
6941 }
6942
6943 if (is_broadcast_ether_addr(wrqu->ap_addr.sa_data) ||
6944 is_zero_ether_addr(wrqu->ap_addr.sa_data)) {
6945 /* we disable mandatory BSSID association */
6946 IPW_DEBUG_WX("exit - disable mandatory BSSID\n");
6947 priv->config &= ~CFG_STATIC_BSSID;
6948 err = ipw2100_set_mandatory_bssid(priv, NULL, 0);
6949 goto done;
6950 }
6951
6952 priv->config |= CFG_STATIC_BSSID;
6953 memcpy(priv->mandatory_bssid_mac, wrqu->ap_addr.sa_data, ETH_ALEN);
6954
6955 err = ipw2100_set_mandatory_bssid(priv, wrqu->ap_addr.sa_data, 0);
6956
6957 IPW_DEBUG_WX("SET BSSID -> %pM\n", wrqu->ap_addr.sa_data);
6958
6959 done:
6960 mutex_unlock(&priv->action_mutex);
6961 return err;
6962 }
6963
6964 static int ipw2100_wx_get_wap(struct net_device *dev,
6965 struct iw_request_info *info,
6966 union iwreq_data *wrqu, char *extra)
6967 {
6968 /*
6969 * This can be called at any time. No action lock required
6970 */
6971
6972 struct ipw2100_priv *priv = libipw_priv(dev);
6973
6974 /* If we are associated, trying to associate, or have a statically
6975 * configured BSSID then return that; otherwise return ANY */
6976 if (priv->config & CFG_STATIC_BSSID || priv->status & STATUS_ASSOCIATED) {
6977 wrqu->ap_addr.sa_family = ARPHRD_ETHER;
6978 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN);
6979 } else
6980 memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);
6981
6982 IPW_DEBUG_WX("Getting WAP BSSID: %pM\n", wrqu->ap_addr.sa_data);
6983 return 0;
6984 }
6985
6986 static int ipw2100_wx_set_essid(struct net_device *dev,
6987 struct iw_request_info *info,
6988 union iwreq_data *wrqu, char *extra)
6989 {
6990 struct ipw2100_priv *priv = libipw_priv(dev);
6991 char *essid = ""; /* ANY */
6992 int length = 0;
6993 int err = 0;
6994 DECLARE_SSID_BUF(ssid);
6995
6996 mutex_lock(&priv->action_mutex);
6997 if (!(priv->status & STATUS_INITIALIZED)) {
6998 err = -EIO;
6999 goto done;
7000 }
7001
7002 if (wrqu->essid.flags && wrqu->essid.length) {
7003 length = wrqu->essid.length;
7004 essid = extra;
7005 }
7006
7007 if (length == 0) {
7008 IPW_DEBUG_WX("Setting ESSID to ANY\n");
7009 priv->config &= ~CFG_STATIC_ESSID;
7010 err = ipw2100_set_essid(priv, NULL, 0, 0);
7011 goto done;
7012 }
7013
7014 length = min(length, IW_ESSID_MAX_SIZE);
7015
7016 priv->config |= CFG_STATIC_ESSID;
7017
7018 if (priv->essid_len == length && !memcmp(priv->essid, extra, length)) {
7019 IPW_DEBUG_WX("ESSID set to current ESSID.\n");
7020 err = 0;
7021 goto done;
7022 }
7023
7024 IPW_DEBUG_WX("Setting ESSID: '%s' (%d)\n",
7025 print_ssid(ssid, essid, length), length);
7026
7027 priv->essid_len = length;
7028 memcpy(priv->essid, essid, priv->essid_len);
7029
7030 err = ipw2100_set_essid(priv, essid, length, 0);
7031
7032 done:
7033 mutex_unlock(&priv->action_mutex);
7034 return err;
7035 }
7036
7037 static int ipw2100_wx_get_essid(struct net_device *dev,
7038 struct iw_request_info *info,
7039 union iwreq_data *wrqu, char *extra)
7040 {
7041 /*
7042 * This can be called at any time. No action lock required
7043 */
7044
7045 struct ipw2100_priv *priv = libipw_priv(dev);
7046 DECLARE_SSID_BUF(ssid);
7047
7048 /* If we are associated, trying to associate, or have a statically
7049 * configured ESSID then return that; otherwise return ANY */
7050 if (priv->config & CFG_STATIC_ESSID || priv->status & STATUS_ASSOCIATED) {
7051 IPW_DEBUG_WX("Getting essid: '%s'\n",
7052 print_ssid(ssid, priv->essid, priv->essid_len));
7053 memcpy(extra, priv->essid, priv->essid_len);
7054 wrqu->essid.length = priv->essid_len;
7055 wrqu->essid.flags = 1; /* active */
7056 } else {
7057 IPW_DEBUG_WX("Getting essid: ANY\n");
7058 wrqu->essid.length = 0;
7059 wrqu->essid.flags = 0; /* active */
7060 }
7061
7062 return 0;
7063 }
7064
7065 static int ipw2100_wx_set_nick(struct net_device *dev,
7066 struct iw_request_info *info,
7067 union iwreq_data *wrqu, char *extra)
7068 {
7069 /*
7070 * This can be called at any time. No action lock required
7071 */
7072
7073 struct ipw2100_priv *priv = libipw_priv(dev);
7074
7075 if (wrqu->data.length > IW_ESSID_MAX_SIZE)
7076 return -E2BIG;
7077
7078 wrqu->data.length = min((size_t) wrqu->data.length, sizeof(priv->nick));
7079 memset(priv->nick, 0, sizeof(priv->nick));
7080 memcpy(priv->nick, extra, wrqu->data.length);
7081
7082 IPW_DEBUG_WX("SET Nickname -> %s\n", priv->nick);
7083
7084 return 0;
7085 }
7086
7087 static int ipw2100_wx_get_nick(struct net_device *dev,
7088 struct iw_request_info *info,
7089 union iwreq_data *wrqu, char *extra)
7090 {
7091 /*
7092 * This can be called at any time. No action lock required
7093 */
7094
7095 struct ipw2100_priv *priv = libipw_priv(dev);
7096
7097 wrqu->data.length = strlen(priv->nick);
7098 memcpy(extra, priv->nick, wrqu->data.length);
7099 wrqu->data.flags = 1; /* active */
7100
7101 IPW_DEBUG_WX("GET Nickname -> %s\n", extra);
7102
7103 return 0;
7104 }
7105
7106 static int ipw2100_wx_set_rate(struct net_device *dev,
7107 struct iw_request_info *info,
7108 union iwreq_data *wrqu, char *extra)
7109 {
7110 struct ipw2100_priv *priv = libipw_priv(dev);
7111 u32 target_rate = wrqu->bitrate.value;
7112 u32 rate;
7113 int err = 0;
7114
7115 mutex_lock(&priv->action_mutex);
7116 if (!(priv->status & STATUS_INITIALIZED)) {
7117 err = -EIO;
7118 goto done;
7119 }
7120
7121 rate = 0;
7122
7123 if (target_rate == 1000000 ||
7124 (!wrqu->bitrate.fixed && target_rate > 1000000))
7125 rate |= TX_RATE_1_MBIT;
7126 if (target_rate == 2000000 ||
7127 (!wrqu->bitrate.fixed && target_rate > 2000000))
7128 rate |= TX_RATE_2_MBIT;
7129 if (target_rate == 5500000 ||
7130 (!wrqu->bitrate.fixed && target_rate > 5500000))
7131 rate |= TX_RATE_5_5_MBIT;
7132 if (target_rate == 11000000 ||
7133 (!wrqu->bitrate.fixed && target_rate > 11000000))
7134 rate |= TX_RATE_11_MBIT;
7135 if (rate == 0)
7136 rate = DEFAULT_TX_RATES;
7137
7138 err = ipw2100_set_tx_rates(priv, rate, 0);
7139
7140 IPW_DEBUG_WX("SET Rate -> %04X\n", rate);
7141 done:
7142 mutex_unlock(&priv->action_mutex);
7143 return err;
7144 }
7145
7146 static int ipw2100_wx_get_rate(struct net_device *dev,
7147 struct iw_request_info *info,
7148 union iwreq_data *wrqu, char *extra)
7149 {
7150 struct ipw2100_priv *priv = libipw_priv(dev);
7151 int val;
7152 unsigned int len = sizeof(val);
7153 int err = 0;
7154
7155 if (!(priv->status & STATUS_ENABLED) ||
7156 priv->status & STATUS_RF_KILL_MASK ||
7157 !(priv->status & STATUS_ASSOCIATED)) {
7158 wrqu->bitrate.value = 0;
7159 return 0;
7160 }
7161
7162 mutex_lock(&priv->action_mutex);
7163 if (!(priv->status & STATUS_INITIALIZED)) {
7164 err = -EIO;
7165 goto done;
7166 }
7167
7168 err = ipw2100_get_ordinal(priv, IPW_ORD_CURRENT_TX_RATE, &val, &len);
7169 if (err) {
7170 IPW_DEBUG_WX("failed querying ordinals.\n");
7171 goto done;
7172 }
7173
7174 switch (val & TX_RATE_MASK) {
7175 case TX_RATE_1_MBIT:
7176 wrqu->bitrate.value = 1000000;
7177 break;
7178 case TX_RATE_2_MBIT:
7179 wrqu->bitrate.value = 2000000;
7180 break;
7181 case TX_RATE_5_5_MBIT:
7182 wrqu->bitrate.value = 5500000;
7183 break;
7184 case TX_RATE_11_MBIT:
7185 wrqu->bitrate.value = 11000000;
7186 break;
7187 default:
7188 wrqu->bitrate.value = 0;
7189 }
7190
7191 IPW_DEBUG_WX("GET Rate -> %d\n", wrqu->bitrate.value);
7192
7193 done:
7194 mutex_unlock(&priv->action_mutex);
7195 return err;
7196 }
7197
7198 static int ipw2100_wx_set_rts(struct net_device *dev,
7199 struct iw_request_info *info,
7200 union iwreq_data *wrqu, char *extra)
7201 {
7202 struct ipw2100_priv *priv = libipw_priv(dev);
7203 int value, err;
7204
7205 /* Auto RTS not yet supported */
7206 if (wrqu->rts.fixed == 0)
7207 return -EINVAL;
7208
7209 mutex_lock(&priv->action_mutex);
7210 if (!(priv->status & STATUS_INITIALIZED)) {
7211 err = -EIO;
7212 goto done;
7213 }
7214
7215 if (wrqu->rts.disabled)
7216 value = priv->rts_threshold | RTS_DISABLED;
7217 else {
7218 if (wrqu->rts.value < 1 || wrqu->rts.value > 2304) {
7219 err = -EINVAL;
7220 goto done;
7221 }
7222 value = wrqu->rts.value;
7223 }
7224
7225 err = ipw2100_set_rts_threshold(priv, value);
7226
7227 IPW_DEBUG_WX("SET RTS Threshold -> 0x%08X\n", value);
7228 done:
7229 mutex_unlock(&priv->action_mutex);
7230 return err;
7231 }
7232
7233 static int ipw2100_wx_get_rts(struct net_device *dev,
7234 struct iw_request_info *info,
7235 union iwreq_data *wrqu, char *extra)
7236 {
7237 /*
7238 * This can be called at any time. No action lock required
7239 */
7240
7241 struct ipw2100_priv *priv = libipw_priv(dev);
7242
7243 wrqu->rts.value = priv->rts_threshold & ~RTS_DISABLED;
7244 wrqu->rts.fixed = 1; /* no auto select */
7245
7246 /* If RTS is set to the default value, then it is disabled */
7247 wrqu->rts.disabled = (priv->rts_threshold & RTS_DISABLED) ? 1 : 0;
7248
7249 IPW_DEBUG_WX("GET RTS Threshold -> 0x%08X\n", wrqu->rts.value);
7250
7251 return 0;
7252 }
7253
7254 static int ipw2100_wx_set_txpow(struct net_device *dev,
7255 struct iw_request_info *info,
7256 union iwreq_data *wrqu, char *extra)
7257 {
7258 struct ipw2100_priv *priv = libipw_priv(dev);
7259 int err = 0, value;
7260
7261 if (ipw_radio_kill_sw(priv, wrqu->txpower.disabled))
7262 return -EINPROGRESS;
7263
7264 if (priv->ieee->iw_mode != IW_MODE_ADHOC)
7265 return 0;
7266
7267 if ((wrqu->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM)
7268 return -EINVAL;
7269
7270 if (wrqu->txpower.fixed == 0)
7271 value = IPW_TX_POWER_DEFAULT;
7272 else {
7273 if (wrqu->txpower.value < IPW_TX_POWER_MIN_DBM ||
7274 wrqu->txpower.value > IPW_TX_POWER_MAX_DBM)
7275 return -EINVAL;
7276
7277 value = wrqu->txpower.value;
7278 }
7279
7280 mutex_lock(&priv->action_mutex);
7281 if (!(priv->status & STATUS_INITIALIZED)) {
7282 err = -EIO;
7283 goto done;
7284 }
7285
7286 err = ipw2100_set_tx_power(priv, value);
7287
7288 IPW_DEBUG_WX("SET TX Power -> %d\n", value);
7289
7290 done:
7291 mutex_unlock(&priv->action_mutex);
7292 return err;
7293 }
7294
7295 static int ipw2100_wx_get_txpow(struct net_device *dev,
7296 struct iw_request_info *info,
7297 union iwreq_data *wrqu, char *extra)
7298 {
7299 /*
7300 * This can be called at any time. No action lock required
7301 */
7302
7303 struct ipw2100_priv *priv = libipw_priv(dev);
7304
7305 wrqu->txpower.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0;
7306
7307 if (priv->tx_power == IPW_TX_POWER_DEFAULT) {
7308 wrqu->txpower.fixed = 0;
7309 wrqu->txpower.value = IPW_TX_POWER_MAX_DBM;
7310 } else {
7311 wrqu->txpower.fixed = 1;
7312 wrqu->txpower.value = priv->tx_power;
7313 }
7314
7315 wrqu->txpower.flags = IW_TXPOW_DBM;
7316
7317 IPW_DEBUG_WX("GET TX Power -> %d\n", wrqu->txpower.value);
7318
7319 return 0;
7320 }
7321
7322 static int ipw2100_wx_set_frag(struct net_device *dev,
7323 struct iw_request_info *info,
7324 union iwreq_data *wrqu, char *extra)
7325 {
7326 /*
7327 * This can be called at any time. No action lock required
7328 */
7329
7330 struct ipw2100_priv *priv = libipw_priv(dev);
7331
7332 if (!wrqu->frag.fixed)
7333 return -EINVAL;
7334
7335 if (wrqu->frag.disabled) {
7336 priv->frag_threshold |= FRAG_DISABLED;
7337 priv->ieee->fts = DEFAULT_FTS;
7338 } else {
7339 if (wrqu->frag.value < MIN_FRAG_THRESHOLD ||
7340 wrqu->frag.value > MAX_FRAG_THRESHOLD)
7341 return -EINVAL;
7342
7343 priv->ieee->fts = wrqu->frag.value & ~0x1;
7344 priv->frag_threshold = priv->ieee->fts;
7345 }
7346
7347 IPW_DEBUG_WX("SET Frag Threshold -> %d\n", priv->ieee->fts);
7348
7349 return 0;
7350 }
7351
7352 static int ipw2100_wx_get_frag(struct net_device *dev,
7353 struct iw_request_info *info,
7354 union iwreq_data *wrqu, char *extra)
7355 {
7356 /*
7357 * This can be called at any time. No action lock required
7358 */
7359
7360 struct ipw2100_priv *priv = libipw_priv(dev);
7361 wrqu->frag.value = priv->frag_threshold & ~FRAG_DISABLED;
7362 wrqu->frag.fixed = 0; /* no auto select */
7363 wrqu->frag.disabled = (priv->frag_threshold & FRAG_DISABLED) ? 1 : 0;
7364
7365 IPW_DEBUG_WX("GET Frag Threshold -> %d\n", wrqu->frag.value);
7366
7367 return 0;
7368 }
7369
7370 static int ipw2100_wx_set_retry(struct net_device *dev,
7371 struct iw_request_info *info,
7372 union iwreq_data *wrqu, char *extra)
7373 {
7374 struct ipw2100_priv *priv = libipw_priv(dev);
7375 int err = 0;
7376
7377 if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled)
7378 return -EINVAL;
7379
7380 if (!(wrqu->retry.flags & IW_RETRY_LIMIT))
7381 return 0;
7382
7383 mutex_lock(&priv->action_mutex);
7384 if (!(priv->status & STATUS_INITIALIZED)) {
7385 err = -EIO;
7386 goto done;
7387 }
7388
7389 if (wrqu->retry.flags & IW_RETRY_SHORT) {
7390 err = ipw2100_set_short_retry(priv, wrqu->retry.value);
7391 IPW_DEBUG_WX("SET Short Retry Limit -> %d\n",
7392 wrqu->retry.value);
7393 goto done;
7394 }
7395
7396 if (wrqu->retry.flags & IW_RETRY_LONG) {
7397 err = ipw2100_set_long_retry(priv, wrqu->retry.value);
7398 IPW_DEBUG_WX("SET Long Retry Limit -> %d\n",
7399 wrqu->retry.value);
7400 goto done;
7401 }
7402
7403 err = ipw2100_set_short_retry(priv, wrqu->retry.value);
7404 if (!err)
7405 err = ipw2100_set_long_retry(priv, wrqu->retry.value);
7406
7407 IPW_DEBUG_WX("SET Both Retry Limits -> %d\n", wrqu->retry.value);
7408
7409 done:
7410 mutex_unlock(&priv->action_mutex);
7411 return err;
7412 }
7413
7414 static int ipw2100_wx_get_retry(struct net_device *dev,
7415 struct iw_request_info *info,
7416 union iwreq_data *wrqu, char *extra)
7417 {
7418 /*
7419 * This can be called at any time. No action lock required
7420 */
7421
7422 struct ipw2100_priv *priv = libipw_priv(dev);
7423
7424 wrqu->retry.disabled = 0; /* can't be disabled */
7425
7426 if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME)
7427 return -EINVAL;
7428
7429 if (wrqu->retry.flags & IW_RETRY_LONG) {
7430 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_LONG;
7431 wrqu->retry.value = priv->long_retry_limit;
7432 } else {
7433 wrqu->retry.flags =
7434 (priv->short_retry_limit !=
7435 priv->long_retry_limit) ?
7436 IW_RETRY_LIMIT | IW_RETRY_SHORT : IW_RETRY_LIMIT;
7437
7438 wrqu->retry.value = priv->short_retry_limit;
7439 }
7440
7441 IPW_DEBUG_WX("GET Retry -> %d\n", wrqu->retry.value);
7442
7443 return 0;
7444 }
7445
7446 static int ipw2100_wx_set_scan(struct net_device *dev,
7447 struct iw_request_info *info,
7448 union iwreq_data *wrqu, char *extra)
7449 {
7450 struct ipw2100_priv *priv = libipw_priv(dev);
7451 int err = 0;
7452
7453 mutex_lock(&priv->action_mutex);
7454 if (!(priv->status & STATUS_INITIALIZED)) {
7455 err = -EIO;
7456 goto done;
7457 }
7458
7459 IPW_DEBUG_WX("Initiating scan...\n");
7460
7461 priv->user_requested_scan = 1;
7462 if (ipw2100_set_scan_options(priv) || ipw2100_start_scan(priv)) {
7463 IPW_DEBUG_WX("Start scan failed.\n");
7464
7465 /* TODO: Mark a scan as pending so when hardware initialized
7466 * a scan starts */
7467 }
7468
7469 done:
7470 mutex_unlock(&priv->action_mutex);
7471 return err;
7472 }
7473
7474 static int ipw2100_wx_get_scan(struct net_device *dev,
7475 struct iw_request_info *info,
7476 union iwreq_data *wrqu, char *extra)
7477 {
7478 /*
7479 * This can be called at any time. No action lock required
7480 */
7481
7482 struct ipw2100_priv *priv = libipw_priv(dev);
7483 return libipw_wx_get_scan(priv->ieee, info, wrqu, extra);
7484 }
7485
7486 /*
7487 * Implementation based on code in hostap-driver v0.1.3 hostap_ioctl.c
7488 */
7489 static int ipw2100_wx_set_encode(struct net_device *dev,
7490 struct iw_request_info *info,
7491 union iwreq_data *wrqu, char *key)
7492 {
7493 /*
7494 * No check of STATUS_INITIALIZED required
7495 */
7496
7497 struct ipw2100_priv *priv = libipw_priv(dev);
7498 return libipw_wx_set_encode(priv->ieee, info, wrqu, key);
7499 }
7500
7501 static int ipw2100_wx_get_encode(struct net_device *dev,
7502 struct iw_request_info *info,
7503 union iwreq_data *wrqu, char *key)
7504 {
7505 /*
7506 * This can be called at any time. No action lock required
7507 */
7508
7509 struct ipw2100_priv *priv = libipw_priv(dev);
7510 return libipw_wx_get_encode(priv->ieee, info, wrqu, key);
7511 }
7512
7513 static int ipw2100_wx_set_power(struct net_device *dev,
7514 struct iw_request_info *info,
7515 union iwreq_data *wrqu, char *extra)
7516 {
7517 struct ipw2100_priv *priv = libipw_priv(dev);
7518 int err = 0;
7519
7520 mutex_lock(&priv->action_mutex);
7521 if (!(priv->status & STATUS_INITIALIZED)) {
7522 err = -EIO;
7523 goto done;
7524 }
7525
7526 if (wrqu->power.disabled) {
7527 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode);
7528 err = ipw2100_set_power_mode(priv, IPW_POWER_MODE_CAM);
7529 IPW_DEBUG_WX("SET Power Management Mode -> off\n");
7530 goto done;
7531 }
7532
7533 switch (wrqu->power.flags & IW_POWER_MODE) {
7534 case IW_POWER_ON: /* If not specified */
7535 case IW_POWER_MODE: /* If set all mask */
7536 case IW_POWER_ALL_R: /* If explicitly state all */
7537 break;
7538 default: /* Otherwise we don't support it */
7539 IPW_DEBUG_WX("SET PM Mode: %X not supported.\n",
7540 wrqu->power.flags);
7541 err = -EOPNOTSUPP;
7542 goto done;
7543 }
7544
7545 /* If the user hasn't specified a power management mode yet, default
7546 * to BATTERY */
7547 priv->power_mode = IPW_POWER_ENABLED | priv->power_mode;
7548 err = ipw2100_set_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode));
7549
7550 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode);
7551
7552 done:
7553 mutex_unlock(&priv->action_mutex);
7554 return err;
7555
7556 }
7557
7558 static int ipw2100_wx_get_power(struct net_device *dev,
7559 struct iw_request_info *info,
7560 union iwreq_data *wrqu, char *extra)
7561 {
7562 /*
7563 * This can be called at any time. No action lock required
7564 */
7565
7566 struct ipw2100_priv *priv = libipw_priv(dev);
7567
7568 if (!(priv->power_mode & IPW_POWER_ENABLED))
7569 wrqu->power.disabled = 1;
7570 else {
7571 wrqu->power.disabled = 0;
7572 wrqu->power.flags = 0;
7573 }
7574
7575 IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode);
7576
7577 return 0;
7578 }
7579
7580 /*
7581 * WE-18 WPA support
7582 */
7583
7584 /* SIOCSIWGENIE */
7585 static int ipw2100_wx_set_genie(struct net_device *dev,
7586 struct iw_request_info *info,
7587 union iwreq_data *wrqu, char *extra)
7588 {
7589
7590 struct ipw2100_priv *priv = libipw_priv(dev);
7591 struct libipw_device *ieee = priv->ieee;
7592 u8 *buf;
7593
7594 if (!ieee->wpa_enabled)
7595 return -EOPNOTSUPP;
7596
7597 if (wrqu->data.length > MAX_WPA_IE_LEN ||
7598 (wrqu->data.length && extra == NULL))
7599 return -EINVAL;
7600
7601 if (wrqu->data.length) {
7602 buf = kmemdup(extra, wrqu->data.length, GFP_KERNEL);
7603 if (buf == NULL)
7604 return -ENOMEM;
7605
7606 kfree(ieee->wpa_ie);
7607 ieee->wpa_ie = buf;
7608 ieee->wpa_ie_len = wrqu->data.length;
7609 } else {
7610 kfree(ieee->wpa_ie);
7611 ieee->wpa_ie = NULL;
7612 ieee->wpa_ie_len = 0;
7613 }
7614
7615 ipw2100_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len);
7616
7617 return 0;
7618 }
7619
7620 /* SIOCGIWGENIE */
7621 static int ipw2100_wx_get_genie(struct net_device *dev,
7622 struct iw_request_info *info,
7623 union iwreq_data *wrqu, char *extra)
7624 {
7625 struct ipw2100_priv *priv = libipw_priv(dev);
7626 struct libipw_device *ieee = priv->ieee;
7627
7628 if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) {
7629 wrqu->data.length = 0;
7630 return 0;
7631 }
7632
7633 if (wrqu->data.length < ieee->wpa_ie_len)
7634 return -E2BIG;
7635
7636 wrqu->data.length = ieee->wpa_ie_len;
7637 memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len);
7638
7639 return 0;
7640 }
7641
7642 /* SIOCSIWAUTH */
7643 static int ipw2100_wx_set_auth(struct net_device *dev,
7644 struct iw_request_info *info,
7645 union iwreq_data *wrqu, char *extra)
7646 {
7647 struct ipw2100_priv *priv = libipw_priv(dev);
7648 struct libipw_device *ieee = priv->ieee;
7649 struct iw_param *param = &wrqu->param;
7650 struct lib80211_crypt_data *crypt;
7651 unsigned long flags;
7652 int ret = 0;
7653
7654 switch (param->flags & IW_AUTH_INDEX) {
7655 case IW_AUTH_WPA_VERSION:
7656 case IW_AUTH_CIPHER_PAIRWISE:
7657 case IW_AUTH_CIPHER_GROUP:
7658 case IW_AUTH_KEY_MGMT:
7659 /*
7660 * ipw2200 does not use these parameters
7661 */
7662 break;
7663
7664 case IW_AUTH_TKIP_COUNTERMEASURES:
7665 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx];
7666 if (!crypt || !crypt->ops->set_flags || !crypt->ops->get_flags)
7667 break;
7668
7669 flags = crypt->ops->get_flags(crypt->priv);
7670
7671 if (param->value)
7672 flags |= IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
7673 else
7674 flags &= ~IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
7675
7676 crypt->ops->set_flags(flags, crypt->priv);
7677
7678 break;
7679
7680 case IW_AUTH_DROP_UNENCRYPTED:{
7681 /* HACK:
7682 *
7683 * wpa_supplicant calls set_wpa_enabled when the driver
7684 * is loaded and unloaded, regardless of if WPA is being
7685 * used. No other calls are made which can be used to
7686 * determine if encryption will be used or not prior to
7687 * association being expected. If encryption is not being
7688 * used, drop_unencrypted is set to false, else true -- we
7689 * can use this to determine if the CAP_PRIVACY_ON bit should
7690 * be set.
7691 */
7692 struct libipw_security sec = {
7693 .flags = SEC_ENABLED,
7694 .enabled = param->value,
7695 };
7696 priv->ieee->drop_unencrypted = param->value;
7697 /* We only change SEC_LEVEL for open mode. Others
7698 * are set by ipw_wpa_set_encryption.
7699 */
7700 if (!param->value) {
7701 sec.flags |= SEC_LEVEL;
7702 sec.level = SEC_LEVEL_0;
7703 } else {
7704 sec.flags |= SEC_LEVEL;
7705 sec.level = SEC_LEVEL_1;
7706 }
7707 if (priv->ieee->set_security)
7708 priv->ieee->set_security(priv->ieee->dev, &sec);
7709 break;
7710 }
7711
7712 case IW_AUTH_80211_AUTH_ALG:
7713 ret = ipw2100_wpa_set_auth_algs(priv, param->value);
7714 break;
7715
7716 case IW_AUTH_WPA_ENABLED:
7717 ret = ipw2100_wpa_enable(priv, param->value);
7718 break;
7719
7720 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
7721 ieee->ieee802_1x = param->value;
7722 break;
7723
7724 //case IW_AUTH_ROAMING_CONTROL:
7725 case IW_AUTH_PRIVACY_INVOKED:
7726 ieee->privacy_invoked = param->value;
7727 break;
7728
7729 default:
7730 return -EOPNOTSUPP;
7731 }
7732 return ret;
7733 }
7734
7735 /* SIOCGIWAUTH */
7736 static int ipw2100_wx_get_auth(struct net_device *dev,
7737 struct iw_request_info *info,
7738 union iwreq_data *wrqu, char *extra)
7739 {
7740 struct ipw2100_priv *priv = libipw_priv(dev);
7741 struct libipw_device *ieee = priv->ieee;
7742 struct lib80211_crypt_data *crypt;
7743 struct iw_param *param = &wrqu->param;
7744 int ret = 0;
7745
7746 switch (param->flags & IW_AUTH_INDEX) {
7747 case IW_AUTH_WPA_VERSION:
7748 case IW_AUTH_CIPHER_PAIRWISE:
7749 case IW_AUTH_CIPHER_GROUP:
7750 case IW_AUTH_KEY_MGMT:
7751 /*
7752 * wpa_supplicant will control these internally
7753 */
7754 ret = -EOPNOTSUPP;
7755 break;
7756
7757 case IW_AUTH_TKIP_COUNTERMEASURES:
7758 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx];
7759 if (!crypt || !crypt->ops->get_flags) {
7760 IPW_DEBUG_WARNING("Can't get TKIP countermeasures: "
7761 "crypt not set!\n");
7762 break;
7763 }
7764
7765 param->value = (crypt->ops->get_flags(crypt->priv) &
7766 IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) ? 1 : 0;
7767
7768 break;
7769
7770 case IW_AUTH_DROP_UNENCRYPTED:
7771 param->value = ieee->drop_unencrypted;
7772 break;
7773
7774 case IW_AUTH_80211_AUTH_ALG:
7775 param->value = priv->ieee->sec.auth_mode;
7776 break;
7777
7778 case IW_AUTH_WPA_ENABLED:
7779 param->value = ieee->wpa_enabled;
7780 break;
7781
7782 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
7783 param->value = ieee->ieee802_1x;
7784 break;
7785
7786 case IW_AUTH_ROAMING_CONTROL:
7787 case IW_AUTH_PRIVACY_INVOKED:
7788 param->value = ieee->privacy_invoked;
7789 break;
7790
7791 default:
7792 return -EOPNOTSUPP;
7793 }
7794 return 0;
7795 }
7796
7797 /* SIOCSIWENCODEEXT */
7798 static int ipw2100_wx_set_encodeext(struct net_device *dev,
7799 struct iw_request_info *info,
7800 union iwreq_data *wrqu, char *extra)
7801 {
7802 struct ipw2100_priv *priv = libipw_priv(dev);
7803 return libipw_wx_set_encodeext(priv->ieee, info, wrqu, extra);
7804 }
7805
7806 /* SIOCGIWENCODEEXT */
7807 static int ipw2100_wx_get_encodeext(struct net_device *dev,
7808 struct iw_request_info *info,
7809 union iwreq_data *wrqu, char *extra)
7810 {
7811 struct ipw2100_priv *priv = libipw_priv(dev);
7812 return libipw_wx_get_encodeext(priv->ieee, info, wrqu, extra);
7813 }
7814
7815 /* SIOCSIWMLME */
7816 static int ipw2100_wx_set_mlme(struct net_device *dev,
7817 struct iw_request_info *info,
7818 union iwreq_data *wrqu, char *extra)
7819 {
7820 struct ipw2100_priv *priv = libipw_priv(dev);
7821 struct iw_mlme *mlme = (struct iw_mlme *)extra;
7822 __le16 reason;
7823
7824 reason = cpu_to_le16(mlme->reason_code);
7825
7826 switch (mlme->cmd) {
7827 case IW_MLME_DEAUTH:
7828 // silently ignore
7829 break;
7830
7831 case IW_MLME_DISASSOC:
7832 ipw2100_disassociate_bssid(priv);
7833 break;
7834
7835 default:
7836 return -EOPNOTSUPP;
7837 }
7838 return 0;
7839 }
7840
7841 /*
7842 *
7843 * IWPRIV handlers
7844 *
7845 */
7846 #ifdef CONFIG_IPW2100_MONITOR
7847 static int ipw2100_wx_set_promisc(struct net_device *dev,
7848 struct iw_request_info *info,
7849 union iwreq_data *wrqu, char *extra)
7850 {
7851 struct ipw2100_priv *priv = libipw_priv(dev);
7852 int *parms = (int *)extra;
7853 int enable = (parms[0] > 0);
7854 int err = 0;
7855
7856 mutex_lock(&priv->action_mutex);
7857 if (!(priv->status & STATUS_INITIALIZED)) {
7858 err = -EIO;
7859 goto done;
7860 }
7861
7862 if (enable) {
7863 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
7864 err = ipw2100_set_channel(priv, parms[1], 0);
7865 goto done;
7866 }
7867 priv->channel = parms[1];
7868 err = ipw2100_switch_mode(priv, IW_MODE_MONITOR);
7869 } else {
7870 if (priv->ieee->iw_mode == IW_MODE_MONITOR)
7871 err = ipw2100_switch_mode(priv, priv->last_mode);
7872 }
7873 done:
7874 mutex_unlock(&priv->action_mutex);
7875 return err;
7876 }
7877
7878 static int ipw2100_wx_reset(struct net_device *dev,
7879 struct iw_request_info *info,
7880 union iwreq_data *wrqu, char *extra)
7881 {
7882 struct ipw2100_priv *priv = libipw_priv(dev);
7883 if (priv->status & STATUS_INITIALIZED)
7884 schedule_reset(priv);
7885 return 0;
7886 }
7887
7888 #endif
7889
7890 static int ipw2100_wx_set_powermode(struct net_device *dev,
7891 struct iw_request_info *info,
7892 union iwreq_data *wrqu, char *extra)
7893 {
7894 struct ipw2100_priv *priv = libipw_priv(dev);
7895 int err = 0, mode = *(int *)extra;
7896
7897 mutex_lock(&priv->action_mutex);
7898 if (!(priv->status & STATUS_INITIALIZED)) {
7899 err = -EIO;
7900 goto done;
7901 }
7902
7903 if ((mode < 0) || (mode > POWER_MODES))
7904 mode = IPW_POWER_AUTO;
7905
7906 if (IPW_POWER_LEVEL(priv->power_mode) != mode)
7907 err = ipw2100_set_power_mode(priv, mode);
7908 done:
7909 mutex_unlock(&priv->action_mutex);
7910 return err;
7911 }
7912
7913 #define MAX_POWER_STRING 80
7914 static int ipw2100_wx_get_powermode(struct net_device *dev,
7915 struct iw_request_info *info,
7916 union iwreq_data *wrqu, char *extra)
7917 {
7918 /*
7919 * This can be called at any time. No action lock required
7920 */
7921
7922 struct ipw2100_priv *priv = libipw_priv(dev);
7923 int level = IPW_POWER_LEVEL(priv->power_mode);
7924 s32 timeout, period;
7925
7926 if (!(priv->power_mode & IPW_POWER_ENABLED)) {
7927 snprintf(extra, MAX_POWER_STRING,
7928 "Power save level: %d (Off)", level);
7929 } else {
7930 switch (level) {
7931 case IPW_POWER_MODE_CAM:
7932 snprintf(extra, MAX_POWER_STRING,
7933 "Power save level: %d (None)", level);
7934 break;
7935 case IPW_POWER_AUTO:
7936 snprintf(extra, MAX_POWER_STRING,
7937 "Power save level: %d (Auto)", level);
7938 break;
7939 default:
7940 timeout = timeout_duration[level - 1] / 1000;
7941 period = period_duration[level - 1] / 1000;
7942 snprintf(extra, MAX_POWER_STRING,
7943 "Power save level: %d "
7944 "(Timeout %dms, Period %dms)",
7945 level, timeout, period);
7946 }
7947 }
7948
7949 wrqu->data.length = strlen(extra) + 1;
7950
7951 return 0;
7952 }
7953
7954 static int ipw2100_wx_set_preamble(struct net_device *dev,
7955 struct iw_request_info *info,
7956 union iwreq_data *wrqu, char *extra)
7957 {
7958 struct ipw2100_priv *priv = libipw_priv(dev);
7959 int err, mode = *(int *)extra;
7960
7961 mutex_lock(&priv->action_mutex);
7962 if (!(priv->status & STATUS_INITIALIZED)) {
7963 err = -EIO;
7964 goto done;
7965 }
7966
7967 if (mode == 1)
7968 priv->config |= CFG_LONG_PREAMBLE;
7969 else if (mode == 0)
7970 priv->config &= ~CFG_LONG_PREAMBLE;
7971 else {
7972 err = -EINVAL;
7973 goto done;
7974 }
7975
7976 err = ipw2100_system_config(priv, 0);
7977
7978 done:
7979 mutex_unlock(&priv->action_mutex);
7980 return err;
7981 }
7982
7983 static int ipw2100_wx_get_preamble(struct net_device *dev,
7984 struct iw_request_info *info,
7985 union iwreq_data *wrqu, char *extra)
7986 {
7987 /*
7988 * This can be called at any time. No action lock required
7989 */
7990
7991 struct ipw2100_priv *priv = libipw_priv(dev);
7992
7993 if (priv->config & CFG_LONG_PREAMBLE)
7994 snprintf(wrqu->name, IFNAMSIZ, "long (1)");
7995 else
7996 snprintf(wrqu->name, IFNAMSIZ, "auto (0)");
7997
7998 return 0;
7999 }
8000
8001 #ifdef CONFIG_IPW2100_MONITOR
8002 static int ipw2100_wx_set_crc_check(struct net_device *dev,
8003 struct iw_request_info *info,
8004 union iwreq_data *wrqu, char *extra)
8005 {
8006 struct ipw2100_priv *priv = libipw_priv(dev);
8007 int err, mode = *(int *)extra;
8008
8009 mutex_lock(&priv->action_mutex);
8010 if (!(priv->status & STATUS_INITIALIZED)) {
8011 err = -EIO;
8012 goto done;
8013 }
8014
8015 if (mode == 1)
8016 priv->config |= CFG_CRC_CHECK;
8017 else if (mode == 0)
8018 priv->config &= ~CFG_CRC_CHECK;
8019 else {
8020 err = -EINVAL;
8021 goto done;
8022 }
8023 err = 0;
8024
8025 done:
8026 mutex_unlock(&priv->action_mutex);
8027 return err;
8028 }
8029
8030 static int ipw2100_wx_get_crc_check(struct net_device *dev,
8031 struct iw_request_info *info,
8032 union iwreq_data *wrqu, char *extra)
8033 {
8034 /*
8035 * This can be called at any time. No action lock required
8036 */
8037
8038 struct ipw2100_priv *priv = libipw_priv(dev);
8039
8040 if (priv->config & CFG_CRC_CHECK)
8041 snprintf(wrqu->name, IFNAMSIZ, "CRC checked (1)");
8042 else
8043 snprintf(wrqu->name, IFNAMSIZ, "CRC ignored (0)");
8044
8045 return 0;
8046 }
8047 #endif /* CONFIG_IPW2100_MONITOR */
8048
8049 static iw_handler ipw2100_wx_handlers[] = {
8050 IW_HANDLER(SIOCGIWNAME, ipw2100_wx_get_name),
8051 IW_HANDLER(SIOCSIWFREQ, ipw2100_wx_set_freq),
8052 IW_HANDLER(SIOCGIWFREQ, ipw2100_wx_get_freq),
8053 IW_HANDLER(SIOCSIWMODE, ipw2100_wx_set_mode),
8054 IW_HANDLER(SIOCGIWMODE, ipw2100_wx_get_mode),
8055 IW_HANDLER(SIOCGIWRANGE, ipw2100_wx_get_range),
8056 IW_HANDLER(SIOCSIWAP, ipw2100_wx_set_wap),
8057 IW_HANDLER(SIOCGIWAP, ipw2100_wx_get_wap),
8058 IW_HANDLER(SIOCSIWMLME, ipw2100_wx_set_mlme),
8059 IW_HANDLER(SIOCSIWSCAN, ipw2100_wx_set_scan),
8060 IW_HANDLER(SIOCGIWSCAN, ipw2100_wx_get_scan),
8061 IW_HANDLER(SIOCSIWESSID, ipw2100_wx_set_essid),
8062 IW_HANDLER(SIOCGIWESSID, ipw2100_wx_get_essid),
8063 IW_HANDLER(SIOCSIWNICKN, ipw2100_wx_set_nick),
8064 IW_HANDLER(SIOCGIWNICKN, ipw2100_wx_get_nick),
8065 IW_HANDLER(SIOCSIWRATE, ipw2100_wx_set_rate),
8066 IW_HANDLER(SIOCGIWRATE, ipw2100_wx_get_rate),
8067 IW_HANDLER(SIOCSIWRTS, ipw2100_wx_set_rts),
8068 IW_HANDLER(SIOCGIWRTS, ipw2100_wx_get_rts),
8069 IW_HANDLER(SIOCSIWFRAG, ipw2100_wx_set_frag),
8070 IW_HANDLER(SIOCGIWFRAG, ipw2100_wx_get_frag),
8071 IW_HANDLER(SIOCSIWTXPOW, ipw2100_wx_set_txpow),
8072 IW_HANDLER(SIOCGIWTXPOW, ipw2100_wx_get_txpow),
8073 IW_HANDLER(SIOCSIWRETRY, ipw2100_wx_set_retry),
8074 IW_HANDLER(SIOCGIWRETRY, ipw2100_wx_get_retry),
8075 IW_HANDLER(SIOCSIWENCODE, ipw2100_wx_set_encode),
8076 IW_HANDLER(SIOCGIWENCODE, ipw2100_wx_get_encode),
8077 IW_HANDLER(SIOCSIWPOWER, ipw2100_wx_set_power),
8078 IW_HANDLER(SIOCGIWPOWER, ipw2100_wx_get_power),
8079 IW_HANDLER(SIOCSIWGENIE, ipw2100_wx_set_genie),
8080 IW_HANDLER(SIOCGIWGENIE, ipw2100_wx_get_genie),
8081 IW_HANDLER(SIOCSIWAUTH, ipw2100_wx_set_auth),
8082 IW_HANDLER(SIOCGIWAUTH, ipw2100_wx_get_auth),
8083 IW_HANDLER(SIOCSIWENCODEEXT, ipw2100_wx_set_encodeext),
8084 IW_HANDLER(SIOCGIWENCODEEXT, ipw2100_wx_get_encodeext),
8085 };
8086
8087 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
8088 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
8089 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
8090 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
8091 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
8092 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
8093 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
8094 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
8095
8096 static const struct iw_priv_args ipw2100_private_args[] = {
8097
8098 #ifdef CONFIG_IPW2100_MONITOR
8099 {
8100 IPW2100_PRIV_SET_MONITOR,
8101 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "monitor"},
8102 {
8103 IPW2100_PRIV_RESET,
8104 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, "reset"},
8105 #endif /* CONFIG_IPW2100_MONITOR */
8106
8107 {
8108 IPW2100_PRIV_SET_POWER,
8109 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_power"},
8110 {
8111 IPW2100_PRIV_GET_POWER,
8112 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | MAX_POWER_STRING,
8113 "get_power"},
8114 {
8115 IPW2100_PRIV_SET_LONGPREAMBLE,
8116 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_preamble"},
8117 {
8118 IPW2100_PRIV_GET_LONGPREAMBLE,
8119 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "get_preamble"},
8120 #ifdef CONFIG_IPW2100_MONITOR
8121 {
8122 IPW2100_PRIV_SET_CRC_CHECK,
8123 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_crc_check"},
8124 {
8125 IPW2100_PRIV_GET_CRC_CHECK,
8126 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "get_crc_check"},
8127 #endif /* CONFIG_IPW2100_MONITOR */
8128 };
8129
8130 static iw_handler ipw2100_private_handler[] = {
8131 #ifdef CONFIG_IPW2100_MONITOR
8132 ipw2100_wx_set_promisc,
8133 ipw2100_wx_reset,
8134 #else /* CONFIG_IPW2100_MONITOR */
8135 NULL,
8136 NULL,
8137 #endif /* CONFIG_IPW2100_MONITOR */
8138 ipw2100_wx_set_powermode,
8139 ipw2100_wx_get_powermode,
8140 ipw2100_wx_set_preamble,
8141 ipw2100_wx_get_preamble,
8142 #ifdef CONFIG_IPW2100_MONITOR
8143 ipw2100_wx_set_crc_check,
8144 ipw2100_wx_get_crc_check,
8145 #else /* CONFIG_IPW2100_MONITOR */
8146 NULL,
8147 NULL,
8148 #endif /* CONFIG_IPW2100_MONITOR */
8149 };
8150
8151 /*
8152 * Get wireless statistics.
8153 * Called by /proc/net/wireless
8154 * Also called by SIOCGIWSTATS
8155 */
8156 static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev)
8157 {
8158 enum {
8159 POOR = 30,
8160 FAIR = 60,
8161 GOOD = 80,
8162 VERY_GOOD = 90,
8163 EXCELLENT = 95,
8164 PERFECT = 100
8165 };
8166 int rssi_qual;
8167 int tx_qual;
8168 int beacon_qual;
8169 int quality;
8170
8171 struct ipw2100_priv *priv = libipw_priv(dev);
8172 struct iw_statistics *wstats;
8173 u32 rssi, tx_retries, missed_beacons, tx_failures;
8174 u32 ord_len = sizeof(u32);
8175
8176 if (!priv)
8177 return (struct iw_statistics *)NULL;
8178
8179 wstats = &priv->wstats;
8180
8181 /* if hw is disabled, then ipw2100_get_ordinal() can't be called.
8182 * ipw2100_wx_wireless_stats seems to be called before fw is
8183 * initialized. STATUS_ASSOCIATED will only be set if the hw is up
8184 * and associated; if not associcated, the values are all meaningless
8185 * anyway, so set them all to NULL and INVALID */
8186 if (!(priv->status & STATUS_ASSOCIATED)) {
8187 wstats->miss.beacon = 0;
8188 wstats->discard.retries = 0;
8189 wstats->qual.qual = 0;
8190 wstats->qual.level = 0;
8191 wstats->qual.noise = 0;
8192 wstats->qual.updated = 7;
8193 wstats->qual.updated |= IW_QUAL_NOISE_INVALID |
8194 IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_INVALID;
8195 return wstats;
8196 }
8197
8198 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_PERCENT_MISSED_BCNS,
8199 &missed_beacons, &ord_len))
8200 goto fail_get_ordinal;
8201
8202 /* If we don't have a connection the quality and level is 0 */
8203 if (!(priv->status & STATUS_ASSOCIATED)) {
8204 wstats->qual.qual = 0;
8205 wstats->qual.level = 0;
8206 } else {
8207 if (ipw2100_get_ordinal(priv, IPW_ORD_RSSI_AVG_CURR,
8208 &rssi, &ord_len))
8209 goto fail_get_ordinal;
8210 wstats->qual.level = rssi + IPW2100_RSSI_TO_DBM;
8211 if (rssi < 10)
8212 rssi_qual = rssi * POOR / 10;
8213 else if (rssi < 15)
8214 rssi_qual = (rssi - 10) * (FAIR - POOR) / 5 + POOR;
8215 else if (rssi < 20)
8216 rssi_qual = (rssi - 15) * (GOOD - FAIR) / 5 + FAIR;
8217 else if (rssi < 30)
8218 rssi_qual = (rssi - 20) * (VERY_GOOD - GOOD) /
8219 10 + GOOD;
8220 else
8221 rssi_qual = (rssi - 30) * (PERFECT - VERY_GOOD) /
8222 10 + VERY_GOOD;
8223
8224 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_PERCENT_RETRIES,
8225 &tx_retries, &ord_len))
8226 goto fail_get_ordinal;
8227
8228 if (tx_retries > 75)
8229 tx_qual = (90 - tx_retries) * POOR / 15;
8230 else if (tx_retries > 70)
8231 tx_qual = (75 - tx_retries) * (FAIR - POOR) / 5 + POOR;
8232 else if (tx_retries > 65)
8233 tx_qual = (70 - tx_retries) * (GOOD - FAIR) / 5 + FAIR;
8234 else if (tx_retries > 50)
8235 tx_qual = (65 - tx_retries) * (VERY_GOOD - GOOD) /
8236 15 + GOOD;
8237 else
8238 tx_qual = (50 - tx_retries) *
8239 (PERFECT - VERY_GOOD) / 50 + VERY_GOOD;
8240
8241 if (missed_beacons > 50)
8242 beacon_qual = (60 - missed_beacons) * POOR / 10;
8243 else if (missed_beacons > 40)
8244 beacon_qual = (50 - missed_beacons) * (FAIR - POOR) /
8245 10 + POOR;
8246 else if (missed_beacons > 32)
8247 beacon_qual = (40 - missed_beacons) * (GOOD - FAIR) /
8248 18 + FAIR;
8249 else if (missed_beacons > 20)
8250 beacon_qual = (32 - missed_beacons) *
8251 (VERY_GOOD - GOOD) / 20 + GOOD;
8252 else
8253 beacon_qual = (20 - missed_beacons) *
8254 (PERFECT - VERY_GOOD) / 20 + VERY_GOOD;
8255
8256 quality = min(tx_qual, rssi_qual);
8257 quality = min(beacon_qual, quality);
8258
8259 #ifdef CONFIG_IPW2100_DEBUG
8260 if (beacon_qual == quality)
8261 IPW_DEBUG_WX("Quality clamped by Missed Beacons\n");
8262 else if (tx_qual == quality)
8263 IPW_DEBUG_WX("Quality clamped by Tx Retries\n");
8264 else if (quality != 100)
8265 IPW_DEBUG_WX("Quality clamped by Signal Strength\n");
8266 else
8267 IPW_DEBUG_WX("Quality not clamped.\n");
8268 #endif
8269
8270 wstats->qual.qual = quality;
8271 wstats->qual.level = rssi + IPW2100_RSSI_TO_DBM;
8272 }
8273
8274 wstats->qual.noise = 0;
8275 wstats->qual.updated = 7;
8276 wstats->qual.updated |= IW_QUAL_NOISE_INVALID;
8277
8278 /* FIXME: this is percent and not a # */
8279 wstats->miss.beacon = missed_beacons;
8280
8281 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_TX_FAILURES,
8282 &tx_failures, &ord_len))
8283 goto fail_get_ordinal;
8284 wstats->discard.retries = tx_failures;
8285
8286 return wstats;
8287
8288 fail_get_ordinal:
8289 IPW_DEBUG_WX("failed querying ordinals.\n");
8290
8291 return (struct iw_statistics *)NULL;
8292 }
8293
8294 static struct iw_handler_def ipw2100_wx_handler_def = {
8295 .standard = ipw2100_wx_handlers,
8296 .num_standard = ARRAY_SIZE(ipw2100_wx_handlers),
8297 .num_private = ARRAY_SIZE(ipw2100_private_handler),
8298 .num_private_args = ARRAY_SIZE(ipw2100_private_args),
8299 .private = (iw_handler *) ipw2100_private_handler,
8300 .private_args = (struct iw_priv_args *)ipw2100_private_args,
8301 .get_wireless_stats = ipw2100_wx_wireless_stats,
8302 };
8303
8304 static void ipw2100_wx_event_work(struct work_struct *work)
8305 {
8306 struct ipw2100_priv *priv =
8307 container_of(work, struct ipw2100_priv, wx_event_work.work);
8308 union iwreq_data wrqu;
8309 unsigned int len = ETH_ALEN;
8310
8311 if (priv->status & STATUS_STOPPING)
8312 return;
8313
8314 mutex_lock(&priv->action_mutex);
8315
8316 IPW_DEBUG_WX("enter\n");
8317
8318 mutex_unlock(&priv->action_mutex);
8319
8320 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
8321
8322 /* Fetch BSSID from the hardware */
8323 if (!(priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) ||
8324 priv->status & STATUS_RF_KILL_MASK ||
8325 ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID,
8326 &priv->bssid, &len)) {
8327 memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
8328 } else {
8329 /* We now have the BSSID, so can finish setting to the full
8330 * associated state */
8331 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN);
8332 memcpy(priv->ieee->bssid, priv->bssid, ETH_ALEN);
8333 priv->status &= ~STATUS_ASSOCIATING;
8334 priv->status |= STATUS_ASSOCIATED;
8335 netif_carrier_on(priv->net_dev);
8336 netif_wake_queue(priv->net_dev);
8337 }
8338
8339 if (!(priv->status & STATUS_ASSOCIATED)) {
8340 IPW_DEBUG_WX("Configuring ESSID\n");
8341 mutex_lock(&priv->action_mutex);
8342 /* This is a disassociation event, so kick the firmware to
8343 * look for another AP */
8344 if (priv->config & CFG_STATIC_ESSID)
8345 ipw2100_set_essid(priv, priv->essid, priv->essid_len,
8346 0);
8347 else
8348 ipw2100_set_essid(priv, NULL, 0, 0);
8349 mutex_unlock(&priv->action_mutex);
8350 }
8351
8352 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
8353 }
8354
8355 #define IPW2100_FW_MAJOR_VERSION 1
8356 #define IPW2100_FW_MINOR_VERSION 3
8357
8358 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
8359 #define IPW2100_FW_MAJOR(x) (x & 0xff)
8360
8361 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
8362 IPW2100_FW_MAJOR_VERSION)
8363
8364 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
8365 "." __stringify(IPW2100_FW_MINOR_VERSION)
8366
8367 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
8368
8369 /*
8370
8371 BINARY FIRMWARE HEADER FORMAT
8372
8373 offset length desc
8374 0 2 version
8375 2 2 mode == 0:BSS,1:IBSS,2:MONITOR
8376 4 4 fw_len
8377 8 4 uc_len
8378 C fw_len firmware data
8379 12 + fw_len uc_len microcode data
8380
8381 */
8382
8383 struct ipw2100_fw_header {
8384 short version;
8385 short mode;
8386 unsigned int fw_size;
8387 unsigned int uc_size;
8388 } __packed;
8389
8390 static int ipw2100_mod_firmware_load(struct ipw2100_fw *fw)
8391 {
8392 struct ipw2100_fw_header *h =
8393 (struct ipw2100_fw_header *)fw->fw_entry->data;
8394
8395 if (IPW2100_FW_MAJOR(h->version) != IPW2100_FW_MAJOR_VERSION) {
8396 printk(KERN_WARNING DRV_NAME ": Firmware image not compatible "
8397 "(detected version id of %u). "
8398 "See Documentation/networking/README.ipw2100\n",
8399 h->version);
8400 return 1;
8401 }
8402
8403 fw->version = h->version;
8404 fw->fw.data = fw->fw_entry->data + sizeof(struct ipw2100_fw_header);
8405 fw->fw.size = h->fw_size;
8406 fw->uc.data = fw->fw.data + h->fw_size;
8407 fw->uc.size = h->uc_size;
8408
8409 return 0;
8410 }
8411
8412 static int ipw2100_get_firmware(struct ipw2100_priv *priv,
8413 struct ipw2100_fw *fw)
8414 {
8415 char *fw_name;
8416 int rc;
8417
8418 IPW_DEBUG_INFO("%s: Using hotplug firmware load.\n",
8419 priv->net_dev->name);
8420
8421 switch (priv->ieee->iw_mode) {
8422 case IW_MODE_ADHOC:
8423 fw_name = IPW2100_FW_NAME("-i");
8424 break;
8425 #ifdef CONFIG_IPW2100_MONITOR
8426 case IW_MODE_MONITOR:
8427 fw_name = IPW2100_FW_NAME("-p");
8428 break;
8429 #endif
8430 case IW_MODE_INFRA:
8431 default:
8432 fw_name = IPW2100_FW_NAME("");
8433 break;
8434 }
8435
8436 rc = request_firmware(&fw->fw_entry, fw_name, &priv->pci_dev->dev);
8437
8438 if (rc < 0) {
8439 printk(KERN_ERR DRV_NAME ": "
8440 "%s: Firmware '%s' not available or load failed.\n",
8441 priv->net_dev->name, fw_name);
8442 return rc;
8443 }
8444 IPW_DEBUG_INFO("firmware data %p size %zd\n", fw->fw_entry->data,
8445 fw->fw_entry->size);
8446
8447 ipw2100_mod_firmware_load(fw);
8448
8449 return 0;
8450 }
8451
8452 MODULE_FIRMWARE(IPW2100_FW_NAME("-i"));
8453 #ifdef CONFIG_IPW2100_MONITOR
8454 MODULE_FIRMWARE(IPW2100_FW_NAME("-p"));
8455 #endif
8456 MODULE_FIRMWARE(IPW2100_FW_NAME(""));
8457
8458 static void ipw2100_release_firmware(struct ipw2100_priv *priv,
8459 struct ipw2100_fw *fw)
8460 {
8461 fw->version = 0;
8462 release_firmware(fw->fw_entry);
8463 fw->fw_entry = NULL;
8464 }
8465
8466 static int ipw2100_get_fwversion(struct ipw2100_priv *priv, char *buf,
8467 size_t max)
8468 {
8469 char ver[MAX_FW_VERSION_LEN];
8470 u32 len = MAX_FW_VERSION_LEN;
8471 u32 tmp;
8472 int i;
8473 /* firmware version is an ascii string (max len of 14) */
8474 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_FW_VER_NUM, ver, &len))
8475 return -EIO;
8476 tmp = max;
8477 if (len >= max)
8478 len = max - 1;
8479 for (i = 0; i < len; i++)
8480 buf[i] = ver[i];
8481 buf[i] = '\0';
8482 return tmp;
8483 }
8484
8485 static int ipw2100_get_ucodeversion(struct ipw2100_priv *priv, char *buf,
8486 size_t max)
8487 {
8488 u32 ver;
8489 u32 len = sizeof(ver);
8490 /* microcode version is a 32 bit integer */
8491 if (ipw2100_get_ordinal(priv, IPW_ORD_UCODE_VERSION, &ver, &len))
8492 return -EIO;
8493 return snprintf(buf, max, "%08X", ver);
8494 }
8495
8496 /*
8497 * On exit, the firmware will have been freed from the fw list
8498 */
8499 static int ipw2100_fw_download(struct ipw2100_priv *priv, struct ipw2100_fw *fw)
8500 {
8501 /* firmware is constructed of N contiguous entries, each entry is
8502 * structured as:
8503 *
8504 * offset sie desc
8505 * 0 4 address to write to
8506 * 4 2 length of data run
8507 * 6 length data
8508 */
8509 unsigned int addr;
8510 unsigned short len;
8511
8512 const unsigned char *firmware_data = fw->fw.data;
8513 unsigned int firmware_data_left = fw->fw.size;
8514
8515 while (firmware_data_left > 0) {
8516 addr = *(u32 *) (firmware_data);
8517 firmware_data += 4;
8518 firmware_data_left -= 4;
8519
8520 len = *(u16 *) (firmware_data);
8521 firmware_data += 2;
8522 firmware_data_left -= 2;
8523
8524 if (len > 32) {
8525 printk(KERN_ERR DRV_NAME ": "
8526 "Invalid firmware run-length of %d bytes\n",
8527 len);
8528 return -EINVAL;
8529 }
8530
8531 write_nic_memory(priv->net_dev, addr, len, firmware_data);
8532 firmware_data += len;
8533 firmware_data_left -= len;
8534 }
8535
8536 return 0;
8537 }
8538
8539 struct symbol_alive_response {
8540 u8 cmd_id;
8541 u8 seq_num;
8542 u8 ucode_rev;
8543 u8 eeprom_valid;
8544 u16 valid_flags;
8545 u8 IEEE_addr[6];
8546 u16 flags;
8547 u16 pcb_rev;
8548 u16 clock_settle_time; // 1us LSB
8549 u16 powerup_settle_time; // 1us LSB
8550 u16 hop_settle_time; // 1us LSB
8551 u8 date[3]; // month, day, year
8552 u8 time[2]; // hours, minutes
8553 u8 ucode_valid;
8554 };
8555
8556 static int ipw2100_ucode_download(struct ipw2100_priv *priv,
8557 struct ipw2100_fw *fw)
8558 {
8559 struct net_device *dev = priv->net_dev;
8560 const unsigned char *microcode_data = fw->uc.data;
8561 unsigned int microcode_data_left = fw->uc.size;
8562 void __iomem *reg = priv->ioaddr;
8563
8564 struct symbol_alive_response response;
8565 int i, j;
8566 u8 data;
8567
8568 /* Symbol control */
8569 write_nic_word(dev, IPW2100_CONTROL_REG, 0x703);
8570 readl(reg);
8571 write_nic_word(dev, IPW2100_CONTROL_REG, 0x707);
8572 readl(reg);
8573
8574 /* HW config */
8575 write_nic_byte(dev, 0x210014, 0x72); /* fifo width =16 */
8576 readl(reg);
8577 write_nic_byte(dev, 0x210014, 0x72); /* fifo width =16 */
8578 readl(reg);
8579
8580 /* EN_CS_ACCESS bit to reset control store pointer */
8581 write_nic_byte(dev, 0x210000, 0x40);
8582 readl(reg);
8583 write_nic_byte(dev, 0x210000, 0x0);
8584 readl(reg);
8585 write_nic_byte(dev, 0x210000, 0x40);
8586 readl(reg);
8587
8588 /* copy microcode from buffer into Symbol */
8589
8590 while (microcode_data_left > 0) {
8591 write_nic_byte(dev, 0x210010, *microcode_data++);
8592 write_nic_byte(dev, 0x210010, *microcode_data++);
8593 microcode_data_left -= 2;
8594 }
8595
8596 /* EN_CS_ACCESS bit to reset the control store pointer */
8597 write_nic_byte(dev, 0x210000, 0x0);
8598 readl(reg);
8599
8600 /* Enable System (Reg 0)
8601 * first enable causes garbage in RX FIFO */
8602 write_nic_byte(dev, 0x210000, 0x0);
8603 readl(reg);
8604 write_nic_byte(dev, 0x210000, 0x80);
8605 readl(reg);
8606
8607 /* Reset External Baseband Reg */
8608 write_nic_word(dev, IPW2100_CONTROL_REG, 0x703);
8609 readl(reg);
8610 write_nic_word(dev, IPW2100_CONTROL_REG, 0x707);
8611 readl(reg);
8612
8613 /* HW Config (Reg 5) */
8614 write_nic_byte(dev, 0x210014, 0x72); // fifo width =16
8615 readl(reg);
8616 write_nic_byte(dev, 0x210014, 0x72); // fifo width =16
8617 readl(reg);
8618
8619 /* Enable System (Reg 0)
8620 * second enable should be OK */
8621 write_nic_byte(dev, 0x210000, 0x00); // clear enable system
8622 readl(reg);
8623 write_nic_byte(dev, 0x210000, 0x80); // set enable system
8624
8625 /* check Symbol is enabled - upped this from 5 as it wasn't always
8626 * catching the update */
8627 for (i = 0; i < 10; i++) {
8628 udelay(10);
8629
8630 /* check Dino is enabled bit */
8631 read_nic_byte(dev, 0x210000, &data);
8632 if (data & 0x1)
8633 break;
8634 }
8635
8636 if (i == 10) {
8637 printk(KERN_ERR DRV_NAME ": %s: Error initializing Symbol\n",
8638 dev->name);
8639 return -EIO;
8640 }
8641
8642 /* Get Symbol alive response */
8643 for (i = 0; i < 30; i++) {
8644 /* Read alive response structure */
8645 for (j = 0;
8646 j < (sizeof(struct symbol_alive_response) >> 1); j++)
8647 read_nic_word(dev, 0x210004, ((u16 *) & response) + j);
8648
8649 if ((response.cmd_id == 1) && (response.ucode_valid == 0x1))
8650 break;
8651 udelay(10);
8652 }
8653
8654 if (i == 30) {
8655 printk(KERN_ERR DRV_NAME
8656 ": %s: No response from Symbol - hw not alive\n",
8657 dev->name);
8658 printk_buf(IPW_DL_ERROR, (u8 *) & response, sizeof(response));
8659 return -EIO;
8660 }
8661
8662 return 0;
8663 }
8664
8665
8666
8667
8668
8669 /* LDV_COMMENT_BEGIN_MAIN */
8670 #ifdef LDV_MAIN0_sequence_infinite_withcheck_stateful
8671
8672 /*###########################################################################*/
8673
8674 /*############## Driver Environment Generator 0.2 output ####################*/
8675
8676 /*###########################################################################*/
8677
8678
8679
8680 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test if all kernel resources are correctly released by driver before driver will be unloaded. */
8681 void ldv_check_final_state(void);
8682
8683 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test correct return result. */
8684 void ldv_check_return_value(int res);
8685
8686 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test correct return result of probe() function. */
8687 void ldv_check_return_value_probe(int res);
8688
8689 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Initializes the model. */
8690 void ldv_initialize(void);
8691
8692 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Reinitializes the model between distinct model function calls. */
8693 void ldv_handler_precall(void);
8694
8695 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Returns arbitrary interger value. */
8696 int nondet_int(void);
8697
8698 /* LDV_COMMENT_VAR_DECLARE_LDV Special variable for LDV verifier. */
8699 int LDV_IN_INTERRUPT;
8700
8701 /* LDV_COMMENT_FUNCTION_MAIN Main function for LDV verifier. */
8702 void ldv_main0_sequence_infinite_withcheck_stateful(void) {
8703
8704
8705
8706 /* LDV_COMMENT_BEGIN_VARIABLE_DECLARATION_PART */
8707 /*============================= VARIABLE DECLARATION PART =============================*/
8708 /** STRUCT: struct type: ethtool_ops, struct name: ipw2100_ethtool_ops **/
8709 /* content: static u32 ipw2100_ethtool_get_link(struct net_device *dev)*/
8710 /* LDV_COMMENT_BEGIN_PREP */
8711 #define IPW2100_VERSION "git-1.2.2"
8712 #define DRV_NAME "ipw2100"
8713 #define DRV_VERSION IPW2100_VERSION
8714 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
8715 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
8716 #ifdef CONFIG_IPW2100_DEBUG
8717 #define IPW2100_RX_DEBUG
8718 #endif
8719 #ifdef CONFIG_PM
8720 #endif
8721 #ifdef CONFIG_IPW2100_DEBUG
8722 #define IPW_DEBUG(level, message...) \
8723 do { \
8724 if (ipw2100_debug_level & (level)) { \
8725 printk(KERN_DEBUG "ipw2100: %c %s ", \
8726 in_interrupt() ? 'I' : 'U', __func__); \
8727 printk(message); \
8728 } \
8729 } while (0)
8730 #else
8731 #define IPW_DEBUG(level, message...) do {} while (0)
8732 #endif
8733 #ifdef CONFIG_IPW2100_DEBUG
8734 #endif
8735 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
8736 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
8737 #define MAX_RESET_BACKOFF 10
8738 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
8739 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
8740 #ifndef CONFIG_PM
8741 #endif
8742 #ifdef CONFIG_PM
8743 #else
8744 #endif
8745 #ifndef CONFIG_PM
8746 #endif
8747 #define MAX_RF_KILL_CHECKS 5
8748 #define RF_KILL_CHECK_DELAY 40
8749 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
8750 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
8751 #define MAC_ASSOCIATION_READ_DELAY (HZ)
8752 #ifdef CONFIG_IPW2100_DEBUG
8753 #define IPW2100_HANDLER(v, f) { v, f, # v }
8754 #else
8755 #define IPW2100_HANDLER(v, f) { v, f }
8756 #endif
8757 #ifdef CONFIG_IPW2100_DEBUG
8758 #endif
8759 #ifdef CONFIG_IPW2100_DEBUG
8760 #endif
8761 #define SEARCH_ERROR 0xffffffff
8762 #define SEARCH_FAIL 0xfffffffe
8763 #define SEARCH_SUCCESS 0xfffffff0
8764 #define SEARCH_DISCARD 0
8765 #define SEARCH_SNAPSHOT 1
8766 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
8767 #ifdef IPW2100_DEBUG_C3
8768 #endif
8769 #ifdef IPW2100_RX_DEBUG
8770 #endif
8771 #ifdef IPW2100_DEBUG_C3
8772 #endif
8773 #ifdef IPW2100_DEBUG_C3
8774 #endif
8775 #ifdef IPW2100_RX_DEBUG
8776 #endif
8777 #ifdef IPW2100_RX_DEBUG
8778 #endif
8779 #ifdef CONFIG_IPW2100_MONITOR
8780 #endif
8781 #ifdef CONFIG_IPW2100_MONITOR
8782 #else
8783 #endif
8784 #ifdef CONFIG_IPW2100_MONITOR
8785 #endif
8786 #ifdef CONFIG_IPW2100_DEBUG
8787 #endif
8788 #ifdef CONFIG_IPW2100_DEBUG
8789 #endif
8790 #ifdef CONFIG_IPW2100_DEBUG
8791 #endif
8792 #define IPW2100_REG(x) { IPW_ ##x, #x }
8793 #define IPW2100_NIC(x, s) { x, #x, s }
8794 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
8795 #ifdef CONFIG_IPW2100_DEBUG
8796 #endif
8797 #ifdef CONFIG_IPW2100_MONITOR
8798 #endif
8799 #ifdef CONFIG_PM
8800 #endif
8801 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
8802 #ifdef CONFIG_IPW2100_DEBUG
8803 #endif
8804 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
8805 #endif
8806 #ifdef IPW2100_TX_POWER
8807 #endif
8808 #if 0
8809 #endif
8810 #ifdef CONFIG_IPW2100_DEBUG
8811 #endif
8812 #define IPW_PRIVACY_CAPABLE 0x0008
8813 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
8814 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
8815 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
8816 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
8817 #ifdef CONFIG_IPW2100_MONITOR
8818 #endif
8819 #ifdef CONFIG_IPW2100_MONITOR
8820 #endif
8821 /* LDV_COMMENT_END_PREP */
8822 /* LDV_COMMENT_VAR_DECLARE Variable declaration for function "ipw2100_ethtool_get_link" */
8823 struct net_device * var_group1;
8824 /* LDV_COMMENT_BEGIN_PREP */
8825 #ifdef CONFIG_IPW2100_MONITOR
8826 #endif
8827 #ifdef CONFIG_IPW2100_MONITOR
8828 #endif
8829 #ifdef CONFIG_PM
8830 #endif
8831 #ifdef CONFIG_PM
8832 #endif
8833 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
8834 #ifdef CONFIG_PM
8835 #endif
8836 #ifdef CONFIG_IPW2100_DEBUG
8837 #endif
8838 #ifdef CONFIG_IPW2100_DEBUG
8839 #endif
8840 #ifdef CONFIG_IPW2100_MONITOR
8841 #endif
8842 #define POWER_MODES 5
8843 #ifdef CONFIG_IPW2100_MONITOR
8844 #endif
8845 #define MAX_POWER_STRING 80
8846 #ifdef CONFIG_IPW2100_MONITOR
8847 #endif
8848 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
8849 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
8850 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
8851 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
8852 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
8853 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
8854 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
8855 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
8856 #ifdef CONFIG_IPW2100_MONITOR
8857 #endif
8858 #ifdef CONFIG_IPW2100_MONITOR
8859 #endif
8860 #ifdef CONFIG_IPW2100_MONITOR
8861 #else
8862 #endif
8863 #ifdef CONFIG_IPW2100_MONITOR
8864 #else
8865 #endif
8866 #ifdef CONFIG_IPW2100_DEBUG
8867 #endif
8868 #define IPW2100_FW_MAJOR_VERSION 1
8869 #define IPW2100_FW_MINOR_VERSION 3
8870 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
8871 #define IPW2100_FW_MAJOR(x) (x & 0xff)
8872 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
8873 IPW2100_FW_MAJOR_VERSION)
8874 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
8875 "." __stringify(IPW2100_FW_MINOR_VERSION)
8876 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
8877 #ifdef CONFIG_IPW2100_MONITOR
8878 #endif
8879 #ifdef CONFIG_IPW2100_MONITOR
8880 #endif
8881 /* LDV_COMMENT_END_PREP */
8882 /* content: static void ipw_ethtool_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)*/
8883 /* LDV_COMMENT_BEGIN_PREP */
8884 #define IPW2100_VERSION "git-1.2.2"
8885 #define DRV_NAME "ipw2100"
8886 #define DRV_VERSION IPW2100_VERSION
8887 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
8888 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
8889 #ifdef CONFIG_IPW2100_DEBUG
8890 #define IPW2100_RX_DEBUG
8891 #endif
8892 #ifdef CONFIG_PM
8893 #endif
8894 #ifdef CONFIG_IPW2100_DEBUG
8895 #define IPW_DEBUG(level, message...) \
8896 do { \
8897 if (ipw2100_debug_level & (level)) { \
8898 printk(KERN_DEBUG "ipw2100: %c %s ", \
8899 in_interrupt() ? 'I' : 'U', __func__); \
8900 printk(message); \
8901 } \
8902 } while (0)
8903 #else
8904 #define IPW_DEBUG(level, message...) do {} while (0)
8905 #endif
8906 #ifdef CONFIG_IPW2100_DEBUG
8907 #endif
8908 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
8909 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
8910 #define MAX_RESET_BACKOFF 10
8911 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
8912 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
8913 #ifndef CONFIG_PM
8914 #endif
8915 #ifdef CONFIG_PM
8916 #else
8917 #endif
8918 #ifndef CONFIG_PM
8919 #endif
8920 #define MAX_RF_KILL_CHECKS 5
8921 #define RF_KILL_CHECK_DELAY 40
8922 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
8923 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
8924 #define MAC_ASSOCIATION_READ_DELAY (HZ)
8925 #ifdef CONFIG_IPW2100_DEBUG
8926 #define IPW2100_HANDLER(v, f) { v, f, # v }
8927 #else
8928 #define IPW2100_HANDLER(v, f) { v, f }
8929 #endif
8930 #ifdef CONFIG_IPW2100_DEBUG
8931 #endif
8932 #ifdef CONFIG_IPW2100_DEBUG
8933 #endif
8934 #define SEARCH_ERROR 0xffffffff
8935 #define SEARCH_FAIL 0xfffffffe
8936 #define SEARCH_SUCCESS 0xfffffff0
8937 #define SEARCH_DISCARD 0
8938 #define SEARCH_SNAPSHOT 1
8939 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
8940 #ifdef IPW2100_DEBUG_C3
8941 #endif
8942 #ifdef IPW2100_RX_DEBUG
8943 #endif
8944 #ifdef IPW2100_DEBUG_C3
8945 #endif
8946 #ifdef IPW2100_DEBUG_C3
8947 #endif
8948 #ifdef IPW2100_RX_DEBUG
8949 #endif
8950 #ifdef IPW2100_RX_DEBUG
8951 #endif
8952 #ifdef CONFIG_IPW2100_MONITOR
8953 #endif
8954 #ifdef CONFIG_IPW2100_MONITOR
8955 #else
8956 #endif
8957 #ifdef CONFIG_IPW2100_MONITOR
8958 #endif
8959 #ifdef CONFIG_IPW2100_DEBUG
8960 #endif
8961 #ifdef CONFIG_IPW2100_DEBUG
8962 #endif
8963 #ifdef CONFIG_IPW2100_DEBUG
8964 #endif
8965 #define IPW2100_REG(x) { IPW_ ##x, #x }
8966 #define IPW2100_NIC(x, s) { x, #x, s }
8967 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
8968 #ifdef CONFIG_IPW2100_DEBUG
8969 #endif
8970 #ifdef CONFIG_IPW2100_MONITOR
8971 #endif
8972 #ifdef CONFIG_PM
8973 #endif
8974 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
8975 #ifdef CONFIG_IPW2100_DEBUG
8976 #endif
8977 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
8978 #endif
8979 #ifdef IPW2100_TX_POWER
8980 #endif
8981 #if 0
8982 #endif
8983 #ifdef CONFIG_IPW2100_DEBUG
8984 #endif
8985 #define IPW_PRIVACY_CAPABLE 0x0008
8986 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
8987 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
8988 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
8989 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
8990 #ifdef CONFIG_IPW2100_MONITOR
8991 #endif
8992 #ifdef CONFIG_IPW2100_MONITOR
8993 #endif
8994 /* LDV_COMMENT_END_PREP */
8995 /* LDV_COMMENT_VAR_DECLARE Variable declaration for function "ipw_ethtool_get_drvinfo" */
8996 struct ethtool_drvinfo * var_group2;
8997 /* LDV_COMMENT_BEGIN_PREP */
8998 #ifdef CONFIG_IPW2100_MONITOR
8999 #endif
9000 #ifdef CONFIG_IPW2100_MONITOR
9001 #endif
9002 #ifdef CONFIG_PM
9003 #endif
9004 #ifdef CONFIG_PM
9005 #endif
9006 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
9007 #ifdef CONFIG_PM
9008 #endif
9009 #ifdef CONFIG_IPW2100_DEBUG
9010 #endif
9011 #ifdef CONFIG_IPW2100_DEBUG
9012 #endif
9013 #ifdef CONFIG_IPW2100_MONITOR
9014 #endif
9015 #define POWER_MODES 5
9016 #ifdef CONFIG_IPW2100_MONITOR
9017 #endif
9018 #define MAX_POWER_STRING 80
9019 #ifdef CONFIG_IPW2100_MONITOR
9020 #endif
9021 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
9022 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
9023 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
9024 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
9025 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
9026 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
9027 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
9028 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
9029 #ifdef CONFIG_IPW2100_MONITOR
9030 #endif
9031 #ifdef CONFIG_IPW2100_MONITOR
9032 #endif
9033 #ifdef CONFIG_IPW2100_MONITOR
9034 #else
9035 #endif
9036 #ifdef CONFIG_IPW2100_MONITOR
9037 #else
9038 #endif
9039 #ifdef CONFIG_IPW2100_DEBUG
9040 #endif
9041 #define IPW2100_FW_MAJOR_VERSION 1
9042 #define IPW2100_FW_MINOR_VERSION 3
9043 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
9044 #define IPW2100_FW_MAJOR(x) (x & 0xff)
9045 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
9046 IPW2100_FW_MAJOR_VERSION)
9047 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
9048 "." __stringify(IPW2100_FW_MINOR_VERSION)
9049 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
9050 #ifdef CONFIG_IPW2100_MONITOR
9051 #endif
9052 #ifdef CONFIG_IPW2100_MONITOR
9053 #endif
9054 /* LDV_COMMENT_END_PREP */
9055
9056 /** STRUCT: struct type: net_device_ops, struct name: ipw2100_netdev_ops **/
9057 /* content: static int ipw2100_open(struct net_device *dev)*/
9058 /* LDV_COMMENT_BEGIN_PREP */
9059 #define IPW2100_VERSION "git-1.2.2"
9060 #define DRV_NAME "ipw2100"
9061 #define DRV_VERSION IPW2100_VERSION
9062 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
9063 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
9064 #ifdef CONFIG_IPW2100_DEBUG
9065 #define IPW2100_RX_DEBUG
9066 #endif
9067 #ifdef CONFIG_PM
9068 #endif
9069 #ifdef CONFIG_IPW2100_DEBUG
9070 #define IPW_DEBUG(level, message...) \
9071 do { \
9072 if (ipw2100_debug_level & (level)) { \
9073 printk(KERN_DEBUG "ipw2100: %c %s ", \
9074 in_interrupt() ? 'I' : 'U', __func__); \
9075 printk(message); \
9076 } \
9077 } while (0)
9078 #else
9079 #define IPW_DEBUG(level, message...) do {} while (0)
9080 #endif
9081 #ifdef CONFIG_IPW2100_DEBUG
9082 #endif
9083 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
9084 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
9085 #define MAX_RESET_BACKOFF 10
9086 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
9087 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
9088 #ifndef CONFIG_PM
9089 #endif
9090 #ifdef CONFIG_PM
9091 #else
9092 #endif
9093 #ifndef CONFIG_PM
9094 #endif
9095 #define MAX_RF_KILL_CHECKS 5
9096 #define RF_KILL_CHECK_DELAY 40
9097 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
9098 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
9099 #define MAC_ASSOCIATION_READ_DELAY (HZ)
9100 #ifdef CONFIG_IPW2100_DEBUG
9101 #define IPW2100_HANDLER(v, f) { v, f, # v }
9102 #else
9103 #define IPW2100_HANDLER(v, f) { v, f }
9104 #endif
9105 #ifdef CONFIG_IPW2100_DEBUG
9106 #endif
9107 #ifdef CONFIG_IPW2100_DEBUG
9108 #endif
9109 #define SEARCH_ERROR 0xffffffff
9110 #define SEARCH_FAIL 0xfffffffe
9111 #define SEARCH_SUCCESS 0xfffffff0
9112 #define SEARCH_DISCARD 0
9113 #define SEARCH_SNAPSHOT 1
9114 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
9115 #ifdef IPW2100_DEBUG_C3
9116 #endif
9117 #ifdef IPW2100_RX_DEBUG
9118 #endif
9119 #ifdef IPW2100_DEBUG_C3
9120 #endif
9121 #ifdef IPW2100_DEBUG_C3
9122 #endif
9123 #ifdef IPW2100_RX_DEBUG
9124 #endif
9125 #ifdef IPW2100_RX_DEBUG
9126 #endif
9127 #ifdef CONFIG_IPW2100_MONITOR
9128 #endif
9129 #ifdef CONFIG_IPW2100_MONITOR
9130 #else
9131 #endif
9132 #ifdef CONFIG_IPW2100_MONITOR
9133 #endif
9134 #ifdef CONFIG_IPW2100_DEBUG
9135 #endif
9136 #ifdef CONFIG_IPW2100_DEBUG
9137 #endif
9138 #ifdef CONFIG_IPW2100_DEBUG
9139 #endif
9140 #define IPW2100_REG(x) { IPW_ ##x, #x }
9141 #define IPW2100_NIC(x, s) { x, #x, s }
9142 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
9143 #ifdef CONFIG_IPW2100_DEBUG
9144 #endif
9145 #ifdef CONFIG_IPW2100_MONITOR
9146 #endif
9147 #ifdef CONFIG_PM
9148 #endif
9149 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
9150 #ifdef CONFIG_IPW2100_DEBUG
9151 #endif
9152 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
9153 #endif
9154 #ifdef IPW2100_TX_POWER
9155 #endif
9156 #if 0
9157 #endif
9158 #ifdef CONFIG_IPW2100_DEBUG
9159 #endif
9160 #define IPW_PRIVACY_CAPABLE 0x0008
9161 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
9162 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
9163 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
9164 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
9165 #ifdef CONFIG_IPW2100_MONITOR
9166 #endif
9167 /* LDV_COMMENT_END_PREP */
9168 /* LDV_COMMENT_VAR_DECLARE Variable declaration for test return result from function call "ipw2100_open" */
9169 static int res_ipw2100_open_136;
9170 /* LDV_COMMENT_BEGIN_PREP */
9171 #ifdef CONFIG_IPW2100_MONITOR
9172 #endif
9173 #ifdef CONFIG_IPW2100_MONITOR
9174 #endif
9175 #ifdef CONFIG_IPW2100_MONITOR
9176 #endif
9177 #ifdef CONFIG_PM
9178 #endif
9179 #ifdef CONFIG_PM
9180 #endif
9181 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
9182 #ifdef CONFIG_PM
9183 #endif
9184 #ifdef CONFIG_IPW2100_DEBUG
9185 #endif
9186 #ifdef CONFIG_IPW2100_DEBUG
9187 #endif
9188 #ifdef CONFIG_IPW2100_MONITOR
9189 #endif
9190 #define POWER_MODES 5
9191 #ifdef CONFIG_IPW2100_MONITOR
9192 #endif
9193 #define MAX_POWER_STRING 80
9194 #ifdef CONFIG_IPW2100_MONITOR
9195 #endif
9196 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
9197 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
9198 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
9199 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
9200 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
9201 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
9202 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
9203 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
9204 #ifdef CONFIG_IPW2100_MONITOR
9205 #endif
9206 #ifdef CONFIG_IPW2100_MONITOR
9207 #endif
9208 #ifdef CONFIG_IPW2100_MONITOR
9209 #else
9210 #endif
9211 #ifdef CONFIG_IPW2100_MONITOR
9212 #else
9213 #endif
9214 #ifdef CONFIG_IPW2100_DEBUG
9215 #endif
9216 #define IPW2100_FW_MAJOR_VERSION 1
9217 #define IPW2100_FW_MINOR_VERSION 3
9218 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
9219 #define IPW2100_FW_MAJOR(x) (x & 0xff)
9220 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
9221 IPW2100_FW_MAJOR_VERSION)
9222 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
9223 "." __stringify(IPW2100_FW_MINOR_VERSION)
9224 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
9225 #ifdef CONFIG_IPW2100_MONITOR
9226 #endif
9227 #ifdef CONFIG_IPW2100_MONITOR
9228 #endif
9229 /* LDV_COMMENT_END_PREP */
9230 /* content: static int ipw2100_close(struct net_device *dev)*/
9231 /* LDV_COMMENT_BEGIN_PREP */
9232 #define IPW2100_VERSION "git-1.2.2"
9233 #define DRV_NAME "ipw2100"
9234 #define DRV_VERSION IPW2100_VERSION
9235 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
9236 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
9237 #ifdef CONFIG_IPW2100_DEBUG
9238 #define IPW2100_RX_DEBUG
9239 #endif
9240 #ifdef CONFIG_PM
9241 #endif
9242 #ifdef CONFIG_IPW2100_DEBUG
9243 #define IPW_DEBUG(level, message...) \
9244 do { \
9245 if (ipw2100_debug_level & (level)) { \
9246 printk(KERN_DEBUG "ipw2100: %c %s ", \
9247 in_interrupt() ? 'I' : 'U', __func__); \
9248 printk(message); \
9249 } \
9250 } while (0)
9251 #else
9252 #define IPW_DEBUG(level, message...) do {} while (0)
9253 #endif
9254 #ifdef CONFIG_IPW2100_DEBUG
9255 #endif
9256 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
9257 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
9258 #define MAX_RESET_BACKOFF 10
9259 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
9260 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
9261 #ifndef CONFIG_PM
9262 #endif
9263 #ifdef CONFIG_PM
9264 #else
9265 #endif
9266 #ifndef CONFIG_PM
9267 #endif
9268 #define MAX_RF_KILL_CHECKS 5
9269 #define RF_KILL_CHECK_DELAY 40
9270 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
9271 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
9272 #define MAC_ASSOCIATION_READ_DELAY (HZ)
9273 #ifdef CONFIG_IPW2100_DEBUG
9274 #define IPW2100_HANDLER(v, f) { v, f, # v }
9275 #else
9276 #define IPW2100_HANDLER(v, f) { v, f }
9277 #endif
9278 #ifdef CONFIG_IPW2100_DEBUG
9279 #endif
9280 #ifdef CONFIG_IPW2100_DEBUG
9281 #endif
9282 #define SEARCH_ERROR 0xffffffff
9283 #define SEARCH_FAIL 0xfffffffe
9284 #define SEARCH_SUCCESS 0xfffffff0
9285 #define SEARCH_DISCARD 0
9286 #define SEARCH_SNAPSHOT 1
9287 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
9288 #ifdef IPW2100_DEBUG_C3
9289 #endif
9290 #ifdef IPW2100_RX_DEBUG
9291 #endif
9292 #ifdef IPW2100_DEBUG_C3
9293 #endif
9294 #ifdef IPW2100_DEBUG_C3
9295 #endif
9296 #ifdef IPW2100_RX_DEBUG
9297 #endif
9298 #ifdef IPW2100_RX_DEBUG
9299 #endif
9300 #ifdef CONFIG_IPW2100_MONITOR
9301 #endif
9302 #ifdef CONFIG_IPW2100_MONITOR
9303 #else
9304 #endif
9305 #ifdef CONFIG_IPW2100_MONITOR
9306 #endif
9307 #ifdef CONFIG_IPW2100_DEBUG
9308 #endif
9309 #ifdef CONFIG_IPW2100_DEBUG
9310 #endif
9311 #ifdef CONFIG_IPW2100_DEBUG
9312 #endif
9313 #define IPW2100_REG(x) { IPW_ ##x, #x }
9314 #define IPW2100_NIC(x, s) { x, #x, s }
9315 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
9316 #ifdef CONFIG_IPW2100_DEBUG
9317 #endif
9318 #ifdef CONFIG_IPW2100_MONITOR
9319 #endif
9320 #ifdef CONFIG_PM
9321 #endif
9322 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
9323 #ifdef CONFIG_IPW2100_DEBUG
9324 #endif
9325 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
9326 #endif
9327 #ifdef IPW2100_TX_POWER
9328 #endif
9329 #if 0
9330 #endif
9331 #ifdef CONFIG_IPW2100_DEBUG
9332 #endif
9333 #define IPW_PRIVACY_CAPABLE 0x0008
9334 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
9335 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
9336 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
9337 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
9338 #ifdef CONFIG_IPW2100_MONITOR
9339 #endif
9340 /* LDV_COMMENT_END_PREP */
9341 /* LDV_COMMENT_VAR_DECLARE Variable declaration for test return result from function call "ipw2100_close" */
9342 static int res_ipw2100_close_137;
9343 /* LDV_COMMENT_BEGIN_PREP */
9344 #ifdef CONFIG_IPW2100_MONITOR
9345 #endif
9346 #ifdef CONFIG_IPW2100_MONITOR
9347 #endif
9348 #ifdef CONFIG_IPW2100_MONITOR
9349 #endif
9350 #ifdef CONFIG_PM
9351 #endif
9352 #ifdef CONFIG_PM
9353 #endif
9354 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
9355 #ifdef CONFIG_PM
9356 #endif
9357 #ifdef CONFIG_IPW2100_DEBUG
9358 #endif
9359 #ifdef CONFIG_IPW2100_DEBUG
9360 #endif
9361 #ifdef CONFIG_IPW2100_MONITOR
9362 #endif
9363 #define POWER_MODES 5
9364 #ifdef CONFIG_IPW2100_MONITOR
9365 #endif
9366 #define MAX_POWER_STRING 80
9367 #ifdef CONFIG_IPW2100_MONITOR
9368 #endif
9369 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
9370 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
9371 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
9372 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
9373 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
9374 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
9375 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
9376 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
9377 #ifdef CONFIG_IPW2100_MONITOR
9378 #endif
9379 #ifdef CONFIG_IPW2100_MONITOR
9380 #endif
9381 #ifdef CONFIG_IPW2100_MONITOR
9382 #else
9383 #endif
9384 #ifdef CONFIG_IPW2100_MONITOR
9385 #else
9386 #endif
9387 #ifdef CONFIG_IPW2100_DEBUG
9388 #endif
9389 #define IPW2100_FW_MAJOR_VERSION 1
9390 #define IPW2100_FW_MINOR_VERSION 3
9391 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
9392 #define IPW2100_FW_MAJOR(x) (x & 0xff)
9393 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
9394 IPW2100_FW_MAJOR_VERSION)
9395 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
9396 "." __stringify(IPW2100_FW_MINOR_VERSION)
9397 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
9398 #ifdef CONFIG_IPW2100_MONITOR
9399 #endif
9400 #ifdef CONFIG_IPW2100_MONITOR
9401 #endif
9402 /* LDV_COMMENT_END_PREP */
9403 /* content: static void ipw2100_tx_timeout(struct net_device *dev)*/
9404 /* LDV_COMMENT_BEGIN_PREP */
9405 #define IPW2100_VERSION "git-1.2.2"
9406 #define DRV_NAME "ipw2100"
9407 #define DRV_VERSION IPW2100_VERSION
9408 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
9409 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
9410 #ifdef CONFIG_IPW2100_DEBUG
9411 #define IPW2100_RX_DEBUG
9412 #endif
9413 #ifdef CONFIG_PM
9414 #endif
9415 #ifdef CONFIG_IPW2100_DEBUG
9416 #define IPW_DEBUG(level, message...) \
9417 do { \
9418 if (ipw2100_debug_level & (level)) { \
9419 printk(KERN_DEBUG "ipw2100: %c %s ", \
9420 in_interrupt() ? 'I' : 'U', __func__); \
9421 printk(message); \
9422 } \
9423 } while (0)
9424 #else
9425 #define IPW_DEBUG(level, message...) do {} while (0)
9426 #endif
9427 #ifdef CONFIG_IPW2100_DEBUG
9428 #endif
9429 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
9430 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
9431 #define MAX_RESET_BACKOFF 10
9432 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
9433 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
9434 #ifndef CONFIG_PM
9435 #endif
9436 #ifdef CONFIG_PM
9437 #else
9438 #endif
9439 #ifndef CONFIG_PM
9440 #endif
9441 #define MAX_RF_KILL_CHECKS 5
9442 #define RF_KILL_CHECK_DELAY 40
9443 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
9444 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
9445 #define MAC_ASSOCIATION_READ_DELAY (HZ)
9446 #ifdef CONFIG_IPW2100_DEBUG
9447 #define IPW2100_HANDLER(v, f) { v, f, # v }
9448 #else
9449 #define IPW2100_HANDLER(v, f) { v, f }
9450 #endif
9451 #ifdef CONFIG_IPW2100_DEBUG
9452 #endif
9453 #ifdef CONFIG_IPW2100_DEBUG
9454 #endif
9455 #define SEARCH_ERROR 0xffffffff
9456 #define SEARCH_FAIL 0xfffffffe
9457 #define SEARCH_SUCCESS 0xfffffff0
9458 #define SEARCH_DISCARD 0
9459 #define SEARCH_SNAPSHOT 1
9460 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
9461 #ifdef IPW2100_DEBUG_C3
9462 #endif
9463 #ifdef IPW2100_RX_DEBUG
9464 #endif
9465 #ifdef IPW2100_DEBUG_C3
9466 #endif
9467 #ifdef IPW2100_DEBUG_C3
9468 #endif
9469 #ifdef IPW2100_RX_DEBUG
9470 #endif
9471 #ifdef IPW2100_RX_DEBUG
9472 #endif
9473 #ifdef CONFIG_IPW2100_MONITOR
9474 #endif
9475 #ifdef CONFIG_IPW2100_MONITOR
9476 #else
9477 #endif
9478 #ifdef CONFIG_IPW2100_MONITOR
9479 #endif
9480 #ifdef CONFIG_IPW2100_DEBUG
9481 #endif
9482 #ifdef CONFIG_IPW2100_DEBUG
9483 #endif
9484 #ifdef CONFIG_IPW2100_DEBUG
9485 #endif
9486 #define IPW2100_REG(x) { IPW_ ##x, #x }
9487 #define IPW2100_NIC(x, s) { x, #x, s }
9488 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
9489 #ifdef CONFIG_IPW2100_DEBUG
9490 #endif
9491 #ifdef CONFIG_IPW2100_MONITOR
9492 #endif
9493 #ifdef CONFIG_PM
9494 #endif
9495 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
9496 #ifdef CONFIG_IPW2100_DEBUG
9497 #endif
9498 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
9499 #endif
9500 #ifdef IPW2100_TX_POWER
9501 #endif
9502 #if 0
9503 #endif
9504 #ifdef CONFIG_IPW2100_DEBUG
9505 #endif
9506 #define IPW_PRIVACY_CAPABLE 0x0008
9507 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
9508 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
9509 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
9510 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
9511 #ifdef CONFIG_IPW2100_MONITOR
9512 #endif
9513 /* LDV_COMMENT_END_PREP */
9514 /* LDV_COMMENT_BEGIN_PREP */
9515 #ifdef CONFIG_IPW2100_MONITOR
9516 #endif
9517 #ifdef CONFIG_IPW2100_MONITOR
9518 #endif
9519 #ifdef CONFIG_PM
9520 #endif
9521 #ifdef CONFIG_PM
9522 #endif
9523 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
9524 #ifdef CONFIG_PM
9525 #endif
9526 #ifdef CONFIG_IPW2100_DEBUG
9527 #endif
9528 #ifdef CONFIG_IPW2100_DEBUG
9529 #endif
9530 #ifdef CONFIG_IPW2100_MONITOR
9531 #endif
9532 #define POWER_MODES 5
9533 #ifdef CONFIG_IPW2100_MONITOR
9534 #endif
9535 #define MAX_POWER_STRING 80
9536 #ifdef CONFIG_IPW2100_MONITOR
9537 #endif
9538 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
9539 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
9540 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
9541 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
9542 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
9543 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
9544 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
9545 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
9546 #ifdef CONFIG_IPW2100_MONITOR
9547 #endif
9548 #ifdef CONFIG_IPW2100_MONITOR
9549 #endif
9550 #ifdef CONFIG_IPW2100_MONITOR
9551 #else
9552 #endif
9553 #ifdef CONFIG_IPW2100_MONITOR
9554 #else
9555 #endif
9556 #ifdef CONFIG_IPW2100_DEBUG
9557 #endif
9558 #define IPW2100_FW_MAJOR_VERSION 1
9559 #define IPW2100_FW_MINOR_VERSION 3
9560 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
9561 #define IPW2100_FW_MAJOR(x) (x & 0xff)
9562 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
9563 IPW2100_FW_MAJOR_VERSION)
9564 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
9565 "." __stringify(IPW2100_FW_MINOR_VERSION)
9566 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
9567 #ifdef CONFIG_IPW2100_MONITOR
9568 #endif
9569 #ifdef CONFIG_IPW2100_MONITOR
9570 #endif
9571 /* LDV_COMMENT_END_PREP */
9572 /* content: static int ipw2100_set_address(struct net_device *dev, void *p)*/
9573 /* LDV_COMMENT_BEGIN_PREP */
9574 #define IPW2100_VERSION "git-1.2.2"
9575 #define DRV_NAME "ipw2100"
9576 #define DRV_VERSION IPW2100_VERSION
9577 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
9578 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
9579 #ifdef CONFIG_IPW2100_DEBUG
9580 #define IPW2100_RX_DEBUG
9581 #endif
9582 #ifdef CONFIG_PM
9583 #endif
9584 #ifdef CONFIG_IPW2100_DEBUG
9585 #define IPW_DEBUG(level, message...) \
9586 do { \
9587 if (ipw2100_debug_level & (level)) { \
9588 printk(KERN_DEBUG "ipw2100: %c %s ", \
9589 in_interrupt() ? 'I' : 'U', __func__); \
9590 printk(message); \
9591 } \
9592 } while (0)
9593 #else
9594 #define IPW_DEBUG(level, message...) do {} while (0)
9595 #endif
9596 #ifdef CONFIG_IPW2100_DEBUG
9597 #endif
9598 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
9599 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
9600 #define MAX_RESET_BACKOFF 10
9601 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
9602 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
9603 #ifndef CONFIG_PM
9604 #endif
9605 #ifdef CONFIG_PM
9606 #else
9607 #endif
9608 #ifndef CONFIG_PM
9609 #endif
9610 #define MAX_RF_KILL_CHECKS 5
9611 #define RF_KILL_CHECK_DELAY 40
9612 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
9613 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
9614 #define MAC_ASSOCIATION_READ_DELAY (HZ)
9615 #ifdef CONFIG_IPW2100_DEBUG
9616 #define IPW2100_HANDLER(v, f) { v, f, # v }
9617 #else
9618 #define IPW2100_HANDLER(v, f) { v, f }
9619 #endif
9620 #ifdef CONFIG_IPW2100_DEBUG
9621 #endif
9622 #ifdef CONFIG_IPW2100_DEBUG
9623 #endif
9624 #define SEARCH_ERROR 0xffffffff
9625 #define SEARCH_FAIL 0xfffffffe
9626 #define SEARCH_SUCCESS 0xfffffff0
9627 #define SEARCH_DISCARD 0
9628 #define SEARCH_SNAPSHOT 1
9629 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
9630 #ifdef IPW2100_DEBUG_C3
9631 #endif
9632 #ifdef IPW2100_RX_DEBUG
9633 #endif
9634 #ifdef IPW2100_DEBUG_C3
9635 #endif
9636 #ifdef IPW2100_DEBUG_C3
9637 #endif
9638 #ifdef IPW2100_RX_DEBUG
9639 #endif
9640 #ifdef IPW2100_RX_DEBUG
9641 #endif
9642 #ifdef CONFIG_IPW2100_MONITOR
9643 #endif
9644 #ifdef CONFIG_IPW2100_MONITOR
9645 #else
9646 #endif
9647 #ifdef CONFIG_IPW2100_MONITOR
9648 #endif
9649 #ifdef CONFIG_IPW2100_DEBUG
9650 #endif
9651 #ifdef CONFIG_IPW2100_DEBUG
9652 #endif
9653 #ifdef CONFIG_IPW2100_DEBUG
9654 #endif
9655 #define IPW2100_REG(x) { IPW_ ##x, #x }
9656 #define IPW2100_NIC(x, s) { x, #x, s }
9657 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
9658 #ifdef CONFIG_IPW2100_DEBUG
9659 #endif
9660 #ifdef CONFIG_IPW2100_MONITOR
9661 #endif
9662 #ifdef CONFIG_PM
9663 #endif
9664 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
9665 #ifdef CONFIG_IPW2100_DEBUG
9666 #endif
9667 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
9668 #endif
9669 #ifdef IPW2100_TX_POWER
9670 #endif
9671 #if 0
9672 #endif
9673 #ifdef CONFIG_IPW2100_DEBUG
9674 #endif
9675 #define IPW_PRIVACY_CAPABLE 0x0008
9676 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
9677 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
9678 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
9679 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
9680 #ifdef CONFIG_IPW2100_MONITOR
9681 #endif
9682 /* LDV_COMMENT_END_PREP */
9683 /* LDV_COMMENT_VAR_DECLARE Variable declaration for function "ipw2100_set_address" */
9684 void * var_ipw2100_set_address_135_p1;
9685 /* LDV_COMMENT_BEGIN_PREP */
9686 #ifdef CONFIG_IPW2100_MONITOR
9687 #endif
9688 #ifdef CONFIG_IPW2100_MONITOR
9689 #endif
9690 #ifdef CONFIG_IPW2100_MONITOR
9691 #endif
9692 #ifdef CONFIG_PM
9693 #endif
9694 #ifdef CONFIG_PM
9695 #endif
9696 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
9697 #ifdef CONFIG_PM
9698 #endif
9699 #ifdef CONFIG_IPW2100_DEBUG
9700 #endif
9701 #ifdef CONFIG_IPW2100_DEBUG
9702 #endif
9703 #ifdef CONFIG_IPW2100_MONITOR
9704 #endif
9705 #define POWER_MODES 5
9706 #ifdef CONFIG_IPW2100_MONITOR
9707 #endif
9708 #define MAX_POWER_STRING 80
9709 #ifdef CONFIG_IPW2100_MONITOR
9710 #endif
9711 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
9712 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
9713 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
9714 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
9715 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
9716 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
9717 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
9718 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
9719 #ifdef CONFIG_IPW2100_MONITOR
9720 #endif
9721 #ifdef CONFIG_IPW2100_MONITOR
9722 #endif
9723 #ifdef CONFIG_IPW2100_MONITOR
9724 #else
9725 #endif
9726 #ifdef CONFIG_IPW2100_MONITOR
9727 #else
9728 #endif
9729 #ifdef CONFIG_IPW2100_DEBUG
9730 #endif
9731 #define IPW2100_FW_MAJOR_VERSION 1
9732 #define IPW2100_FW_MINOR_VERSION 3
9733 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
9734 #define IPW2100_FW_MAJOR(x) (x & 0xff)
9735 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
9736 IPW2100_FW_MAJOR_VERSION)
9737 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
9738 "." __stringify(IPW2100_FW_MINOR_VERSION)
9739 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
9740 #ifdef CONFIG_IPW2100_MONITOR
9741 #endif
9742 #ifdef CONFIG_IPW2100_MONITOR
9743 #endif
9744 /* LDV_COMMENT_END_PREP */
9745
9746 /** STRUCT: struct type: pci_driver, struct name: ipw2100_pci_driver **/
9747 /* content: static int ipw2100_pci_init_one(struct pci_dev *pci_dev, const struct pci_device_id *ent)*/
9748 /* LDV_COMMENT_BEGIN_PREP */
9749 #define IPW2100_VERSION "git-1.2.2"
9750 #define DRV_NAME "ipw2100"
9751 #define DRV_VERSION IPW2100_VERSION
9752 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
9753 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
9754 #ifdef CONFIG_IPW2100_DEBUG
9755 #define IPW2100_RX_DEBUG
9756 #endif
9757 #ifdef CONFIG_PM
9758 #endif
9759 #ifdef CONFIG_IPW2100_DEBUG
9760 #define IPW_DEBUG(level, message...) \
9761 do { \
9762 if (ipw2100_debug_level & (level)) { \
9763 printk(KERN_DEBUG "ipw2100: %c %s ", \
9764 in_interrupt() ? 'I' : 'U', __func__); \
9765 printk(message); \
9766 } \
9767 } while (0)
9768 #else
9769 #define IPW_DEBUG(level, message...) do {} while (0)
9770 #endif
9771 #ifdef CONFIG_IPW2100_DEBUG
9772 #endif
9773 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
9774 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
9775 #define MAX_RESET_BACKOFF 10
9776 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
9777 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
9778 #ifndef CONFIG_PM
9779 #endif
9780 #ifdef CONFIG_PM
9781 #else
9782 #endif
9783 #ifndef CONFIG_PM
9784 #endif
9785 #define MAX_RF_KILL_CHECKS 5
9786 #define RF_KILL_CHECK_DELAY 40
9787 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
9788 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
9789 #define MAC_ASSOCIATION_READ_DELAY (HZ)
9790 #ifdef CONFIG_IPW2100_DEBUG
9791 #define IPW2100_HANDLER(v, f) { v, f, # v }
9792 #else
9793 #define IPW2100_HANDLER(v, f) { v, f }
9794 #endif
9795 #ifdef CONFIG_IPW2100_DEBUG
9796 #endif
9797 #ifdef CONFIG_IPW2100_DEBUG
9798 #endif
9799 #define SEARCH_ERROR 0xffffffff
9800 #define SEARCH_FAIL 0xfffffffe
9801 #define SEARCH_SUCCESS 0xfffffff0
9802 #define SEARCH_DISCARD 0
9803 #define SEARCH_SNAPSHOT 1
9804 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
9805 #ifdef IPW2100_DEBUG_C3
9806 #endif
9807 #ifdef IPW2100_RX_DEBUG
9808 #endif
9809 #ifdef IPW2100_DEBUG_C3
9810 #endif
9811 #ifdef IPW2100_DEBUG_C3
9812 #endif
9813 #ifdef IPW2100_RX_DEBUG
9814 #endif
9815 #ifdef IPW2100_RX_DEBUG
9816 #endif
9817 #ifdef CONFIG_IPW2100_MONITOR
9818 #endif
9819 #ifdef CONFIG_IPW2100_MONITOR
9820 #else
9821 #endif
9822 #ifdef CONFIG_IPW2100_MONITOR
9823 #endif
9824 #ifdef CONFIG_IPW2100_DEBUG
9825 #endif
9826 #ifdef CONFIG_IPW2100_DEBUG
9827 #endif
9828 #ifdef CONFIG_IPW2100_DEBUG
9829 #endif
9830 #define IPW2100_REG(x) { IPW_ ##x, #x }
9831 #define IPW2100_NIC(x, s) { x, #x, s }
9832 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
9833 #ifdef CONFIG_IPW2100_DEBUG
9834 #endif
9835 #ifdef CONFIG_IPW2100_MONITOR
9836 #endif
9837 #ifdef CONFIG_PM
9838 #endif
9839 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
9840 #ifdef CONFIG_IPW2100_DEBUG
9841 #endif
9842 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
9843 #endif
9844 #ifdef IPW2100_TX_POWER
9845 #endif
9846 #if 0
9847 #endif
9848 #ifdef CONFIG_IPW2100_DEBUG
9849 #endif
9850 #define IPW_PRIVACY_CAPABLE 0x0008
9851 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
9852 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
9853 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
9854 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
9855 #ifdef CONFIG_IPW2100_MONITOR
9856 #endif
9857 #ifdef CONFIG_IPW2100_MONITOR
9858 #endif
9859 #ifdef CONFIG_IPW2100_MONITOR
9860 #endif
9861 #ifdef CONFIG_IPW2100_MONITOR
9862 #endif
9863 /* LDV_COMMENT_END_PREP */
9864 /* LDV_COMMENT_VAR_DECLARE Variable declaration for function "ipw2100_pci_init_one" */
9865 struct pci_dev * var_group3;
9866 /* LDV_COMMENT_VAR_DECLARE Variable declaration for function "ipw2100_pci_init_one" */
9867 const struct pci_device_id * var_ipw2100_pci_init_one_147_p1;
9868 /* LDV_COMMENT_VAR_DECLARE Variable declaration for test return result from function call "ipw2100_pci_init_one" */
9869 static int res_ipw2100_pci_init_one_147;
9870 /* LDV_COMMENT_BEGIN_PREP */
9871 #ifdef CONFIG_PM
9872 #endif
9873 #ifdef CONFIG_PM
9874 #endif
9875 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
9876 #ifdef CONFIG_PM
9877 #endif
9878 #ifdef CONFIG_IPW2100_DEBUG
9879 #endif
9880 #ifdef CONFIG_IPW2100_DEBUG
9881 #endif
9882 #ifdef CONFIG_IPW2100_MONITOR
9883 #endif
9884 #define POWER_MODES 5
9885 #ifdef CONFIG_IPW2100_MONITOR
9886 #endif
9887 #define MAX_POWER_STRING 80
9888 #ifdef CONFIG_IPW2100_MONITOR
9889 #endif
9890 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
9891 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
9892 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
9893 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
9894 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
9895 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
9896 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
9897 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
9898 #ifdef CONFIG_IPW2100_MONITOR
9899 #endif
9900 #ifdef CONFIG_IPW2100_MONITOR
9901 #endif
9902 #ifdef CONFIG_IPW2100_MONITOR
9903 #else
9904 #endif
9905 #ifdef CONFIG_IPW2100_MONITOR
9906 #else
9907 #endif
9908 #ifdef CONFIG_IPW2100_DEBUG
9909 #endif
9910 #define IPW2100_FW_MAJOR_VERSION 1
9911 #define IPW2100_FW_MINOR_VERSION 3
9912 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
9913 #define IPW2100_FW_MAJOR(x) (x & 0xff)
9914 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
9915 IPW2100_FW_MAJOR_VERSION)
9916 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
9917 "." __stringify(IPW2100_FW_MINOR_VERSION)
9918 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
9919 #ifdef CONFIG_IPW2100_MONITOR
9920 #endif
9921 #ifdef CONFIG_IPW2100_MONITOR
9922 #endif
9923 /* LDV_COMMENT_END_PREP */
9924 /* content: static void ipw2100_pci_remove_one(struct pci_dev *pci_dev)*/
9925 /* LDV_COMMENT_BEGIN_PREP */
9926 #define IPW2100_VERSION "git-1.2.2"
9927 #define DRV_NAME "ipw2100"
9928 #define DRV_VERSION IPW2100_VERSION
9929 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
9930 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
9931 #ifdef CONFIG_IPW2100_DEBUG
9932 #define IPW2100_RX_DEBUG
9933 #endif
9934 #ifdef CONFIG_PM
9935 #endif
9936 #ifdef CONFIG_IPW2100_DEBUG
9937 #define IPW_DEBUG(level, message...) \
9938 do { \
9939 if (ipw2100_debug_level & (level)) { \
9940 printk(KERN_DEBUG "ipw2100: %c %s ", \
9941 in_interrupt() ? 'I' : 'U', __func__); \
9942 printk(message); \
9943 } \
9944 } while (0)
9945 #else
9946 #define IPW_DEBUG(level, message...) do {} while (0)
9947 #endif
9948 #ifdef CONFIG_IPW2100_DEBUG
9949 #endif
9950 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
9951 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
9952 #define MAX_RESET_BACKOFF 10
9953 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
9954 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
9955 #ifndef CONFIG_PM
9956 #endif
9957 #ifdef CONFIG_PM
9958 #else
9959 #endif
9960 #ifndef CONFIG_PM
9961 #endif
9962 #define MAX_RF_KILL_CHECKS 5
9963 #define RF_KILL_CHECK_DELAY 40
9964 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
9965 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
9966 #define MAC_ASSOCIATION_READ_DELAY (HZ)
9967 #ifdef CONFIG_IPW2100_DEBUG
9968 #define IPW2100_HANDLER(v, f) { v, f, # v }
9969 #else
9970 #define IPW2100_HANDLER(v, f) { v, f }
9971 #endif
9972 #ifdef CONFIG_IPW2100_DEBUG
9973 #endif
9974 #ifdef CONFIG_IPW2100_DEBUG
9975 #endif
9976 #define SEARCH_ERROR 0xffffffff
9977 #define SEARCH_FAIL 0xfffffffe
9978 #define SEARCH_SUCCESS 0xfffffff0
9979 #define SEARCH_DISCARD 0
9980 #define SEARCH_SNAPSHOT 1
9981 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
9982 #ifdef IPW2100_DEBUG_C3
9983 #endif
9984 #ifdef IPW2100_RX_DEBUG
9985 #endif
9986 #ifdef IPW2100_DEBUG_C3
9987 #endif
9988 #ifdef IPW2100_DEBUG_C3
9989 #endif
9990 #ifdef IPW2100_RX_DEBUG
9991 #endif
9992 #ifdef IPW2100_RX_DEBUG
9993 #endif
9994 #ifdef CONFIG_IPW2100_MONITOR
9995 #endif
9996 #ifdef CONFIG_IPW2100_MONITOR
9997 #else
9998 #endif
9999 #ifdef CONFIG_IPW2100_MONITOR
10000 #endif
10001 #ifdef CONFIG_IPW2100_DEBUG
10002 #endif
10003 #ifdef CONFIG_IPW2100_DEBUG
10004 #endif
10005 #ifdef CONFIG_IPW2100_DEBUG
10006 #endif
10007 #define IPW2100_REG(x) { IPW_ ##x, #x }
10008 #define IPW2100_NIC(x, s) { x, #x, s }
10009 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
10010 #ifdef CONFIG_IPW2100_DEBUG
10011 #endif
10012 #ifdef CONFIG_IPW2100_MONITOR
10013 #endif
10014 #ifdef CONFIG_PM
10015 #endif
10016 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
10017 #ifdef CONFIG_IPW2100_DEBUG
10018 #endif
10019 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
10020 #endif
10021 #ifdef IPW2100_TX_POWER
10022 #endif
10023 #if 0
10024 #endif
10025 #ifdef CONFIG_IPW2100_DEBUG
10026 #endif
10027 #define IPW_PRIVACY_CAPABLE 0x0008
10028 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
10029 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
10030 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
10031 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
10032 #ifdef CONFIG_IPW2100_MONITOR
10033 #endif
10034 #ifdef CONFIG_IPW2100_MONITOR
10035 #endif
10036 #ifdef CONFIG_IPW2100_MONITOR
10037 #endif
10038 #ifdef CONFIG_IPW2100_MONITOR
10039 #endif
10040 /* LDV_COMMENT_END_PREP */
10041 /* LDV_COMMENT_BEGIN_PREP */
10042 #ifdef CONFIG_PM
10043 #endif
10044 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
10045 #ifdef CONFIG_PM
10046 #endif
10047 #ifdef CONFIG_IPW2100_DEBUG
10048 #endif
10049 #ifdef CONFIG_IPW2100_DEBUG
10050 #endif
10051 #ifdef CONFIG_IPW2100_MONITOR
10052 #endif
10053 #define POWER_MODES 5
10054 #ifdef CONFIG_IPW2100_MONITOR
10055 #endif
10056 #define MAX_POWER_STRING 80
10057 #ifdef CONFIG_IPW2100_MONITOR
10058 #endif
10059 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
10060 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
10061 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
10062 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
10063 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
10064 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
10065 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
10066 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
10067 #ifdef CONFIG_IPW2100_MONITOR
10068 #endif
10069 #ifdef CONFIG_IPW2100_MONITOR
10070 #endif
10071 #ifdef CONFIG_IPW2100_MONITOR
10072 #else
10073 #endif
10074 #ifdef CONFIG_IPW2100_MONITOR
10075 #else
10076 #endif
10077 #ifdef CONFIG_IPW2100_DEBUG
10078 #endif
10079 #define IPW2100_FW_MAJOR_VERSION 1
10080 #define IPW2100_FW_MINOR_VERSION 3
10081 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
10082 #define IPW2100_FW_MAJOR(x) (x & 0xff)
10083 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
10084 IPW2100_FW_MAJOR_VERSION)
10085 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
10086 "." __stringify(IPW2100_FW_MINOR_VERSION)
10087 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
10088 #ifdef CONFIG_IPW2100_MONITOR
10089 #endif
10090 #ifdef CONFIG_IPW2100_MONITOR
10091 #endif
10092 /* LDV_COMMENT_END_PREP */
10093 /* content: static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state)*/
10094 /* LDV_COMMENT_BEGIN_PREP */
10095 #define IPW2100_VERSION "git-1.2.2"
10096 #define DRV_NAME "ipw2100"
10097 #define DRV_VERSION IPW2100_VERSION
10098 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
10099 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
10100 #ifdef CONFIG_IPW2100_DEBUG
10101 #define IPW2100_RX_DEBUG
10102 #endif
10103 #ifdef CONFIG_PM
10104 #endif
10105 #ifdef CONFIG_IPW2100_DEBUG
10106 #define IPW_DEBUG(level, message...) \
10107 do { \
10108 if (ipw2100_debug_level & (level)) { \
10109 printk(KERN_DEBUG "ipw2100: %c %s ", \
10110 in_interrupt() ? 'I' : 'U', __func__); \
10111 printk(message); \
10112 } \
10113 } while (0)
10114 #else
10115 #define IPW_DEBUG(level, message...) do {} while (0)
10116 #endif
10117 #ifdef CONFIG_IPW2100_DEBUG
10118 #endif
10119 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
10120 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
10121 #define MAX_RESET_BACKOFF 10
10122 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
10123 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
10124 #ifndef CONFIG_PM
10125 #endif
10126 #ifdef CONFIG_PM
10127 #else
10128 #endif
10129 #ifndef CONFIG_PM
10130 #endif
10131 #define MAX_RF_KILL_CHECKS 5
10132 #define RF_KILL_CHECK_DELAY 40
10133 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
10134 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
10135 #define MAC_ASSOCIATION_READ_DELAY (HZ)
10136 #ifdef CONFIG_IPW2100_DEBUG
10137 #define IPW2100_HANDLER(v, f) { v, f, # v }
10138 #else
10139 #define IPW2100_HANDLER(v, f) { v, f }
10140 #endif
10141 #ifdef CONFIG_IPW2100_DEBUG
10142 #endif
10143 #ifdef CONFIG_IPW2100_DEBUG
10144 #endif
10145 #define SEARCH_ERROR 0xffffffff
10146 #define SEARCH_FAIL 0xfffffffe
10147 #define SEARCH_SUCCESS 0xfffffff0
10148 #define SEARCH_DISCARD 0
10149 #define SEARCH_SNAPSHOT 1
10150 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
10151 #ifdef IPW2100_DEBUG_C3
10152 #endif
10153 #ifdef IPW2100_RX_DEBUG
10154 #endif
10155 #ifdef IPW2100_DEBUG_C3
10156 #endif
10157 #ifdef IPW2100_DEBUG_C3
10158 #endif
10159 #ifdef IPW2100_RX_DEBUG
10160 #endif
10161 #ifdef IPW2100_RX_DEBUG
10162 #endif
10163 #ifdef CONFIG_IPW2100_MONITOR
10164 #endif
10165 #ifdef CONFIG_IPW2100_MONITOR
10166 #else
10167 #endif
10168 #ifdef CONFIG_IPW2100_MONITOR
10169 #endif
10170 #ifdef CONFIG_IPW2100_DEBUG
10171 #endif
10172 #ifdef CONFIG_IPW2100_DEBUG
10173 #endif
10174 #ifdef CONFIG_IPW2100_DEBUG
10175 #endif
10176 #define IPW2100_REG(x) { IPW_ ##x, #x }
10177 #define IPW2100_NIC(x, s) { x, #x, s }
10178 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
10179 #ifdef CONFIG_IPW2100_DEBUG
10180 #endif
10181 #ifdef CONFIG_IPW2100_MONITOR
10182 #endif
10183 #ifdef CONFIG_PM
10184 #endif
10185 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
10186 #ifdef CONFIG_IPW2100_DEBUG
10187 #endif
10188 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
10189 #endif
10190 #ifdef IPW2100_TX_POWER
10191 #endif
10192 #if 0
10193 #endif
10194 #ifdef CONFIG_IPW2100_DEBUG
10195 #endif
10196 #define IPW_PRIVACY_CAPABLE 0x0008
10197 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
10198 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
10199 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
10200 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
10201 #ifdef CONFIG_IPW2100_MONITOR
10202 #endif
10203 #ifdef CONFIG_IPW2100_MONITOR
10204 #endif
10205 #ifdef CONFIG_IPW2100_MONITOR
10206 #endif
10207 #ifdef CONFIG_IPW2100_MONITOR
10208 #endif
10209 #ifdef CONFIG_PM
10210 #endif
10211 #ifdef CONFIG_PM
10212 /* LDV_COMMENT_END_PREP */
10213 /* LDV_COMMENT_VAR_DECLARE Variable declaration for function "ipw2100_suspend" */
10214 pm_message_t var_ipw2100_suspend_149_p1;
10215 /* LDV_COMMENT_BEGIN_PREP */
10216 #endif
10217 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
10218 #ifdef CONFIG_PM
10219 #endif
10220 #ifdef CONFIG_IPW2100_DEBUG
10221 #endif
10222 #ifdef CONFIG_IPW2100_DEBUG
10223 #endif
10224 #ifdef CONFIG_IPW2100_MONITOR
10225 #endif
10226 #define POWER_MODES 5
10227 #ifdef CONFIG_IPW2100_MONITOR
10228 #endif
10229 #define MAX_POWER_STRING 80
10230 #ifdef CONFIG_IPW2100_MONITOR
10231 #endif
10232 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
10233 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
10234 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
10235 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
10236 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
10237 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
10238 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
10239 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
10240 #ifdef CONFIG_IPW2100_MONITOR
10241 #endif
10242 #ifdef CONFIG_IPW2100_MONITOR
10243 #endif
10244 #ifdef CONFIG_IPW2100_MONITOR
10245 #else
10246 #endif
10247 #ifdef CONFIG_IPW2100_MONITOR
10248 #else
10249 #endif
10250 #ifdef CONFIG_IPW2100_DEBUG
10251 #endif
10252 #define IPW2100_FW_MAJOR_VERSION 1
10253 #define IPW2100_FW_MINOR_VERSION 3
10254 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
10255 #define IPW2100_FW_MAJOR(x) (x & 0xff)
10256 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
10257 IPW2100_FW_MAJOR_VERSION)
10258 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
10259 "." __stringify(IPW2100_FW_MINOR_VERSION)
10260 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
10261 #ifdef CONFIG_IPW2100_MONITOR
10262 #endif
10263 #ifdef CONFIG_IPW2100_MONITOR
10264 #endif
10265 /* LDV_COMMENT_END_PREP */
10266 /* content: static int ipw2100_resume(struct pci_dev *pci_dev)*/
10267 /* LDV_COMMENT_BEGIN_PREP */
10268 #define IPW2100_VERSION "git-1.2.2"
10269 #define DRV_NAME "ipw2100"
10270 #define DRV_VERSION IPW2100_VERSION
10271 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
10272 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
10273 #ifdef CONFIG_IPW2100_DEBUG
10274 #define IPW2100_RX_DEBUG
10275 #endif
10276 #ifdef CONFIG_PM
10277 #endif
10278 #ifdef CONFIG_IPW2100_DEBUG
10279 #define IPW_DEBUG(level, message...) \
10280 do { \
10281 if (ipw2100_debug_level & (level)) { \
10282 printk(KERN_DEBUG "ipw2100: %c %s ", \
10283 in_interrupt() ? 'I' : 'U', __func__); \
10284 printk(message); \
10285 } \
10286 } while (0)
10287 #else
10288 #define IPW_DEBUG(level, message...) do {} while (0)
10289 #endif
10290 #ifdef CONFIG_IPW2100_DEBUG
10291 #endif
10292 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
10293 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
10294 #define MAX_RESET_BACKOFF 10
10295 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
10296 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
10297 #ifndef CONFIG_PM
10298 #endif
10299 #ifdef CONFIG_PM
10300 #else
10301 #endif
10302 #ifndef CONFIG_PM
10303 #endif
10304 #define MAX_RF_KILL_CHECKS 5
10305 #define RF_KILL_CHECK_DELAY 40
10306 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
10307 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
10308 #define MAC_ASSOCIATION_READ_DELAY (HZ)
10309 #ifdef CONFIG_IPW2100_DEBUG
10310 #define IPW2100_HANDLER(v, f) { v, f, # v }
10311 #else
10312 #define IPW2100_HANDLER(v, f) { v, f }
10313 #endif
10314 #ifdef CONFIG_IPW2100_DEBUG
10315 #endif
10316 #ifdef CONFIG_IPW2100_DEBUG
10317 #endif
10318 #define SEARCH_ERROR 0xffffffff
10319 #define SEARCH_FAIL 0xfffffffe
10320 #define SEARCH_SUCCESS 0xfffffff0
10321 #define SEARCH_DISCARD 0
10322 #define SEARCH_SNAPSHOT 1
10323 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
10324 #ifdef IPW2100_DEBUG_C3
10325 #endif
10326 #ifdef IPW2100_RX_DEBUG
10327 #endif
10328 #ifdef IPW2100_DEBUG_C3
10329 #endif
10330 #ifdef IPW2100_DEBUG_C3
10331 #endif
10332 #ifdef IPW2100_RX_DEBUG
10333 #endif
10334 #ifdef IPW2100_RX_DEBUG
10335 #endif
10336 #ifdef CONFIG_IPW2100_MONITOR
10337 #endif
10338 #ifdef CONFIG_IPW2100_MONITOR
10339 #else
10340 #endif
10341 #ifdef CONFIG_IPW2100_MONITOR
10342 #endif
10343 #ifdef CONFIG_IPW2100_DEBUG
10344 #endif
10345 #ifdef CONFIG_IPW2100_DEBUG
10346 #endif
10347 #ifdef CONFIG_IPW2100_DEBUG
10348 #endif
10349 #define IPW2100_REG(x) { IPW_ ##x, #x }
10350 #define IPW2100_NIC(x, s) { x, #x, s }
10351 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
10352 #ifdef CONFIG_IPW2100_DEBUG
10353 #endif
10354 #ifdef CONFIG_IPW2100_MONITOR
10355 #endif
10356 #ifdef CONFIG_PM
10357 #endif
10358 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
10359 #ifdef CONFIG_IPW2100_DEBUG
10360 #endif
10361 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
10362 #endif
10363 #ifdef IPW2100_TX_POWER
10364 #endif
10365 #if 0
10366 #endif
10367 #ifdef CONFIG_IPW2100_DEBUG
10368 #endif
10369 #define IPW_PRIVACY_CAPABLE 0x0008
10370 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
10371 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
10372 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
10373 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
10374 #ifdef CONFIG_IPW2100_MONITOR
10375 #endif
10376 #ifdef CONFIG_IPW2100_MONITOR
10377 #endif
10378 #ifdef CONFIG_IPW2100_MONITOR
10379 #endif
10380 #ifdef CONFIG_IPW2100_MONITOR
10381 #endif
10382 #ifdef CONFIG_PM
10383 #endif
10384 #ifdef CONFIG_PM
10385 /* LDV_COMMENT_END_PREP */
10386 /* LDV_COMMENT_BEGIN_PREP */
10387 #endif
10388 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
10389 #ifdef CONFIG_PM
10390 #endif
10391 #ifdef CONFIG_IPW2100_DEBUG
10392 #endif
10393 #ifdef CONFIG_IPW2100_DEBUG
10394 #endif
10395 #ifdef CONFIG_IPW2100_MONITOR
10396 #endif
10397 #define POWER_MODES 5
10398 #ifdef CONFIG_IPW2100_MONITOR
10399 #endif
10400 #define MAX_POWER_STRING 80
10401 #ifdef CONFIG_IPW2100_MONITOR
10402 #endif
10403 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
10404 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
10405 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
10406 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
10407 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
10408 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
10409 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
10410 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
10411 #ifdef CONFIG_IPW2100_MONITOR
10412 #endif
10413 #ifdef CONFIG_IPW2100_MONITOR
10414 #endif
10415 #ifdef CONFIG_IPW2100_MONITOR
10416 #else
10417 #endif
10418 #ifdef CONFIG_IPW2100_MONITOR
10419 #else
10420 #endif
10421 #ifdef CONFIG_IPW2100_DEBUG
10422 #endif
10423 #define IPW2100_FW_MAJOR_VERSION 1
10424 #define IPW2100_FW_MINOR_VERSION 3
10425 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
10426 #define IPW2100_FW_MAJOR(x) (x & 0xff)
10427 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
10428 IPW2100_FW_MAJOR_VERSION)
10429 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
10430 "." __stringify(IPW2100_FW_MINOR_VERSION)
10431 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
10432 #ifdef CONFIG_IPW2100_MONITOR
10433 #endif
10434 #ifdef CONFIG_IPW2100_MONITOR
10435 #endif
10436 /* LDV_COMMENT_END_PREP */
10437 /* content: static void ipw2100_shutdown(struct pci_dev *pci_dev)*/
10438 /* LDV_COMMENT_BEGIN_PREP */
10439 #define IPW2100_VERSION "git-1.2.2"
10440 #define DRV_NAME "ipw2100"
10441 #define DRV_VERSION IPW2100_VERSION
10442 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
10443 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
10444 #ifdef CONFIG_IPW2100_DEBUG
10445 #define IPW2100_RX_DEBUG
10446 #endif
10447 #ifdef CONFIG_PM
10448 #endif
10449 #ifdef CONFIG_IPW2100_DEBUG
10450 #define IPW_DEBUG(level, message...) \
10451 do { \
10452 if (ipw2100_debug_level & (level)) { \
10453 printk(KERN_DEBUG "ipw2100: %c %s ", \
10454 in_interrupt() ? 'I' : 'U', __func__); \
10455 printk(message); \
10456 } \
10457 } while (0)
10458 #else
10459 #define IPW_DEBUG(level, message...) do {} while (0)
10460 #endif
10461 #ifdef CONFIG_IPW2100_DEBUG
10462 #endif
10463 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
10464 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
10465 #define MAX_RESET_BACKOFF 10
10466 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
10467 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
10468 #ifndef CONFIG_PM
10469 #endif
10470 #ifdef CONFIG_PM
10471 #else
10472 #endif
10473 #ifndef CONFIG_PM
10474 #endif
10475 #define MAX_RF_KILL_CHECKS 5
10476 #define RF_KILL_CHECK_DELAY 40
10477 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
10478 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
10479 #define MAC_ASSOCIATION_READ_DELAY (HZ)
10480 #ifdef CONFIG_IPW2100_DEBUG
10481 #define IPW2100_HANDLER(v, f) { v, f, # v }
10482 #else
10483 #define IPW2100_HANDLER(v, f) { v, f }
10484 #endif
10485 #ifdef CONFIG_IPW2100_DEBUG
10486 #endif
10487 #ifdef CONFIG_IPW2100_DEBUG
10488 #endif
10489 #define SEARCH_ERROR 0xffffffff
10490 #define SEARCH_FAIL 0xfffffffe
10491 #define SEARCH_SUCCESS 0xfffffff0
10492 #define SEARCH_DISCARD 0
10493 #define SEARCH_SNAPSHOT 1
10494 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
10495 #ifdef IPW2100_DEBUG_C3
10496 #endif
10497 #ifdef IPW2100_RX_DEBUG
10498 #endif
10499 #ifdef IPW2100_DEBUG_C3
10500 #endif
10501 #ifdef IPW2100_DEBUG_C3
10502 #endif
10503 #ifdef IPW2100_RX_DEBUG
10504 #endif
10505 #ifdef IPW2100_RX_DEBUG
10506 #endif
10507 #ifdef CONFIG_IPW2100_MONITOR
10508 #endif
10509 #ifdef CONFIG_IPW2100_MONITOR
10510 #else
10511 #endif
10512 #ifdef CONFIG_IPW2100_MONITOR
10513 #endif
10514 #ifdef CONFIG_IPW2100_DEBUG
10515 #endif
10516 #ifdef CONFIG_IPW2100_DEBUG
10517 #endif
10518 #ifdef CONFIG_IPW2100_DEBUG
10519 #endif
10520 #define IPW2100_REG(x) { IPW_ ##x, #x }
10521 #define IPW2100_NIC(x, s) { x, #x, s }
10522 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
10523 #ifdef CONFIG_IPW2100_DEBUG
10524 #endif
10525 #ifdef CONFIG_IPW2100_MONITOR
10526 #endif
10527 #ifdef CONFIG_PM
10528 #endif
10529 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
10530 #ifdef CONFIG_IPW2100_DEBUG
10531 #endif
10532 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
10533 #endif
10534 #ifdef IPW2100_TX_POWER
10535 #endif
10536 #if 0
10537 #endif
10538 #ifdef CONFIG_IPW2100_DEBUG
10539 #endif
10540 #define IPW_PRIVACY_CAPABLE 0x0008
10541 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
10542 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
10543 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
10544 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
10545 #ifdef CONFIG_IPW2100_MONITOR
10546 #endif
10547 #ifdef CONFIG_IPW2100_MONITOR
10548 #endif
10549 #ifdef CONFIG_IPW2100_MONITOR
10550 #endif
10551 #ifdef CONFIG_IPW2100_MONITOR
10552 #endif
10553 #ifdef CONFIG_PM
10554 #endif
10555 #ifdef CONFIG_PM
10556 #endif
10557 /* LDV_COMMENT_END_PREP */
10558 /* LDV_COMMENT_BEGIN_PREP */
10559 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
10560 #ifdef CONFIG_PM
10561 #endif
10562 #ifdef CONFIG_IPW2100_DEBUG
10563 #endif
10564 #ifdef CONFIG_IPW2100_DEBUG
10565 #endif
10566 #ifdef CONFIG_IPW2100_MONITOR
10567 #endif
10568 #define POWER_MODES 5
10569 #ifdef CONFIG_IPW2100_MONITOR
10570 #endif
10571 #define MAX_POWER_STRING 80
10572 #ifdef CONFIG_IPW2100_MONITOR
10573 #endif
10574 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
10575 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
10576 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
10577 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
10578 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
10579 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
10580 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
10581 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
10582 #ifdef CONFIG_IPW2100_MONITOR
10583 #endif
10584 #ifdef CONFIG_IPW2100_MONITOR
10585 #endif
10586 #ifdef CONFIG_IPW2100_MONITOR
10587 #else
10588 #endif
10589 #ifdef CONFIG_IPW2100_MONITOR
10590 #else
10591 #endif
10592 #ifdef CONFIG_IPW2100_DEBUG
10593 #endif
10594 #define IPW2100_FW_MAJOR_VERSION 1
10595 #define IPW2100_FW_MINOR_VERSION 3
10596 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
10597 #define IPW2100_FW_MAJOR(x) (x & 0xff)
10598 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
10599 IPW2100_FW_MAJOR_VERSION)
10600 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
10601 "." __stringify(IPW2100_FW_MINOR_VERSION)
10602 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
10603 #ifdef CONFIG_IPW2100_MONITOR
10604 #endif
10605 #ifdef CONFIG_IPW2100_MONITOR
10606 #endif
10607 /* LDV_COMMENT_END_PREP */
10608
10609 /** STRUCT: struct type: iw_handler_def, struct name: ipw2100_wx_handler_def **/
10610 /* content: static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev)*/
10611 /* LDV_COMMENT_BEGIN_PREP */
10612 #define IPW2100_VERSION "git-1.2.2"
10613 #define DRV_NAME "ipw2100"
10614 #define DRV_VERSION IPW2100_VERSION
10615 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
10616 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
10617 #ifdef CONFIG_IPW2100_DEBUG
10618 #define IPW2100_RX_DEBUG
10619 #endif
10620 #ifdef CONFIG_PM
10621 #endif
10622 #ifdef CONFIG_IPW2100_DEBUG
10623 #define IPW_DEBUG(level, message...) \
10624 do { \
10625 if (ipw2100_debug_level & (level)) { \
10626 printk(KERN_DEBUG "ipw2100: %c %s ", \
10627 in_interrupt() ? 'I' : 'U', __func__); \
10628 printk(message); \
10629 } \
10630 } while (0)
10631 #else
10632 #define IPW_DEBUG(level, message...) do {} while (0)
10633 #endif
10634 #ifdef CONFIG_IPW2100_DEBUG
10635 #endif
10636 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
10637 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
10638 #define MAX_RESET_BACKOFF 10
10639 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
10640 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
10641 #ifndef CONFIG_PM
10642 #endif
10643 #ifdef CONFIG_PM
10644 #else
10645 #endif
10646 #ifndef CONFIG_PM
10647 #endif
10648 #define MAX_RF_KILL_CHECKS 5
10649 #define RF_KILL_CHECK_DELAY 40
10650 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
10651 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
10652 #define MAC_ASSOCIATION_READ_DELAY (HZ)
10653 #ifdef CONFIG_IPW2100_DEBUG
10654 #define IPW2100_HANDLER(v, f) { v, f, # v }
10655 #else
10656 #define IPW2100_HANDLER(v, f) { v, f }
10657 #endif
10658 #ifdef CONFIG_IPW2100_DEBUG
10659 #endif
10660 #ifdef CONFIG_IPW2100_DEBUG
10661 #endif
10662 #define SEARCH_ERROR 0xffffffff
10663 #define SEARCH_FAIL 0xfffffffe
10664 #define SEARCH_SUCCESS 0xfffffff0
10665 #define SEARCH_DISCARD 0
10666 #define SEARCH_SNAPSHOT 1
10667 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
10668 #ifdef IPW2100_DEBUG_C3
10669 #endif
10670 #ifdef IPW2100_RX_DEBUG
10671 #endif
10672 #ifdef IPW2100_DEBUG_C3
10673 #endif
10674 #ifdef IPW2100_DEBUG_C3
10675 #endif
10676 #ifdef IPW2100_RX_DEBUG
10677 #endif
10678 #ifdef IPW2100_RX_DEBUG
10679 #endif
10680 #ifdef CONFIG_IPW2100_MONITOR
10681 #endif
10682 #ifdef CONFIG_IPW2100_MONITOR
10683 #else
10684 #endif
10685 #ifdef CONFIG_IPW2100_MONITOR
10686 #endif
10687 #ifdef CONFIG_IPW2100_DEBUG
10688 #endif
10689 #ifdef CONFIG_IPW2100_DEBUG
10690 #endif
10691 #ifdef CONFIG_IPW2100_DEBUG
10692 #endif
10693 #define IPW2100_REG(x) { IPW_ ##x, #x }
10694 #define IPW2100_NIC(x, s) { x, #x, s }
10695 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
10696 #ifdef CONFIG_IPW2100_DEBUG
10697 #endif
10698 #ifdef CONFIG_IPW2100_MONITOR
10699 #endif
10700 #ifdef CONFIG_PM
10701 #endif
10702 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
10703 #ifdef CONFIG_IPW2100_DEBUG
10704 #endif
10705 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
10706 #endif
10707 #ifdef IPW2100_TX_POWER
10708 #endif
10709 #if 0
10710 #endif
10711 #ifdef CONFIG_IPW2100_DEBUG
10712 #endif
10713 #define IPW_PRIVACY_CAPABLE 0x0008
10714 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
10715 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
10716 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
10717 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
10718 #ifdef CONFIG_IPW2100_MONITOR
10719 #endif
10720 #ifdef CONFIG_IPW2100_MONITOR
10721 #endif
10722 #ifdef CONFIG_IPW2100_MONITOR
10723 #endif
10724 #ifdef CONFIG_IPW2100_MONITOR
10725 #endif
10726 #ifdef CONFIG_PM
10727 #endif
10728 #ifdef CONFIG_PM
10729 #endif
10730 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
10731 #ifdef CONFIG_PM
10732 #endif
10733 #ifdef CONFIG_IPW2100_DEBUG
10734 #endif
10735 #ifdef CONFIG_IPW2100_DEBUG
10736 #endif
10737 #ifdef CONFIG_IPW2100_MONITOR
10738 #endif
10739 #define POWER_MODES 5
10740 #ifdef CONFIG_IPW2100_MONITOR
10741 #endif
10742 #define MAX_POWER_STRING 80
10743 #ifdef CONFIG_IPW2100_MONITOR
10744 #endif
10745 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
10746 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
10747 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
10748 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
10749 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
10750 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
10751 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
10752 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
10753 #ifdef CONFIG_IPW2100_MONITOR
10754 #endif
10755 #ifdef CONFIG_IPW2100_MONITOR
10756 #endif
10757 #ifdef CONFIG_IPW2100_MONITOR
10758 #else
10759 #endif
10760 #ifdef CONFIG_IPW2100_MONITOR
10761 #else
10762 #endif
10763 /* LDV_COMMENT_END_PREP */
10764 /* LDV_COMMENT_BEGIN_PREP */
10765 #define IPW2100_FW_MAJOR_VERSION 1
10766 #define IPW2100_FW_MINOR_VERSION 3
10767 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
10768 #define IPW2100_FW_MAJOR(x) (x & 0xff)
10769 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
10770 IPW2100_FW_MAJOR_VERSION)
10771 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
10772 "." __stringify(IPW2100_FW_MINOR_VERSION)
10773 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
10774 #ifdef CONFIG_IPW2100_MONITOR
10775 #endif
10776 #ifdef CONFIG_IPW2100_MONITOR
10777 #endif
10778 /* LDV_COMMENT_END_PREP */
10779
10780 /** CALLBACK SECTION request_irq **/
10781 /* content: static irqreturn_t ipw2100_interrupt(int irq, void *data)*/
10782 /* LDV_COMMENT_BEGIN_PREP */
10783 #define IPW2100_VERSION "git-1.2.2"
10784 #define DRV_NAME "ipw2100"
10785 #define DRV_VERSION IPW2100_VERSION
10786 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
10787 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
10788 #ifdef CONFIG_IPW2100_DEBUG
10789 #define IPW2100_RX_DEBUG
10790 #endif
10791 #ifdef CONFIG_PM
10792 #endif
10793 #ifdef CONFIG_IPW2100_DEBUG
10794 #define IPW_DEBUG(level, message...) \
10795 do { \
10796 if (ipw2100_debug_level & (level)) { \
10797 printk(KERN_DEBUG "ipw2100: %c %s ", \
10798 in_interrupt() ? 'I' : 'U', __func__); \
10799 printk(message); \
10800 } \
10801 } while (0)
10802 #else
10803 #define IPW_DEBUG(level, message...) do {} while (0)
10804 #endif
10805 #ifdef CONFIG_IPW2100_DEBUG
10806 #endif
10807 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
10808 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
10809 #define MAX_RESET_BACKOFF 10
10810 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
10811 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
10812 #ifndef CONFIG_PM
10813 #endif
10814 #ifdef CONFIG_PM
10815 #else
10816 #endif
10817 #ifndef CONFIG_PM
10818 #endif
10819 #define MAX_RF_KILL_CHECKS 5
10820 #define RF_KILL_CHECK_DELAY 40
10821 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
10822 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
10823 #define MAC_ASSOCIATION_READ_DELAY (HZ)
10824 #ifdef CONFIG_IPW2100_DEBUG
10825 #define IPW2100_HANDLER(v, f) { v, f, # v }
10826 #else
10827 #define IPW2100_HANDLER(v, f) { v, f }
10828 #endif
10829 #ifdef CONFIG_IPW2100_DEBUG
10830 #endif
10831 #ifdef CONFIG_IPW2100_DEBUG
10832 #endif
10833 #define SEARCH_ERROR 0xffffffff
10834 #define SEARCH_FAIL 0xfffffffe
10835 #define SEARCH_SUCCESS 0xfffffff0
10836 #define SEARCH_DISCARD 0
10837 #define SEARCH_SNAPSHOT 1
10838 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
10839 #ifdef IPW2100_DEBUG_C3
10840 #endif
10841 #ifdef IPW2100_RX_DEBUG
10842 #endif
10843 #ifdef IPW2100_DEBUG_C3
10844 #endif
10845 #ifdef IPW2100_DEBUG_C3
10846 #endif
10847 #ifdef IPW2100_RX_DEBUG
10848 #endif
10849 #ifdef IPW2100_RX_DEBUG
10850 #endif
10851 #ifdef CONFIG_IPW2100_MONITOR
10852 #endif
10853 #ifdef CONFIG_IPW2100_MONITOR
10854 #else
10855 #endif
10856 #ifdef CONFIG_IPW2100_MONITOR
10857 #endif
10858 #ifdef CONFIG_IPW2100_DEBUG
10859 #endif
10860 #ifdef CONFIG_IPW2100_DEBUG
10861 #endif
10862 #ifdef CONFIG_IPW2100_DEBUG
10863 #endif
10864 /* LDV_COMMENT_END_PREP */
10865 /* LDV_COMMENT_VAR_DECLARE Variable declaration for function "ipw2100_interrupt" */
10866 int var_ipw2100_interrupt_69_p0;
10867 /* LDV_COMMENT_VAR_DECLARE Variable declaration for function "ipw2100_interrupt" */
10868 void * var_ipw2100_interrupt_69_p1;
10869 /* LDV_COMMENT_BEGIN_PREP */
10870 #define IPW2100_REG(x) { IPW_ ##x, #x }
10871 #define IPW2100_NIC(x, s) { x, #x, s }
10872 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
10873 #ifdef CONFIG_IPW2100_DEBUG
10874 #endif
10875 #ifdef CONFIG_IPW2100_MONITOR
10876 #endif
10877 #ifdef CONFIG_PM
10878 #endif
10879 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
10880 #ifdef CONFIG_IPW2100_DEBUG
10881 #endif
10882 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
10883 #endif
10884 #ifdef IPW2100_TX_POWER
10885 #endif
10886 #if 0
10887 #endif
10888 #ifdef CONFIG_IPW2100_DEBUG
10889 #endif
10890 #define IPW_PRIVACY_CAPABLE 0x0008
10891 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
10892 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
10893 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
10894 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
10895 #ifdef CONFIG_IPW2100_MONITOR
10896 #endif
10897 #ifdef CONFIG_IPW2100_MONITOR
10898 #endif
10899 #ifdef CONFIG_IPW2100_MONITOR
10900 #endif
10901 #ifdef CONFIG_IPW2100_MONITOR
10902 #endif
10903 #ifdef CONFIG_PM
10904 #endif
10905 #ifdef CONFIG_PM
10906 #endif
10907 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
10908 #ifdef CONFIG_PM
10909 #endif
10910 #ifdef CONFIG_IPW2100_DEBUG
10911 #endif
10912 #ifdef CONFIG_IPW2100_DEBUG
10913 #endif
10914 #ifdef CONFIG_IPW2100_MONITOR
10915 #endif
10916 #define POWER_MODES 5
10917 #ifdef CONFIG_IPW2100_MONITOR
10918 #endif
10919 #define MAX_POWER_STRING 80
10920 #ifdef CONFIG_IPW2100_MONITOR
10921 #endif
10922 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
10923 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
10924 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
10925 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
10926 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
10927 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
10928 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
10929 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
10930 #ifdef CONFIG_IPW2100_MONITOR
10931 #endif
10932 #ifdef CONFIG_IPW2100_MONITOR
10933 #endif
10934 #ifdef CONFIG_IPW2100_MONITOR
10935 #else
10936 #endif
10937 #ifdef CONFIG_IPW2100_MONITOR
10938 #else
10939 #endif
10940 #ifdef CONFIG_IPW2100_DEBUG
10941 #endif
10942 #define IPW2100_FW_MAJOR_VERSION 1
10943 #define IPW2100_FW_MINOR_VERSION 3
10944 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
10945 #define IPW2100_FW_MAJOR(x) (x & 0xff)
10946 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
10947 IPW2100_FW_MAJOR_VERSION)
10948 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
10949 "." __stringify(IPW2100_FW_MINOR_VERSION)
10950 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
10951 #ifdef CONFIG_IPW2100_MONITOR
10952 #endif
10953 #ifdef CONFIG_IPW2100_MONITOR
10954 #endif
10955 /* LDV_COMMENT_END_PREP */
10956
10957
10958
10959
10960 /* LDV_COMMENT_END_VARIABLE_DECLARATION_PART */
10961 /* LDV_COMMENT_BEGIN_VARIABLE_INITIALIZING_PART */
10962 /*============================= VARIABLE INITIALIZING PART =============================*/
10963 LDV_IN_INTERRUPT=1;
10964
10965
10966
10967
10968 /* LDV_COMMENT_END_VARIABLE_INITIALIZING_PART */
10969 /* LDV_COMMENT_BEGIN_FUNCTION_CALL_SECTION */
10970 /*============================= FUNCTION CALL SECTION =============================*/
10971 /* LDV_COMMENT_FUNCTION_CALL Initialize LDV model. */
10972 ldv_initialize();
10973
10974 /** INIT: init_type: ST_MODULE_INIT **/
10975 /* content: static int __init ipw2100_init(void)*/
10976 /* LDV_COMMENT_BEGIN_PREP */
10977 #define IPW2100_VERSION "git-1.2.2"
10978 #define DRV_NAME "ipw2100"
10979 #define DRV_VERSION IPW2100_VERSION
10980 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
10981 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
10982 #ifdef CONFIG_IPW2100_DEBUG
10983 #define IPW2100_RX_DEBUG
10984 #endif
10985 #ifdef CONFIG_PM
10986 #endif
10987 #ifdef CONFIG_IPW2100_DEBUG
10988 #define IPW_DEBUG(level, message...) \
10989 do { \
10990 if (ipw2100_debug_level & (level)) { \
10991 printk(KERN_DEBUG "ipw2100: %c %s ", \
10992 in_interrupt() ? 'I' : 'U', __func__); \
10993 printk(message); \
10994 } \
10995 } while (0)
10996 #else
10997 #define IPW_DEBUG(level, message...) do {} while (0)
10998 #endif
10999 #ifdef CONFIG_IPW2100_DEBUG
11000 #endif
11001 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
11002 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
11003 #define MAX_RESET_BACKOFF 10
11004 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
11005 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
11006 #ifndef CONFIG_PM
11007 #endif
11008 #ifdef CONFIG_PM
11009 #else
11010 #endif
11011 #ifndef CONFIG_PM
11012 #endif
11013 #define MAX_RF_KILL_CHECKS 5
11014 #define RF_KILL_CHECK_DELAY 40
11015 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
11016 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
11017 #define MAC_ASSOCIATION_READ_DELAY (HZ)
11018 #ifdef CONFIG_IPW2100_DEBUG
11019 #define IPW2100_HANDLER(v, f) { v, f, # v }
11020 #else
11021 #define IPW2100_HANDLER(v, f) { v, f }
11022 #endif
11023 #ifdef CONFIG_IPW2100_DEBUG
11024 #endif
11025 #ifdef CONFIG_IPW2100_DEBUG
11026 #endif
11027 #define SEARCH_ERROR 0xffffffff
11028 #define SEARCH_FAIL 0xfffffffe
11029 #define SEARCH_SUCCESS 0xfffffff0
11030 #define SEARCH_DISCARD 0
11031 #define SEARCH_SNAPSHOT 1
11032 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
11033 #ifdef IPW2100_DEBUG_C3
11034 #endif
11035 #ifdef IPW2100_RX_DEBUG
11036 #endif
11037 #ifdef IPW2100_DEBUG_C3
11038 #endif
11039 #ifdef IPW2100_DEBUG_C3
11040 #endif
11041 #ifdef IPW2100_RX_DEBUG
11042 #endif
11043 #ifdef IPW2100_RX_DEBUG
11044 #endif
11045 #ifdef CONFIG_IPW2100_MONITOR
11046 #endif
11047 #ifdef CONFIG_IPW2100_MONITOR
11048 #else
11049 #endif
11050 #ifdef CONFIG_IPW2100_MONITOR
11051 #endif
11052 #ifdef CONFIG_IPW2100_DEBUG
11053 #endif
11054 #ifdef CONFIG_IPW2100_DEBUG
11055 #endif
11056 #ifdef CONFIG_IPW2100_DEBUG
11057 #endif
11058 #define IPW2100_REG(x) { IPW_ ##x, #x }
11059 #define IPW2100_NIC(x, s) { x, #x, s }
11060 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
11061 #ifdef CONFIG_IPW2100_DEBUG
11062 #endif
11063 #ifdef CONFIG_IPW2100_MONITOR
11064 #endif
11065 #ifdef CONFIG_PM
11066 #endif
11067 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
11068 #ifdef CONFIG_IPW2100_DEBUG
11069 #endif
11070 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
11071 #endif
11072 #ifdef IPW2100_TX_POWER
11073 #endif
11074 #if 0
11075 #endif
11076 #ifdef CONFIG_IPW2100_DEBUG
11077 #endif
11078 #define IPW_PRIVACY_CAPABLE 0x0008
11079 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
11080 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
11081 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
11082 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
11083 #ifdef CONFIG_IPW2100_MONITOR
11084 #endif
11085 #ifdef CONFIG_IPW2100_MONITOR
11086 #endif
11087 #ifdef CONFIG_IPW2100_MONITOR
11088 #endif
11089 #ifdef CONFIG_IPW2100_MONITOR
11090 #endif
11091 #ifdef CONFIG_PM
11092 #endif
11093 #ifdef CONFIG_PM
11094 #endif
11095 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
11096 #ifdef CONFIG_PM
11097 #endif
11098 /* LDV_COMMENT_END_PREP */
11099 /* LDV_COMMENT_FUNCTION_CALL Kernel calls driver init function after driver loading to kernel. This function declared as "MODULE_INIT(function name)". */
11100 ldv_handler_precall();
11101 if(ipw2100_init())
11102 goto ldv_final;
11103 /* LDV_COMMENT_BEGIN_PREP */
11104 #ifdef CONFIG_IPW2100_DEBUG
11105 #endif
11106 #ifdef CONFIG_IPW2100_MONITOR
11107 #endif
11108 #define POWER_MODES 5
11109 #ifdef CONFIG_IPW2100_MONITOR
11110 #endif
11111 #define MAX_POWER_STRING 80
11112 #ifdef CONFIG_IPW2100_MONITOR
11113 #endif
11114 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
11115 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
11116 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
11117 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
11118 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
11119 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
11120 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
11121 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
11122 #ifdef CONFIG_IPW2100_MONITOR
11123 #endif
11124 #ifdef CONFIG_IPW2100_MONITOR
11125 #endif
11126 #ifdef CONFIG_IPW2100_MONITOR
11127 #else
11128 #endif
11129 #ifdef CONFIG_IPW2100_MONITOR
11130 #else
11131 #endif
11132 #ifdef CONFIG_IPW2100_DEBUG
11133 #endif
11134 #define IPW2100_FW_MAJOR_VERSION 1
11135 #define IPW2100_FW_MINOR_VERSION 3
11136 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
11137 #define IPW2100_FW_MAJOR(x) (x & 0xff)
11138 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
11139 IPW2100_FW_MAJOR_VERSION)
11140 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
11141 "." __stringify(IPW2100_FW_MINOR_VERSION)
11142 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
11143 #ifdef CONFIG_IPW2100_MONITOR
11144 #endif
11145 #ifdef CONFIG_IPW2100_MONITOR
11146 #endif
11147 /* LDV_COMMENT_END_PREP */
11148
11149
11150 int ldv_s_ipw2100_netdev_ops_net_device_ops = 0;
11151
11152
11153 int ldv_s_ipw2100_pci_driver_pci_driver = 0;
11154
11155
11156
11157
11158
11159
11160
11161 while( nondet_int()
11162 || !(ldv_s_ipw2100_netdev_ops_net_device_ops == 0)
11163 || !(ldv_s_ipw2100_pci_driver_pci_driver == 0)
11164 ) {
11165
11166 switch(nondet_int()) {
11167
11168 case 0: {
11169
11170 /** STRUCT: struct type: ethtool_ops, struct name: ipw2100_ethtool_ops **/
11171
11172
11173 /* content: static u32 ipw2100_ethtool_get_link(struct net_device *dev)*/
11174 /* LDV_COMMENT_BEGIN_PREP */
11175 #define IPW2100_VERSION "git-1.2.2"
11176 #define DRV_NAME "ipw2100"
11177 #define DRV_VERSION IPW2100_VERSION
11178 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
11179 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
11180 #ifdef CONFIG_IPW2100_DEBUG
11181 #define IPW2100_RX_DEBUG
11182 #endif
11183 #ifdef CONFIG_PM
11184 #endif
11185 #ifdef CONFIG_IPW2100_DEBUG
11186 #define IPW_DEBUG(level, message...) \
11187 do { \
11188 if (ipw2100_debug_level & (level)) { \
11189 printk(KERN_DEBUG "ipw2100: %c %s ", \
11190 in_interrupt() ? 'I' : 'U', __func__); \
11191 printk(message); \
11192 } \
11193 } while (0)
11194 #else
11195 #define IPW_DEBUG(level, message...) do {} while (0)
11196 #endif
11197 #ifdef CONFIG_IPW2100_DEBUG
11198 #endif
11199 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
11200 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
11201 #define MAX_RESET_BACKOFF 10
11202 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
11203 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
11204 #ifndef CONFIG_PM
11205 #endif
11206 #ifdef CONFIG_PM
11207 #else
11208 #endif
11209 #ifndef CONFIG_PM
11210 #endif
11211 #define MAX_RF_KILL_CHECKS 5
11212 #define RF_KILL_CHECK_DELAY 40
11213 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
11214 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
11215 #define MAC_ASSOCIATION_READ_DELAY (HZ)
11216 #ifdef CONFIG_IPW2100_DEBUG
11217 #define IPW2100_HANDLER(v, f) { v, f, # v }
11218 #else
11219 #define IPW2100_HANDLER(v, f) { v, f }
11220 #endif
11221 #ifdef CONFIG_IPW2100_DEBUG
11222 #endif
11223 #ifdef CONFIG_IPW2100_DEBUG
11224 #endif
11225 #define SEARCH_ERROR 0xffffffff
11226 #define SEARCH_FAIL 0xfffffffe
11227 #define SEARCH_SUCCESS 0xfffffff0
11228 #define SEARCH_DISCARD 0
11229 #define SEARCH_SNAPSHOT 1
11230 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
11231 #ifdef IPW2100_DEBUG_C3
11232 #endif
11233 #ifdef IPW2100_RX_DEBUG
11234 #endif
11235 #ifdef IPW2100_DEBUG_C3
11236 #endif
11237 #ifdef IPW2100_DEBUG_C3
11238 #endif
11239 #ifdef IPW2100_RX_DEBUG
11240 #endif
11241 #ifdef IPW2100_RX_DEBUG
11242 #endif
11243 #ifdef CONFIG_IPW2100_MONITOR
11244 #endif
11245 #ifdef CONFIG_IPW2100_MONITOR
11246 #else
11247 #endif
11248 #ifdef CONFIG_IPW2100_MONITOR
11249 #endif
11250 #ifdef CONFIG_IPW2100_DEBUG
11251 #endif
11252 #ifdef CONFIG_IPW2100_DEBUG
11253 #endif
11254 #ifdef CONFIG_IPW2100_DEBUG
11255 #endif
11256 #define IPW2100_REG(x) { IPW_ ##x, #x }
11257 #define IPW2100_NIC(x, s) { x, #x, s }
11258 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
11259 #ifdef CONFIG_IPW2100_DEBUG
11260 #endif
11261 #ifdef CONFIG_IPW2100_MONITOR
11262 #endif
11263 #ifdef CONFIG_PM
11264 #endif
11265 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
11266 #ifdef CONFIG_IPW2100_DEBUG
11267 #endif
11268 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
11269 #endif
11270 #ifdef IPW2100_TX_POWER
11271 #endif
11272 #if 0
11273 #endif
11274 #ifdef CONFIG_IPW2100_DEBUG
11275 #endif
11276 #define IPW_PRIVACY_CAPABLE 0x0008
11277 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
11278 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
11279 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
11280 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
11281 #ifdef CONFIG_IPW2100_MONITOR
11282 #endif
11283 #ifdef CONFIG_IPW2100_MONITOR
11284 #endif
11285 /* LDV_COMMENT_END_PREP */
11286 /* LDV_COMMENT_FUNCTION_CALL Function from field "get_link" from driver structure with callbacks "ipw2100_ethtool_ops" */
11287 ldv_handler_precall();
11288 ipw2100_ethtool_get_link( var_group1);
11289 /* LDV_COMMENT_BEGIN_PREP */
11290 #ifdef CONFIG_IPW2100_MONITOR
11291 #endif
11292 #ifdef CONFIG_IPW2100_MONITOR
11293 #endif
11294 #ifdef CONFIG_PM
11295 #endif
11296 #ifdef CONFIG_PM
11297 #endif
11298 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
11299 #ifdef CONFIG_PM
11300 #endif
11301 #ifdef CONFIG_IPW2100_DEBUG
11302 #endif
11303 #ifdef CONFIG_IPW2100_DEBUG
11304 #endif
11305 #ifdef CONFIG_IPW2100_MONITOR
11306 #endif
11307 #define POWER_MODES 5
11308 #ifdef CONFIG_IPW2100_MONITOR
11309 #endif
11310 #define MAX_POWER_STRING 80
11311 #ifdef CONFIG_IPW2100_MONITOR
11312 #endif
11313 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
11314 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
11315 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
11316 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
11317 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
11318 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
11319 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
11320 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
11321 #ifdef CONFIG_IPW2100_MONITOR
11322 #endif
11323 #ifdef CONFIG_IPW2100_MONITOR
11324 #endif
11325 #ifdef CONFIG_IPW2100_MONITOR
11326 #else
11327 #endif
11328 #ifdef CONFIG_IPW2100_MONITOR
11329 #else
11330 #endif
11331 #ifdef CONFIG_IPW2100_DEBUG
11332 #endif
11333 #define IPW2100_FW_MAJOR_VERSION 1
11334 #define IPW2100_FW_MINOR_VERSION 3
11335 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
11336 #define IPW2100_FW_MAJOR(x) (x & 0xff)
11337 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
11338 IPW2100_FW_MAJOR_VERSION)
11339 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
11340 "." __stringify(IPW2100_FW_MINOR_VERSION)
11341 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
11342 #ifdef CONFIG_IPW2100_MONITOR
11343 #endif
11344 #ifdef CONFIG_IPW2100_MONITOR
11345 #endif
11346 /* LDV_COMMENT_END_PREP */
11347
11348
11349
11350
11351 }
11352
11353 break;
11354 case 1: {
11355
11356 /** STRUCT: struct type: ethtool_ops, struct name: ipw2100_ethtool_ops **/
11357
11358
11359 /* content: static void ipw_ethtool_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)*/
11360 /* LDV_COMMENT_BEGIN_PREP */
11361 #define IPW2100_VERSION "git-1.2.2"
11362 #define DRV_NAME "ipw2100"
11363 #define DRV_VERSION IPW2100_VERSION
11364 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
11365 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
11366 #ifdef CONFIG_IPW2100_DEBUG
11367 #define IPW2100_RX_DEBUG
11368 #endif
11369 #ifdef CONFIG_PM
11370 #endif
11371 #ifdef CONFIG_IPW2100_DEBUG
11372 #define IPW_DEBUG(level, message...) \
11373 do { \
11374 if (ipw2100_debug_level & (level)) { \
11375 printk(KERN_DEBUG "ipw2100: %c %s ", \
11376 in_interrupt() ? 'I' : 'U', __func__); \
11377 printk(message); \
11378 } \
11379 } while (0)
11380 #else
11381 #define IPW_DEBUG(level, message...) do {} while (0)
11382 #endif
11383 #ifdef CONFIG_IPW2100_DEBUG
11384 #endif
11385 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
11386 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
11387 #define MAX_RESET_BACKOFF 10
11388 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
11389 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
11390 #ifndef CONFIG_PM
11391 #endif
11392 #ifdef CONFIG_PM
11393 #else
11394 #endif
11395 #ifndef CONFIG_PM
11396 #endif
11397 #define MAX_RF_KILL_CHECKS 5
11398 #define RF_KILL_CHECK_DELAY 40
11399 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
11400 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
11401 #define MAC_ASSOCIATION_READ_DELAY (HZ)
11402 #ifdef CONFIG_IPW2100_DEBUG
11403 #define IPW2100_HANDLER(v, f) { v, f, # v }
11404 #else
11405 #define IPW2100_HANDLER(v, f) { v, f }
11406 #endif
11407 #ifdef CONFIG_IPW2100_DEBUG
11408 #endif
11409 #ifdef CONFIG_IPW2100_DEBUG
11410 #endif
11411 #define SEARCH_ERROR 0xffffffff
11412 #define SEARCH_FAIL 0xfffffffe
11413 #define SEARCH_SUCCESS 0xfffffff0
11414 #define SEARCH_DISCARD 0
11415 #define SEARCH_SNAPSHOT 1
11416 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
11417 #ifdef IPW2100_DEBUG_C3
11418 #endif
11419 #ifdef IPW2100_RX_DEBUG
11420 #endif
11421 #ifdef IPW2100_DEBUG_C3
11422 #endif
11423 #ifdef IPW2100_DEBUG_C3
11424 #endif
11425 #ifdef IPW2100_RX_DEBUG
11426 #endif
11427 #ifdef IPW2100_RX_DEBUG
11428 #endif
11429 #ifdef CONFIG_IPW2100_MONITOR
11430 #endif
11431 #ifdef CONFIG_IPW2100_MONITOR
11432 #else
11433 #endif
11434 #ifdef CONFIG_IPW2100_MONITOR
11435 #endif
11436 #ifdef CONFIG_IPW2100_DEBUG
11437 #endif
11438 #ifdef CONFIG_IPW2100_DEBUG
11439 #endif
11440 #ifdef CONFIG_IPW2100_DEBUG
11441 #endif
11442 #define IPW2100_REG(x) { IPW_ ##x, #x }
11443 #define IPW2100_NIC(x, s) { x, #x, s }
11444 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
11445 #ifdef CONFIG_IPW2100_DEBUG
11446 #endif
11447 #ifdef CONFIG_IPW2100_MONITOR
11448 #endif
11449 #ifdef CONFIG_PM
11450 #endif
11451 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
11452 #ifdef CONFIG_IPW2100_DEBUG
11453 #endif
11454 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
11455 #endif
11456 #ifdef IPW2100_TX_POWER
11457 #endif
11458 #if 0
11459 #endif
11460 #ifdef CONFIG_IPW2100_DEBUG
11461 #endif
11462 #define IPW_PRIVACY_CAPABLE 0x0008
11463 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
11464 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
11465 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
11466 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
11467 #ifdef CONFIG_IPW2100_MONITOR
11468 #endif
11469 #ifdef CONFIG_IPW2100_MONITOR
11470 #endif
11471 /* LDV_COMMENT_END_PREP */
11472 /* LDV_COMMENT_FUNCTION_CALL Function from field "get_drvinfo" from driver structure with callbacks "ipw2100_ethtool_ops" */
11473 ldv_handler_precall();
11474 ipw_ethtool_get_drvinfo( var_group1, var_group2);
11475 /* LDV_COMMENT_BEGIN_PREP */
11476 #ifdef CONFIG_IPW2100_MONITOR
11477 #endif
11478 #ifdef CONFIG_IPW2100_MONITOR
11479 #endif
11480 #ifdef CONFIG_PM
11481 #endif
11482 #ifdef CONFIG_PM
11483 #endif
11484 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
11485 #ifdef CONFIG_PM
11486 #endif
11487 #ifdef CONFIG_IPW2100_DEBUG
11488 #endif
11489 #ifdef CONFIG_IPW2100_DEBUG
11490 #endif
11491 #ifdef CONFIG_IPW2100_MONITOR
11492 #endif
11493 #define POWER_MODES 5
11494 #ifdef CONFIG_IPW2100_MONITOR
11495 #endif
11496 #define MAX_POWER_STRING 80
11497 #ifdef CONFIG_IPW2100_MONITOR
11498 #endif
11499 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
11500 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
11501 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
11502 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
11503 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
11504 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
11505 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
11506 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
11507 #ifdef CONFIG_IPW2100_MONITOR
11508 #endif
11509 #ifdef CONFIG_IPW2100_MONITOR
11510 #endif
11511 #ifdef CONFIG_IPW2100_MONITOR
11512 #else
11513 #endif
11514 #ifdef CONFIG_IPW2100_MONITOR
11515 #else
11516 #endif
11517 #ifdef CONFIG_IPW2100_DEBUG
11518 #endif
11519 #define IPW2100_FW_MAJOR_VERSION 1
11520 #define IPW2100_FW_MINOR_VERSION 3
11521 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
11522 #define IPW2100_FW_MAJOR(x) (x & 0xff)
11523 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
11524 IPW2100_FW_MAJOR_VERSION)
11525 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
11526 "." __stringify(IPW2100_FW_MINOR_VERSION)
11527 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
11528 #ifdef CONFIG_IPW2100_MONITOR
11529 #endif
11530 #ifdef CONFIG_IPW2100_MONITOR
11531 #endif
11532 /* LDV_COMMENT_END_PREP */
11533
11534
11535
11536
11537 }
11538
11539 break;
11540 case 2: {
11541
11542 /** STRUCT: struct type: net_device_ops, struct name: ipw2100_netdev_ops **/
11543 if(ldv_s_ipw2100_netdev_ops_net_device_ops==0) {
11544
11545 /* content: static int ipw2100_open(struct net_device *dev)*/
11546 /* LDV_COMMENT_BEGIN_PREP */
11547 #define IPW2100_VERSION "git-1.2.2"
11548 #define DRV_NAME "ipw2100"
11549 #define DRV_VERSION IPW2100_VERSION
11550 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
11551 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
11552 #ifdef CONFIG_IPW2100_DEBUG
11553 #define IPW2100_RX_DEBUG
11554 #endif
11555 #ifdef CONFIG_PM
11556 #endif
11557 #ifdef CONFIG_IPW2100_DEBUG
11558 #define IPW_DEBUG(level, message...) \
11559 do { \
11560 if (ipw2100_debug_level & (level)) { \
11561 printk(KERN_DEBUG "ipw2100: %c %s ", \
11562 in_interrupt() ? 'I' : 'U', __func__); \
11563 printk(message); \
11564 } \
11565 } while (0)
11566 #else
11567 #define IPW_DEBUG(level, message...) do {} while (0)
11568 #endif
11569 #ifdef CONFIG_IPW2100_DEBUG
11570 #endif
11571 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
11572 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
11573 #define MAX_RESET_BACKOFF 10
11574 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
11575 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
11576 #ifndef CONFIG_PM
11577 #endif
11578 #ifdef CONFIG_PM
11579 #else
11580 #endif
11581 #ifndef CONFIG_PM
11582 #endif
11583 #define MAX_RF_KILL_CHECKS 5
11584 #define RF_KILL_CHECK_DELAY 40
11585 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
11586 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
11587 #define MAC_ASSOCIATION_READ_DELAY (HZ)
11588 #ifdef CONFIG_IPW2100_DEBUG
11589 #define IPW2100_HANDLER(v, f) { v, f, # v }
11590 #else
11591 #define IPW2100_HANDLER(v, f) { v, f }
11592 #endif
11593 #ifdef CONFIG_IPW2100_DEBUG
11594 #endif
11595 #ifdef CONFIG_IPW2100_DEBUG
11596 #endif
11597 #define SEARCH_ERROR 0xffffffff
11598 #define SEARCH_FAIL 0xfffffffe
11599 #define SEARCH_SUCCESS 0xfffffff0
11600 #define SEARCH_DISCARD 0
11601 #define SEARCH_SNAPSHOT 1
11602 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
11603 #ifdef IPW2100_DEBUG_C3
11604 #endif
11605 #ifdef IPW2100_RX_DEBUG
11606 #endif
11607 #ifdef IPW2100_DEBUG_C3
11608 #endif
11609 #ifdef IPW2100_DEBUG_C3
11610 #endif
11611 #ifdef IPW2100_RX_DEBUG
11612 #endif
11613 #ifdef IPW2100_RX_DEBUG
11614 #endif
11615 #ifdef CONFIG_IPW2100_MONITOR
11616 #endif
11617 #ifdef CONFIG_IPW2100_MONITOR
11618 #else
11619 #endif
11620 #ifdef CONFIG_IPW2100_MONITOR
11621 #endif
11622 #ifdef CONFIG_IPW2100_DEBUG
11623 #endif
11624 #ifdef CONFIG_IPW2100_DEBUG
11625 #endif
11626 #ifdef CONFIG_IPW2100_DEBUG
11627 #endif
11628 #define IPW2100_REG(x) { IPW_ ##x, #x }
11629 #define IPW2100_NIC(x, s) { x, #x, s }
11630 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
11631 #ifdef CONFIG_IPW2100_DEBUG
11632 #endif
11633 #ifdef CONFIG_IPW2100_MONITOR
11634 #endif
11635 #ifdef CONFIG_PM
11636 #endif
11637 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
11638 #ifdef CONFIG_IPW2100_DEBUG
11639 #endif
11640 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
11641 #endif
11642 #ifdef IPW2100_TX_POWER
11643 #endif
11644 #if 0
11645 #endif
11646 #ifdef CONFIG_IPW2100_DEBUG
11647 #endif
11648 #define IPW_PRIVACY_CAPABLE 0x0008
11649 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
11650 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
11651 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
11652 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
11653 #ifdef CONFIG_IPW2100_MONITOR
11654 #endif
11655 /* LDV_COMMENT_END_PREP */
11656 /* LDV_COMMENT_FUNCTION_CALL Function from field "ndo_open" from driver structure with callbacks "ipw2100_netdev_ops". Standart function test for correct return result. */
11657 ldv_handler_precall();
11658 res_ipw2100_open_136 = ipw2100_open( var_group1);
11659 ldv_check_return_value(res_ipw2100_open_136);
11660 if(res_ipw2100_open_136 < 0)
11661 goto ldv_module_exit;
11662 /* LDV_COMMENT_BEGIN_PREP */
11663 #ifdef CONFIG_IPW2100_MONITOR
11664 #endif
11665 #ifdef CONFIG_IPW2100_MONITOR
11666 #endif
11667 #ifdef CONFIG_IPW2100_MONITOR
11668 #endif
11669 #ifdef CONFIG_PM
11670 #endif
11671 #ifdef CONFIG_PM
11672 #endif
11673 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
11674 #ifdef CONFIG_PM
11675 #endif
11676 #ifdef CONFIG_IPW2100_DEBUG
11677 #endif
11678 #ifdef CONFIG_IPW2100_DEBUG
11679 #endif
11680 #ifdef CONFIG_IPW2100_MONITOR
11681 #endif
11682 #define POWER_MODES 5
11683 #ifdef CONFIG_IPW2100_MONITOR
11684 #endif
11685 #define MAX_POWER_STRING 80
11686 #ifdef CONFIG_IPW2100_MONITOR
11687 #endif
11688 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
11689 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
11690 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
11691 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
11692 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
11693 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
11694 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
11695 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
11696 #ifdef CONFIG_IPW2100_MONITOR
11697 #endif
11698 #ifdef CONFIG_IPW2100_MONITOR
11699 #endif
11700 #ifdef CONFIG_IPW2100_MONITOR
11701 #else
11702 #endif
11703 #ifdef CONFIG_IPW2100_MONITOR
11704 #else
11705 #endif
11706 #ifdef CONFIG_IPW2100_DEBUG
11707 #endif
11708 #define IPW2100_FW_MAJOR_VERSION 1
11709 #define IPW2100_FW_MINOR_VERSION 3
11710 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
11711 #define IPW2100_FW_MAJOR(x) (x & 0xff)
11712 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
11713 IPW2100_FW_MAJOR_VERSION)
11714 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
11715 "." __stringify(IPW2100_FW_MINOR_VERSION)
11716 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
11717 #ifdef CONFIG_IPW2100_MONITOR
11718 #endif
11719 #ifdef CONFIG_IPW2100_MONITOR
11720 #endif
11721 /* LDV_COMMENT_END_PREP */
11722 ldv_s_ipw2100_netdev_ops_net_device_ops++;
11723
11724 }
11725
11726 }
11727
11728 break;
11729 case 3: {
11730
11731 /** STRUCT: struct type: net_device_ops, struct name: ipw2100_netdev_ops **/
11732 if(ldv_s_ipw2100_netdev_ops_net_device_ops==1) {
11733
11734 /* content: static int ipw2100_close(struct net_device *dev)*/
11735 /* LDV_COMMENT_BEGIN_PREP */
11736 #define IPW2100_VERSION "git-1.2.2"
11737 #define DRV_NAME "ipw2100"
11738 #define DRV_VERSION IPW2100_VERSION
11739 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
11740 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
11741 #ifdef CONFIG_IPW2100_DEBUG
11742 #define IPW2100_RX_DEBUG
11743 #endif
11744 #ifdef CONFIG_PM
11745 #endif
11746 #ifdef CONFIG_IPW2100_DEBUG
11747 #define IPW_DEBUG(level, message...) \
11748 do { \
11749 if (ipw2100_debug_level & (level)) { \
11750 printk(KERN_DEBUG "ipw2100: %c %s ", \
11751 in_interrupt() ? 'I' : 'U', __func__); \
11752 printk(message); \
11753 } \
11754 } while (0)
11755 #else
11756 #define IPW_DEBUG(level, message...) do {} while (0)
11757 #endif
11758 #ifdef CONFIG_IPW2100_DEBUG
11759 #endif
11760 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
11761 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
11762 #define MAX_RESET_BACKOFF 10
11763 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
11764 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
11765 #ifndef CONFIG_PM
11766 #endif
11767 #ifdef CONFIG_PM
11768 #else
11769 #endif
11770 #ifndef CONFIG_PM
11771 #endif
11772 #define MAX_RF_KILL_CHECKS 5
11773 #define RF_KILL_CHECK_DELAY 40
11774 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
11775 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
11776 #define MAC_ASSOCIATION_READ_DELAY (HZ)
11777 #ifdef CONFIG_IPW2100_DEBUG
11778 #define IPW2100_HANDLER(v, f) { v, f, # v }
11779 #else
11780 #define IPW2100_HANDLER(v, f) { v, f }
11781 #endif
11782 #ifdef CONFIG_IPW2100_DEBUG
11783 #endif
11784 #ifdef CONFIG_IPW2100_DEBUG
11785 #endif
11786 #define SEARCH_ERROR 0xffffffff
11787 #define SEARCH_FAIL 0xfffffffe
11788 #define SEARCH_SUCCESS 0xfffffff0
11789 #define SEARCH_DISCARD 0
11790 #define SEARCH_SNAPSHOT 1
11791 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
11792 #ifdef IPW2100_DEBUG_C3
11793 #endif
11794 #ifdef IPW2100_RX_DEBUG
11795 #endif
11796 #ifdef IPW2100_DEBUG_C3
11797 #endif
11798 #ifdef IPW2100_DEBUG_C3
11799 #endif
11800 #ifdef IPW2100_RX_DEBUG
11801 #endif
11802 #ifdef IPW2100_RX_DEBUG
11803 #endif
11804 #ifdef CONFIG_IPW2100_MONITOR
11805 #endif
11806 #ifdef CONFIG_IPW2100_MONITOR
11807 #else
11808 #endif
11809 #ifdef CONFIG_IPW2100_MONITOR
11810 #endif
11811 #ifdef CONFIG_IPW2100_DEBUG
11812 #endif
11813 #ifdef CONFIG_IPW2100_DEBUG
11814 #endif
11815 #ifdef CONFIG_IPW2100_DEBUG
11816 #endif
11817 #define IPW2100_REG(x) { IPW_ ##x, #x }
11818 #define IPW2100_NIC(x, s) { x, #x, s }
11819 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
11820 #ifdef CONFIG_IPW2100_DEBUG
11821 #endif
11822 #ifdef CONFIG_IPW2100_MONITOR
11823 #endif
11824 #ifdef CONFIG_PM
11825 #endif
11826 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
11827 #ifdef CONFIG_IPW2100_DEBUG
11828 #endif
11829 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
11830 #endif
11831 #ifdef IPW2100_TX_POWER
11832 #endif
11833 #if 0
11834 #endif
11835 #ifdef CONFIG_IPW2100_DEBUG
11836 #endif
11837 #define IPW_PRIVACY_CAPABLE 0x0008
11838 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
11839 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
11840 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
11841 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
11842 #ifdef CONFIG_IPW2100_MONITOR
11843 #endif
11844 /* LDV_COMMENT_END_PREP */
11845 /* LDV_COMMENT_FUNCTION_CALL Function from field "ndo_stop" from driver structure with callbacks "ipw2100_netdev_ops". Standart function test for correct return result. */
11846 ldv_handler_precall();
11847 res_ipw2100_close_137 = ipw2100_close( var_group1);
11848 ldv_check_return_value(res_ipw2100_close_137);
11849 if(res_ipw2100_close_137)
11850 goto ldv_module_exit;
11851 /* LDV_COMMENT_BEGIN_PREP */
11852 #ifdef CONFIG_IPW2100_MONITOR
11853 #endif
11854 #ifdef CONFIG_IPW2100_MONITOR
11855 #endif
11856 #ifdef CONFIG_IPW2100_MONITOR
11857 #endif
11858 #ifdef CONFIG_PM
11859 #endif
11860 #ifdef CONFIG_PM
11861 #endif
11862 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
11863 #ifdef CONFIG_PM
11864 #endif
11865 #ifdef CONFIG_IPW2100_DEBUG
11866 #endif
11867 #ifdef CONFIG_IPW2100_DEBUG
11868 #endif
11869 #ifdef CONFIG_IPW2100_MONITOR
11870 #endif
11871 #define POWER_MODES 5
11872 #ifdef CONFIG_IPW2100_MONITOR
11873 #endif
11874 #define MAX_POWER_STRING 80
11875 #ifdef CONFIG_IPW2100_MONITOR
11876 #endif
11877 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
11878 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
11879 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
11880 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
11881 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
11882 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
11883 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
11884 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
11885 #ifdef CONFIG_IPW2100_MONITOR
11886 #endif
11887 #ifdef CONFIG_IPW2100_MONITOR
11888 #endif
11889 #ifdef CONFIG_IPW2100_MONITOR
11890 #else
11891 #endif
11892 #ifdef CONFIG_IPW2100_MONITOR
11893 #else
11894 #endif
11895 #ifdef CONFIG_IPW2100_DEBUG
11896 #endif
11897 #define IPW2100_FW_MAJOR_VERSION 1
11898 #define IPW2100_FW_MINOR_VERSION 3
11899 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
11900 #define IPW2100_FW_MAJOR(x) (x & 0xff)
11901 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
11902 IPW2100_FW_MAJOR_VERSION)
11903 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
11904 "." __stringify(IPW2100_FW_MINOR_VERSION)
11905 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
11906 #ifdef CONFIG_IPW2100_MONITOR
11907 #endif
11908 #ifdef CONFIG_IPW2100_MONITOR
11909 #endif
11910 /* LDV_COMMENT_END_PREP */
11911 ldv_s_ipw2100_netdev_ops_net_device_ops=0;
11912
11913 }
11914
11915 }
11916
11917 break;
11918 case 4: {
11919
11920 /** STRUCT: struct type: net_device_ops, struct name: ipw2100_netdev_ops **/
11921
11922
11923 /* content: static void ipw2100_tx_timeout(struct net_device *dev)*/
11924 /* LDV_COMMENT_BEGIN_PREP */
11925 #define IPW2100_VERSION "git-1.2.2"
11926 #define DRV_NAME "ipw2100"
11927 #define DRV_VERSION IPW2100_VERSION
11928 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
11929 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
11930 #ifdef CONFIG_IPW2100_DEBUG
11931 #define IPW2100_RX_DEBUG
11932 #endif
11933 #ifdef CONFIG_PM
11934 #endif
11935 #ifdef CONFIG_IPW2100_DEBUG
11936 #define IPW_DEBUG(level, message...) \
11937 do { \
11938 if (ipw2100_debug_level & (level)) { \
11939 printk(KERN_DEBUG "ipw2100: %c %s ", \
11940 in_interrupt() ? 'I' : 'U', __func__); \
11941 printk(message); \
11942 } \
11943 } while (0)
11944 #else
11945 #define IPW_DEBUG(level, message...) do {} while (0)
11946 #endif
11947 #ifdef CONFIG_IPW2100_DEBUG
11948 #endif
11949 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
11950 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
11951 #define MAX_RESET_BACKOFF 10
11952 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
11953 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
11954 #ifndef CONFIG_PM
11955 #endif
11956 #ifdef CONFIG_PM
11957 #else
11958 #endif
11959 #ifndef CONFIG_PM
11960 #endif
11961 #define MAX_RF_KILL_CHECKS 5
11962 #define RF_KILL_CHECK_DELAY 40
11963 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
11964 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
11965 #define MAC_ASSOCIATION_READ_DELAY (HZ)
11966 #ifdef CONFIG_IPW2100_DEBUG
11967 #define IPW2100_HANDLER(v, f) { v, f, # v }
11968 #else
11969 #define IPW2100_HANDLER(v, f) { v, f }
11970 #endif
11971 #ifdef CONFIG_IPW2100_DEBUG
11972 #endif
11973 #ifdef CONFIG_IPW2100_DEBUG
11974 #endif
11975 #define SEARCH_ERROR 0xffffffff
11976 #define SEARCH_FAIL 0xfffffffe
11977 #define SEARCH_SUCCESS 0xfffffff0
11978 #define SEARCH_DISCARD 0
11979 #define SEARCH_SNAPSHOT 1
11980 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
11981 #ifdef IPW2100_DEBUG_C3
11982 #endif
11983 #ifdef IPW2100_RX_DEBUG
11984 #endif
11985 #ifdef IPW2100_DEBUG_C3
11986 #endif
11987 #ifdef IPW2100_DEBUG_C3
11988 #endif
11989 #ifdef IPW2100_RX_DEBUG
11990 #endif
11991 #ifdef IPW2100_RX_DEBUG
11992 #endif
11993 #ifdef CONFIG_IPW2100_MONITOR
11994 #endif
11995 #ifdef CONFIG_IPW2100_MONITOR
11996 #else
11997 #endif
11998 #ifdef CONFIG_IPW2100_MONITOR
11999 #endif
12000 #ifdef CONFIG_IPW2100_DEBUG
12001 #endif
12002 #ifdef CONFIG_IPW2100_DEBUG
12003 #endif
12004 #ifdef CONFIG_IPW2100_DEBUG
12005 #endif
12006 #define IPW2100_REG(x) { IPW_ ##x, #x }
12007 #define IPW2100_NIC(x, s) { x, #x, s }
12008 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
12009 #ifdef CONFIG_IPW2100_DEBUG
12010 #endif
12011 #ifdef CONFIG_IPW2100_MONITOR
12012 #endif
12013 #ifdef CONFIG_PM
12014 #endif
12015 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
12016 #ifdef CONFIG_IPW2100_DEBUG
12017 #endif
12018 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
12019 #endif
12020 #ifdef IPW2100_TX_POWER
12021 #endif
12022 #if 0
12023 #endif
12024 #ifdef CONFIG_IPW2100_DEBUG
12025 #endif
12026 #define IPW_PRIVACY_CAPABLE 0x0008
12027 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
12028 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
12029 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
12030 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
12031 #ifdef CONFIG_IPW2100_MONITOR
12032 #endif
12033 /* LDV_COMMENT_END_PREP */
12034 /* LDV_COMMENT_FUNCTION_CALL Function from field "ndo_tx_timeout" from driver structure with callbacks "ipw2100_netdev_ops" */
12035 ldv_handler_precall();
12036 ipw2100_tx_timeout( var_group1);
12037 /* LDV_COMMENT_BEGIN_PREP */
12038 #ifdef CONFIG_IPW2100_MONITOR
12039 #endif
12040 #ifdef CONFIG_IPW2100_MONITOR
12041 #endif
12042 #ifdef CONFIG_PM
12043 #endif
12044 #ifdef CONFIG_PM
12045 #endif
12046 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
12047 #ifdef CONFIG_PM
12048 #endif
12049 #ifdef CONFIG_IPW2100_DEBUG
12050 #endif
12051 #ifdef CONFIG_IPW2100_DEBUG
12052 #endif
12053 #ifdef CONFIG_IPW2100_MONITOR
12054 #endif
12055 #define POWER_MODES 5
12056 #ifdef CONFIG_IPW2100_MONITOR
12057 #endif
12058 #define MAX_POWER_STRING 80
12059 #ifdef CONFIG_IPW2100_MONITOR
12060 #endif
12061 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
12062 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
12063 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
12064 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
12065 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
12066 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
12067 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
12068 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
12069 #ifdef CONFIG_IPW2100_MONITOR
12070 #endif
12071 #ifdef CONFIG_IPW2100_MONITOR
12072 #endif
12073 #ifdef CONFIG_IPW2100_MONITOR
12074 #else
12075 #endif
12076 #ifdef CONFIG_IPW2100_MONITOR
12077 #else
12078 #endif
12079 #ifdef CONFIG_IPW2100_DEBUG
12080 #endif
12081 #define IPW2100_FW_MAJOR_VERSION 1
12082 #define IPW2100_FW_MINOR_VERSION 3
12083 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
12084 #define IPW2100_FW_MAJOR(x) (x & 0xff)
12085 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
12086 IPW2100_FW_MAJOR_VERSION)
12087 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
12088 "." __stringify(IPW2100_FW_MINOR_VERSION)
12089 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
12090 #ifdef CONFIG_IPW2100_MONITOR
12091 #endif
12092 #ifdef CONFIG_IPW2100_MONITOR
12093 #endif
12094 /* LDV_COMMENT_END_PREP */
12095
12096
12097
12098
12099 }
12100
12101 break;
12102 case 5: {
12103
12104 /** STRUCT: struct type: net_device_ops, struct name: ipw2100_netdev_ops **/
12105
12106
12107 /* content: static int ipw2100_set_address(struct net_device *dev, void *p)*/
12108 /* LDV_COMMENT_BEGIN_PREP */
12109 #define IPW2100_VERSION "git-1.2.2"
12110 #define DRV_NAME "ipw2100"
12111 #define DRV_VERSION IPW2100_VERSION
12112 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
12113 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
12114 #ifdef CONFIG_IPW2100_DEBUG
12115 #define IPW2100_RX_DEBUG
12116 #endif
12117 #ifdef CONFIG_PM
12118 #endif
12119 #ifdef CONFIG_IPW2100_DEBUG
12120 #define IPW_DEBUG(level, message...) \
12121 do { \
12122 if (ipw2100_debug_level & (level)) { \
12123 printk(KERN_DEBUG "ipw2100: %c %s ", \
12124 in_interrupt() ? 'I' : 'U', __func__); \
12125 printk(message); \
12126 } \
12127 } while (0)
12128 #else
12129 #define IPW_DEBUG(level, message...) do {} while (0)
12130 #endif
12131 #ifdef CONFIG_IPW2100_DEBUG
12132 #endif
12133 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
12134 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
12135 #define MAX_RESET_BACKOFF 10
12136 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
12137 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
12138 #ifndef CONFIG_PM
12139 #endif
12140 #ifdef CONFIG_PM
12141 #else
12142 #endif
12143 #ifndef CONFIG_PM
12144 #endif
12145 #define MAX_RF_KILL_CHECKS 5
12146 #define RF_KILL_CHECK_DELAY 40
12147 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
12148 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
12149 #define MAC_ASSOCIATION_READ_DELAY (HZ)
12150 #ifdef CONFIG_IPW2100_DEBUG
12151 #define IPW2100_HANDLER(v, f) { v, f, # v }
12152 #else
12153 #define IPW2100_HANDLER(v, f) { v, f }
12154 #endif
12155 #ifdef CONFIG_IPW2100_DEBUG
12156 #endif
12157 #ifdef CONFIG_IPW2100_DEBUG
12158 #endif
12159 #define SEARCH_ERROR 0xffffffff
12160 #define SEARCH_FAIL 0xfffffffe
12161 #define SEARCH_SUCCESS 0xfffffff0
12162 #define SEARCH_DISCARD 0
12163 #define SEARCH_SNAPSHOT 1
12164 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
12165 #ifdef IPW2100_DEBUG_C3
12166 #endif
12167 #ifdef IPW2100_RX_DEBUG
12168 #endif
12169 #ifdef IPW2100_DEBUG_C3
12170 #endif
12171 #ifdef IPW2100_DEBUG_C3
12172 #endif
12173 #ifdef IPW2100_RX_DEBUG
12174 #endif
12175 #ifdef IPW2100_RX_DEBUG
12176 #endif
12177 #ifdef CONFIG_IPW2100_MONITOR
12178 #endif
12179 #ifdef CONFIG_IPW2100_MONITOR
12180 #else
12181 #endif
12182 #ifdef CONFIG_IPW2100_MONITOR
12183 #endif
12184 #ifdef CONFIG_IPW2100_DEBUG
12185 #endif
12186 #ifdef CONFIG_IPW2100_DEBUG
12187 #endif
12188 #ifdef CONFIG_IPW2100_DEBUG
12189 #endif
12190 #define IPW2100_REG(x) { IPW_ ##x, #x }
12191 #define IPW2100_NIC(x, s) { x, #x, s }
12192 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
12193 #ifdef CONFIG_IPW2100_DEBUG
12194 #endif
12195 #ifdef CONFIG_IPW2100_MONITOR
12196 #endif
12197 #ifdef CONFIG_PM
12198 #endif
12199 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
12200 #ifdef CONFIG_IPW2100_DEBUG
12201 #endif
12202 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
12203 #endif
12204 #ifdef IPW2100_TX_POWER
12205 #endif
12206 #if 0
12207 #endif
12208 #ifdef CONFIG_IPW2100_DEBUG
12209 #endif
12210 #define IPW_PRIVACY_CAPABLE 0x0008
12211 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
12212 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
12213 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
12214 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
12215 #ifdef CONFIG_IPW2100_MONITOR
12216 #endif
12217 /* LDV_COMMENT_END_PREP */
12218 /* LDV_COMMENT_FUNCTION_CALL Function from field "ndo_set_mac_address" from driver structure with callbacks "ipw2100_netdev_ops" */
12219 ldv_handler_precall();
12220 ipw2100_set_address( var_group1, var_ipw2100_set_address_135_p1);
12221 /* LDV_COMMENT_BEGIN_PREP */
12222 #ifdef CONFIG_IPW2100_MONITOR
12223 #endif
12224 #ifdef CONFIG_IPW2100_MONITOR
12225 #endif
12226 #ifdef CONFIG_IPW2100_MONITOR
12227 #endif
12228 #ifdef CONFIG_PM
12229 #endif
12230 #ifdef CONFIG_PM
12231 #endif
12232 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
12233 #ifdef CONFIG_PM
12234 #endif
12235 #ifdef CONFIG_IPW2100_DEBUG
12236 #endif
12237 #ifdef CONFIG_IPW2100_DEBUG
12238 #endif
12239 #ifdef CONFIG_IPW2100_MONITOR
12240 #endif
12241 #define POWER_MODES 5
12242 #ifdef CONFIG_IPW2100_MONITOR
12243 #endif
12244 #define MAX_POWER_STRING 80
12245 #ifdef CONFIG_IPW2100_MONITOR
12246 #endif
12247 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
12248 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
12249 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
12250 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
12251 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
12252 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
12253 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
12254 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
12255 #ifdef CONFIG_IPW2100_MONITOR
12256 #endif
12257 #ifdef CONFIG_IPW2100_MONITOR
12258 #endif
12259 #ifdef CONFIG_IPW2100_MONITOR
12260 #else
12261 #endif
12262 #ifdef CONFIG_IPW2100_MONITOR
12263 #else
12264 #endif
12265 #ifdef CONFIG_IPW2100_DEBUG
12266 #endif
12267 #define IPW2100_FW_MAJOR_VERSION 1
12268 #define IPW2100_FW_MINOR_VERSION 3
12269 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
12270 #define IPW2100_FW_MAJOR(x) (x & 0xff)
12271 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
12272 IPW2100_FW_MAJOR_VERSION)
12273 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
12274 "." __stringify(IPW2100_FW_MINOR_VERSION)
12275 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
12276 #ifdef CONFIG_IPW2100_MONITOR
12277 #endif
12278 #ifdef CONFIG_IPW2100_MONITOR
12279 #endif
12280 /* LDV_COMMENT_END_PREP */
12281
12282
12283
12284
12285 }
12286
12287 break;
12288 case 6: {
12289
12290 /** STRUCT: struct type: pci_driver, struct name: ipw2100_pci_driver **/
12291 if(ldv_s_ipw2100_pci_driver_pci_driver==0) {
12292
12293 /* content: static int ipw2100_pci_init_one(struct pci_dev *pci_dev, const struct pci_device_id *ent)*/
12294 /* LDV_COMMENT_BEGIN_PREP */
12295 #define IPW2100_VERSION "git-1.2.2"
12296 #define DRV_NAME "ipw2100"
12297 #define DRV_VERSION IPW2100_VERSION
12298 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
12299 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
12300 #ifdef CONFIG_IPW2100_DEBUG
12301 #define IPW2100_RX_DEBUG
12302 #endif
12303 #ifdef CONFIG_PM
12304 #endif
12305 #ifdef CONFIG_IPW2100_DEBUG
12306 #define IPW_DEBUG(level, message...) \
12307 do { \
12308 if (ipw2100_debug_level & (level)) { \
12309 printk(KERN_DEBUG "ipw2100: %c %s ", \
12310 in_interrupt() ? 'I' : 'U', __func__); \
12311 printk(message); \
12312 } \
12313 } while (0)
12314 #else
12315 #define IPW_DEBUG(level, message...) do {} while (0)
12316 #endif
12317 #ifdef CONFIG_IPW2100_DEBUG
12318 #endif
12319 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
12320 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
12321 #define MAX_RESET_BACKOFF 10
12322 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
12323 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
12324 #ifndef CONFIG_PM
12325 #endif
12326 #ifdef CONFIG_PM
12327 #else
12328 #endif
12329 #ifndef CONFIG_PM
12330 #endif
12331 #define MAX_RF_KILL_CHECKS 5
12332 #define RF_KILL_CHECK_DELAY 40
12333 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
12334 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
12335 #define MAC_ASSOCIATION_READ_DELAY (HZ)
12336 #ifdef CONFIG_IPW2100_DEBUG
12337 #define IPW2100_HANDLER(v, f) { v, f, # v }
12338 #else
12339 #define IPW2100_HANDLER(v, f) { v, f }
12340 #endif
12341 #ifdef CONFIG_IPW2100_DEBUG
12342 #endif
12343 #ifdef CONFIG_IPW2100_DEBUG
12344 #endif
12345 #define SEARCH_ERROR 0xffffffff
12346 #define SEARCH_FAIL 0xfffffffe
12347 #define SEARCH_SUCCESS 0xfffffff0
12348 #define SEARCH_DISCARD 0
12349 #define SEARCH_SNAPSHOT 1
12350 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
12351 #ifdef IPW2100_DEBUG_C3
12352 #endif
12353 #ifdef IPW2100_RX_DEBUG
12354 #endif
12355 #ifdef IPW2100_DEBUG_C3
12356 #endif
12357 #ifdef IPW2100_DEBUG_C3
12358 #endif
12359 #ifdef IPW2100_RX_DEBUG
12360 #endif
12361 #ifdef IPW2100_RX_DEBUG
12362 #endif
12363 #ifdef CONFIG_IPW2100_MONITOR
12364 #endif
12365 #ifdef CONFIG_IPW2100_MONITOR
12366 #else
12367 #endif
12368 #ifdef CONFIG_IPW2100_MONITOR
12369 #endif
12370 #ifdef CONFIG_IPW2100_DEBUG
12371 #endif
12372 #ifdef CONFIG_IPW2100_DEBUG
12373 #endif
12374 #ifdef CONFIG_IPW2100_DEBUG
12375 #endif
12376 #define IPW2100_REG(x) { IPW_ ##x, #x }
12377 #define IPW2100_NIC(x, s) { x, #x, s }
12378 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
12379 #ifdef CONFIG_IPW2100_DEBUG
12380 #endif
12381 #ifdef CONFIG_IPW2100_MONITOR
12382 #endif
12383 #ifdef CONFIG_PM
12384 #endif
12385 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
12386 #ifdef CONFIG_IPW2100_DEBUG
12387 #endif
12388 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
12389 #endif
12390 #ifdef IPW2100_TX_POWER
12391 #endif
12392 #if 0
12393 #endif
12394 #ifdef CONFIG_IPW2100_DEBUG
12395 #endif
12396 #define IPW_PRIVACY_CAPABLE 0x0008
12397 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
12398 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
12399 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
12400 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
12401 #ifdef CONFIG_IPW2100_MONITOR
12402 #endif
12403 #ifdef CONFIG_IPW2100_MONITOR
12404 #endif
12405 #ifdef CONFIG_IPW2100_MONITOR
12406 #endif
12407 #ifdef CONFIG_IPW2100_MONITOR
12408 #endif
12409 /* LDV_COMMENT_END_PREP */
12410 /* LDV_COMMENT_FUNCTION_CALL Function from field "probe" from driver structure with callbacks "ipw2100_pci_driver". Standart function test for correct return result. */
12411 res_ipw2100_pci_init_one_147 = ipw2100_pci_init_one( var_group3, var_ipw2100_pci_init_one_147_p1);
12412 ldv_check_return_value(res_ipw2100_pci_init_one_147);
12413 ldv_check_return_value_probe(res_ipw2100_pci_init_one_147);
12414 if(res_ipw2100_pci_init_one_147)
12415 goto ldv_module_exit;
12416 /* LDV_COMMENT_BEGIN_PREP */
12417 #ifdef CONFIG_PM
12418 #endif
12419 #ifdef CONFIG_PM
12420 #endif
12421 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
12422 #ifdef CONFIG_PM
12423 #endif
12424 #ifdef CONFIG_IPW2100_DEBUG
12425 #endif
12426 #ifdef CONFIG_IPW2100_DEBUG
12427 #endif
12428 #ifdef CONFIG_IPW2100_MONITOR
12429 #endif
12430 #define POWER_MODES 5
12431 #ifdef CONFIG_IPW2100_MONITOR
12432 #endif
12433 #define MAX_POWER_STRING 80
12434 #ifdef CONFIG_IPW2100_MONITOR
12435 #endif
12436 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
12437 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
12438 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
12439 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
12440 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
12441 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
12442 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
12443 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
12444 #ifdef CONFIG_IPW2100_MONITOR
12445 #endif
12446 #ifdef CONFIG_IPW2100_MONITOR
12447 #endif
12448 #ifdef CONFIG_IPW2100_MONITOR
12449 #else
12450 #endif
12451 #ifdef CONFIG_IPW2100_MONITOR
12452 #else
12453 #endif
12454 #ifdef CONFIG_IPW2100_DEBUG
12455 #endif
12456 #define IPW2100_FW_MAJOR_VERSION 1
12457 #define IPW2100_FW_MINOR_VERSION 3
12458 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
12459 #define IPW2100_FW_MAJOR(x) (x & 0xff)
12460 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
12461 IPW2100_FW_MAJOR_VERSION)
12462 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
12463 "." __stringify(IPW2100_FW_MINOR_VERSION)
12464 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
12465 #ifdef CONFIG_IPW2100_MONITOR
12466 #endif
12467 #ifdef CONFIG_IPW2100_MONITOR
12468 #endif
12469 /* LDV_COMMENT_END_PREP */
12470 ldv_s_ipw2100_pci_driver_pci_driver++;
12471
12472 }
12473
12474 }
12475
12476 break;
12477 case 7: {
12478
12479 /** STRUCT: struct type: pci_driver, struct name: ipw2100_pci_driver **/
12480 if(ldv_s_ipw2100_pci_driver_pci_driver==1) {
12481
12482 /* content: static void ipw2100_pci_remove_one(struct pci_dev *pci_dev)*/
12483 /* LDV_COMMENT_BEGIN_PREP */
12484 #define IPW2100_VERSION "git-1.2.2"
12485 #define DRV_NAME "ipw2100"
12486 #define DRV_VERSION IPW2100_VERSION
12487 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
12488 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
12489 #ifdef CONFIG_IPW2100_DEBUG
12490 #define IPW2100_RX_DEBUG
12491 #endif
12492 #ifdef CONFIG_PM
12493 #endif
12494 #ifdef CONFIG_IPW2100_DEBUG
12495 #define IPW_DEBUG(level, message...) \
12496 do { \
12497 if (ipw2100_debug_level & (level)) { \
12498 printk(KERN_DEBUG "ipw2100: %c %s ", \
12499 in_interrupt() ? 'I' : 'U', __func__); \
12500 printk(message); \
12501 } \
12502 } while (0)
12503 #else
12504 #define IPW_DEBUG(level, message...) do {} while (0)
12505 #endif
12506 #ifdef CONFIG_IPW2100_DEBUG
12507 #endif
12508 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
12509 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
12510 #define MAX_RESET_BACKOFF 10
12511 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
12512 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
12513 #ifndef CONFIG_PM
12514 #endif
12515 #ifdef CONFIG_PM
12516 #else
12517 #endif
12518 #ifndef CONFIG_PM
12519 #endif
12520 #define MAX_RF_KILL_CHECKS 5
12521 #define RF_KILL_CHECK_DELAY 40
12522 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
12523 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
12524 #define MAC_ASSOCIATION_READ_DELAY (HZ)
12525 #ifdef CONFIG_IPW2100_DEBUG
12526 #define IPW2100_HANDLER(v, f) { v, f, # v }
12527 #else
12528 #define IPW2100_HANDLER(v, f) { v, f }
12529 #endif
12530 #ifdef CONFIG_IPW2100_DEBUG
12531 #endif
12532 #ifdef CONFIG_IPW2100_DEBUG
12533 #endif
12534 #define SEARCH_ERROR 0xffffffff
12535 #define SEARCH_FAIL 0xfffffffe
12536 #define SEARCH_SUCCESS 0xfffffff0
12537 #define SEARCH_DISCARD 0
12538 #define SEARCH_SNAPSHOT 1
12539 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
12540 #ifdef IPW2100_DEBUG_C3
12541 #endif
12542 #ifdef IPW2100_RX_DEBUG
12543 #endif
12544 #ifdef IPW2100_DEBUG_C3
12545 #endif
12546 #ifdef IPW2100_DEBUG_C3
12547 #endif
12548 #ifdef IPW2100_RX_DEBUG
12549 #endif
12550 #ifdef IPW2100_RX_DEBUG
12551 #endif
12552 #ifdef CONFIG_IPW2100_MONITOR
12553 #endif
12554 #ifdef CONFIG_IPW2100_MONITOR
12555 #else
12556 #endif
12557 #ifdef CONFIG_IPW2100_MONITOR
12558 #endif
12559 #ifdef CONFIG_IPW2100_DEBUG
12560 #endif
12561 #ifdef CONFIG_IPW2100_DEBUG
12562 #endif
12563 #ifdef CONFIG_IPW2100_DEBUG
12564 #endif
12565 #define IPW2100_REG(x) { IPW_ ##x, #x }
12566 #define IPW2100_NIC(x, s) { x, #x, s }
12567 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
12568 #ifdef CONFIG_IPW2100_DEBUG
12569 #endif
12570 #ifdef CONFIG_IPW2100_MONITOR
12571 #endif
12572 #ifdef CONFIG_PM
12573 #endif
12574 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
12575 #ifdef CONFIG_IPW2100_DEBUG
12576 #endif
12577 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
12578 #endif
12579 #ifdef IPW2100_TX_POWER
12580 #endif
12581 #if 0
12582 #endif
12583 #ifdef CONFIG_IPW2100_DEBUG
12584 #endif
12585 #define IPW_PRIVACY_CAPABLE 0x0008
12586 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
12587 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
12588 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
12589 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
12590 #ifdef CONFIG_IPW2100_MONITOR
12591 #endif
12592 #ifdef CONFIG_IPW2100_MONITOR
12593 #endif
12594 #ifdef CONFIG_IPW2100_MONITOR
12595 #endif
12596 #ifdef CONFIG_IPW2100_MONITOR
12597 #endif
12598 /* LDV_COMMENT_END_PREP */
12599 /* LDV_COMMENT_FUNCTION_CALL Function from field "remove" from driver structure with callbacks "ipw2100_pci_driver" */
12600 ldv_handler_precall();
12601 ipw2100_pci_remove_one( var_group3);
12602 /* LDV_COMMENT_BEGIN_PREP */
12603 #ifdef CONFIG_PM
12604 #endif
12605 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
12606 #ifdef CONFIG_PM
12607 #endif
12608 #ifdef CONFIG_IPW2100_DEBUG
12609 #endif
12610 #ifdef CONFIG_IPW2100_DEBUG
12611 #endif
12612 #ifdef CONFIG_IPW2100_MONITOR
12613 #endif
12614 #define POWER_MODES 5
12615 #ifdef CONFIG_IPW2100_MONITOR
12616 #endif
12617 #define MAX_POWER_STRING 80
12618 #ifdef CONFIG_IPW2100_MONITOR
12619 #endif
12620 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
12621 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
12622 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
12623 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
12624 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
12625 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
12626 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
12627 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
12628 #ifdef CONFIG_IPW2100_MONITOR
12629 #endif
12630 #ifdef CONFIG_IPW2100_MONITOR
12631 #endif
12632 #ifdef CONFIG_IPW2100_MONITOR
12633 #else
12634 #endif
12635 #ifdef CONFIG_IPW2100_MONITOR
12636 #else
12637 #endif
12638 #ifdef CONFIG_IPW2100_DEBUG
12639 #endif
12640 #define IPW2100_FW_MAJOR_VERSION 1
12641 #define IPW2100_FW_MINOR_VERSION 3
12642 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
12643 #define IPW2100_FW_MAJOR(x) (x & 0xff)
12644 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
12645 IPW2100_FW_MAJOR_VERSION)
12646 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
12647 "." __stringify(IPW2100_FW_MINOR_VERSION)
12648 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
12649 #ifdef CONFIG_IPW2100_MONITOR
12650 #endif
12651 #ifdef CONFIG_IPW2100_MONITOR
12652 #endif
12653 /* LDV_COMMENT_END_PREP */
12654 ldv_s_ipw2100_pci_driver_pci_driver=0;
12655
12656 }
12657
12658 }
12659
12660 break;
12661 case 8: {
12662
12663 /** STRUCT: struct type: pci_driver, struct name: ipw2100_pci_driver **/
12664
12665
12666 /* content: static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state)*/
12667 /* LDV_COMMENT_BEGIN_PREP */
12668 #define IPW2100_VERSION "git-1.2.2"
12669 #define DRV_NAME "ipw2100"
12670 #define DRV_VERSION IPW2100_VERSION
12671 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
12672 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
12673 #ifdef CONFIG_IPW2100_DEBUG
12674 #define IPW2100_RX_DEBUG
12675 #endif
12676 #ifdef CONFIG_PM
12677 #endif
12678 #ifdef CONFIG_IPW2100_DEBUG
12679 #define IPW_DEBUG(level, message...) \
12680 do { \
12681 if (ipw2100_debug_level & (level)) { \
12682 printk(KERN_DEBUG "ipw2100: %c %s ", \
12683 in_interrupt() ? 'I' : 'U', __func__); \
12684 printk(message); \
12685 } \
12686 } while (0)
12687 #else
12688 #define IPW_DEBUG(level, message...) do {} while (0)
12689 #endif
12690 #ifdef CONFIG_IPW2100_DEBUG
12691 #endif
12692 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
12693 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
12694 #define MAX_RESET_BACKOFF 10
12695 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
12696 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
12697 #ifndef CONFIG_PM
12698 #endif
12699 #ifdef CONFIG_PM
12700 #else
12701 #endif
12702 #ifndef CONFIG_PM
12703 #endif
12704 #define MAX_RF_KILL_CHECKS 5
12705 #define RF_KILL_CHECK_DELAY 40
12706 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
12707 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
12708 #define MAC_ASSOCIATION_READ_DELAY (HZ)
12709 #ifdef CONFIG_IPW2100_DEBUG
12710 #define IPW2100_HANDLER(v, f) { v, f, # v }
12711 #else
12712 #define IPW2100_HANDLER(v, f) { v, f }
12713 #endif
12714 #ifdef CONFIG_IPW2100_DEBUG
12715 #endif
12716 #ifdef CONFIG_IPW2100_DEBUG
12717 #endif
12718 #define SEARCH_ERROR 0xffffffff
12719 #define SEARCH_FAIL 0xfffffffe
12720 #define SEARCH_SUCCESS 0xfffffff0
12721 #define SEARCH_DISCARD 0
12722 #define SEARCH_SNAPSHOT 1
12723 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
12724 #ifdef IPW2100_DEBUG_C3
12725 #endif
12726 #ifdef IPW2100_RX_DEBUG
12727 #endif
12728 #ifdef IPW2100_DEBUG_C3
12729 #endif
12730 #ifdef IPW2100_DEBUG_C3
12731 #endif
12732 #ifdef IPW2100_RX_DEBUG
12733 #endif
12734 #ifdef IPW2100_RX_DEBUG
12735 #endif
12736 #ifdef CONFIG_IPW2100_MONITOR
12737 #endif
12738 #ifdef CONFIG_IPW2100_MONITOR
12739 #else
12740 #endif
12741 #ifdef CONFIG_IPW2100_MONITOR
12742 #endif
12743 #ifdef CONFIG_IPW2100_DEBUG
12744 #endif
12745 #ifdef CONFIG_IPW2100_DEBUG
12746 #endif
12747 #ifdef CONFIG_IPW2100_DEBUG
12748 #endif
12749 #define IPW2100_REG(x) { IPW_ ##x, #x }
12750 #define IPW2100_NIC(x, s) { x, #x, s }
12751 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
12752 #ifdef CONFIG_IPW2100_DEBUG
12753 #endif
12754 #ifdef CONFIG_IPW2100_MONITOR
12755 #endif
12756 #ifdef CONFIG_PM
12757 #endif
12758 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
12759 #ifdef CONFIG_IPW2100_DEBUG
12760 #endif
12761 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
12762 #endif
12763 #ifdef IPW2100_TX_POWER
12764 #endif
12765 #if 0
12766 #endif
12767 #ifdef CONFIG_IPW2100_DEBUG
12768 #endif
12769 #define IPW_PRIVACY_CAPABLE 0x0008
12770 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
12771 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
12772 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
12773 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
12774 #ifdef CONFIG_IPW2100_MONITOR
12775 #endif
12776 #ifdef CONFIG_IPW2100_MONITOR
12777 #endif
12778 #ifdef CONFIG_IPW2100_MONITOR
12779 #endif
12780 #ifdef CONFIG_IPW2100_MONITOR
12781 #endif
12782 #ifdef CONFIG_PM
12783 #endif
12784 #ifdef CONFIG_PM
12785 /* LDV_COMMENT_END_PREP */
12786 /* LDV_COMMENT_FUNCTION_CALL Function from field "suspend" from driver structure with callbacks "ipw2100_pci_driver" */
12787 ldv_handler_precall();
12788 ipw2100_suspend( var_group3, var_ipw2100_suspend_149_p1);
12789 /* LDV_COMMENT_BEGIN_PREP */
12790 #endif
12791 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
12792 #ifdef CONFIG_PM
12793 #endif
12794 #ifdef CONFIG_IPW2100_DEBUG
12795 #endif
12796 #ifdef CONFIG_IPW2100_DEBUG
12797 #endif
12798 #ifdef CONFIG_IPW2100_MONITOR
12799 #endif
12800 #define POWER_MODES 5
12801 #ifdef CONFIG_IPW2100_MONITOR
12802 #endif
12803 #define MAX_POWER_STRING 80
12804 #ifdef CONFIG_IPW2100_MONITOR
12805 #endif
12806 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
12807 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
12808 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
12809 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
12810 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
12811 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
12812 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
12813 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
12814 #ifdef CONFIG_IPW2100_MONITOR
12815 #endif
12816 #ifdef CONFIG_IPW2100_MONITOR
12817 #endif
12818 #ifdef CONFIG_IPW2100_MONITOR
12819 #else
12820 #endif
12821 #ifdef CONFIG_IPW2100_MONITOR
12822 #else
12823 #endif
12824 #ifdef CONFIG_IPW2100_DEBUG
12825 #endif
12826 #define IPW2100_FW_MAJOR_VERSION 1
12827 #define IPW2100_FW_MINOR_VERSION 3
12828 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
12829 #define IPW2100_FW_MAJOR(x) (x & 0xff)
12830 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
12831 IPW2100_FW_MAJOR_VERSION)
12832 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
12833 "." __stringify(IPW2100_FW_MINOR_VERSION)
12834 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
12835 #ifdef CONFIG_IPW2100_MONITOR
12836 #endif
12837 #ifdef CONFIG_IPW2100_MONITOR
12838 #endif
12839 /* LDV_COMMENT_END_PREP */
12840
12841
12842
12843
12844 }
12845
12846 break;
12847 case 9: {
12848
12849 /** STRUCT: struct type: pci_driver, struct name: ipw2100_pci_driver **/
12850
12851
12852 /* content: static int ipw2100_resume(struct pci_dev *pci_dev)*/
12853 /* LDV_COMMENT_BEGIN_PREP */
12854 #define IPW2100_VERSION "git-1.2.2"
12855 #define DRV_NAME "ipw2100"
12856 #define DRV_VERSION IPW2100_VERSION
12857 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
12858 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
12859 #ifdef CONFIG_IPW2100_DEBUG
12860 #define IPW2100_RX_DEBUG
12861 #endif
12862 #ifdef CONFIG_PM
12863 #endif
12864 #ifdef CONFIG_IPW2100_DEBUG
12865 #define IPW_DEBUG(level, message...) \
12866 do { \
12867 if (ipw2100_debug_level & (level)) { \
12868 printk(KERN_DEBUG "ipw2100: %c %s ", \
12869 in_interrupt() ? 'I' : 'U', __func__); \
12870 printk(message); \
12871 } \
12872 } while (0)
12873 #else
12874 #define IPW_DEBUG(level, message...) do {} while (0)
12875 #endif
12876 #ifdef CONFIG_IPW2100_DEBUG
12877 #endif
12878 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
12879 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
12880 #define MAX_RESET_BACKOFF 10
12881 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
12882 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
12883 #ifndef CONFIG_PM
12884 #endif
12885 #ifdef CONFIG_PM
12886 #else
12887 #endif
12888 #ifndef CONFIG_PM
12889 #endif
12890 #define MAX_RF_KILL_CHECKS 5
12891 #define RF_KILL_CHECK_DELAY 40
12892 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
12893 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
12894 #define MAC_ASSOCIATION_READ_DELAY (HZ)
12895 #ifdef CONFIG_IPW2100_DEBUG
12896 #define IPW2100_HANDLER(v, f) { v, f, # v }
12897 #else
12898 #define IPW2100_HANDLER(v, f) { v, f }
12899 #endif
12900 #ifdef CONFIG_IPW2100_DEBUG
12901 #endif
12902 #ifdef CONFIG_IPW2100_DEBUG
12903 #endif
12904 #define SEARCH_ERROR 0xffffffff
12905 #define SEARCH_FAIL 0xfffffffe
12906 #define SEARCH_SUCCESS 0xfffffff0
12907 #define SEARCH_DISCARD 0
12908 #define SEARCH_SNAPSHOT 1
12909 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
12910 #ifdef IPW2100_DEBUG_C3
12911 #endif
12912 #ifdef IPW2100_RX_DEBUG
12913 #endif
12914 #ifdef IPW2100_DEBUG_C3
12915 #endif
12916 #ifdef IPW2100_DEBUG_C3
12917 #endif
12918 #ifdef IPW2100_RX_DEBUG
12919 #endif
12920 #ifdef IPW2100_RX_DEBUG
12921 #endif
12922 #ifdef CONFIG_IPW2100_MONITOR
12923 #endif
12924 #ifdef CONFIG_IPW2100_MONITOR
12925 #else
12926 #endif
12927 #ifdef CONFIG_IPW2100_MONITOR
12928 #endif
12929 #ifdef CONFIG_IPW2100_DEBUG
12930 #endif
12931 #ifdef CONFIG_IPW2100_DEBUG
12932 #endif
12933 #ifdef CONFIG_IPW2100_DEBUG
12934 #endif
12935 #define IPW2100_REG(x) { IPW_ ##x, #x }
12936 #define IPW2100_NIC(x, s) { x, #x, s }
12937 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
12938 #ifdef CONFIG_IPW2100_DEBUG
12939 #endif
12940 #ifdef CONFIG_IPW2100_MONITOR
12941 #endif
12942 #ifdef CONFIG_PM
12943 #endif
12944 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
12945 #ifdef CONFIG_IPW2100_DEBUG
12946 #endif
12947 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
12948 #endif
12949 #ifdef IPW2100_TX_POWER
12950 #endif
12951 #if 0
12952 #endif
12953 #ifdef CONFIG_IPW2100_DEBUG
12954 #endif
12955 #define IPW_PRIVACY_CAPABLE 0x0008
12956 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
12957 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
12958 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
12959 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
12960 #ifdef CONFIG_IPW2100_MONITOR
12961 #endif
12962 #ifdef CONFIG_IPW2100_MONITOR
12963 #endif
12964 #ifdef CONFIG_IPW2100_MONITOR
12965 #endif
12966 #ifdef CONFIG_IPW2100_MONITOR
12967 #endif
12968 #ifdef CONFIG_PM
12969 #endif
12970 #ifdef CONFIG_PM
12971 /* LDV_COMMENT_END_PREP */
12972 /* LDV_COMMENT_FUNCTION_CALL Function from field "resume" from driver structure with callbacks "ipw2100_pci_driver" */
12973 ldv_handler_precall();
12974 ipw2100_resume( var_group3);
12975 /* LDV_COMMENT_BEGIN_PREP */
12976 #endif
12977 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
12978 #ifdef CONFIG_PM
12979 #endif
12980 #ifdef CONFIG_IPW2100_DEBUG
12981 #endif
12982 #ifdef CONFIG_IPW2100_DEBUG
12983 #endif
12984 #ifdef CONFIG_IPW2100_MONITOR
12985 #endif
12986 #define POWER_MODES 5
12987 #ifdef CONFIG_IPW2100_MONITOR
12988 #endif
12989 #define MAX_POWER_STRING 80
12990 #ifdef CONFIG_IPW2100_MONITOR
12991 #endif
12992 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
12993 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
12994 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
12995 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
12996 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
12997 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
12998 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
12999 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
13000 #ifdef CONFIG_IPW2100_MONITOR
13001 #endif
13002 #ifdef CONFIG_IPW2100_MONITOR
13003 #endif
13004 #ifdef CONFIG_IPW2100_MONITOR
13005 #else
13006 #endif
13007 #ifdef CONFIG_IPW2100_MONITOR
13008 #else
13009 #endif
13010 #ifdef CONFIG_IPW2100_DEBUG
13011 #endif
13012 #define IPW2100_FW_MAJOR_VERSION 1
13013 #define IPW2100_FW_MINOR_VERSION 3
13014 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
13015 #define IPW2100_FW_MAJOR(x) (x & 0xff)
13016 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
13017 IPW2100_FW_MAJOR_VERSION)
13018 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
13019 "." __stringify(IPW2100_FW_MINOR_VERSION)
13020 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
13021 #ifdef CONFIG_IPW2100_MONITOR
13022 #endif
13023 #ifdef CONFIG_IPW2100_MONITOR
13024 #endif
13025 /* LDV_COMMENT_END_PREP */
13026
13027
13028
13029
13030 }
13031
13032 break;
13033 case 10: {
13034
13035 /** STRUCT: struct type: pci_driver, struct name: ipw2100_pci_driver **/
13036
13037
13038 /* content: static void ipw2100_shutdown(struct pci_dev *pci_dev)*/
13039 /* LDV_COMMENT_BEGIN_PREP */
13040 #define IPW2100_VERSION "git-1.2.2"
13041 #define DRV_NAME "ipw2100"
13042 #define DRV_VERSION IPW2100_VERSION
13043 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
13044 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
13045 #ifdef CONFIG_IPW2100_DEBUG
13046 #define IPW2100_RX_DEBUG
13047 #endif
13048 #ifdef CONFIG_PM
13049 #endif
13050 #ifdef CONFIG_IPW2100_DEBUG
13051 #define IPW_DEBUG(level, message...) \
13052 do { \
13053 if (ipw2100_debug_level & (level)) { \
13054 printk(KERN_DEBUG "ipw2100: %c %s ", \
13055 in_interrupt() ? 'I' : 'U', __func__); \
13056 printk(message); \
13057 } \
13058 } while (0)
13059 #else
13060 #define IPW_DEBUG(level, message...) do {} while (0)
13061 #endif
13062 #ifdef CONFIG_IPW2100_DEBUG
13063 #endif
13064 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
13065 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
13066 #define MAX_RESET_BACKOFF 10
13067 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
13068 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
13069 #ifndef CONFIG_PM
13070 #endif
13071 #ifdef CONFIG_PM
13072 #else
13073 #endif
13074 #ifndef CONFIG_PM
13075 #endif
13076 #define MAX_RF_KILL_CHECKS 5
13077 #define RF_KILL_CHECK_DELAY 40
13078 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
13079 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
13080 #define MAC_ASSOCIATION_READ_DELAY (HZ)
13081 #ifdef CONFIG_IPW2100_DEBUG
13082 #define IPW2100_HANDLER(v, f) { v, f, # v }
13083 #else
13084 #define IPW2100_HANDLER(v, f) { v, f }
13085 #endif
13086 #ifdef CONFIG_IPW2100_DEBUG
13087 #endif
13088 #ifdef CONFIG_IPW2100_DEBUG
13089 #endif
13090 #define SEARCH_ERROR 0xffffffff
13091 #define SEARCH_FAIL 0xfffffffe
13092 #define SEARCH_SUCCESS 0xfffffff0
13093 #define SEARCH_DISCARD 0
13094 #define SEARCH_SNAPSHOT 1
13095 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
13096 #ifdef IPW2100_DEBUG_C3
13097 #endif
13098 #ifdef IPW2100_RX_DEBUG
13099 #endif
13100 #ifdef IPW2100_DEBUG_C3
13101 #endif
13102 #ifdef IPW2100_DEBUG_C3
13103 #endif
13104 #ifdef IPW2100_RX_DEBUG
13105 #endif
13106 #ifdef IPW2100_RX_DEBUG
13107 #endif
13108 #ifdef CONFIG_IPW2100_MONITOR
13109 #endif
13110 #ifdef CONFIG_IPW2100_MONITOR
13111 #else
13112 #endif
13113 #ifdef CONFIG_IPW2100_MONITOR
13114 #endif
13115 #ifdef CONFIG_IPW2100_DEBUG
13116 #endif
13117 #ifdef CONFIG_IPW2100_DEBUG
13118 #endif
13119 #ifdef CONFIG_IPW2100_DEBUG
13120 #endif
13121 #define IPW2100_REG(x) { IPW_ ##x, #x }
13122 #define IPW2100_NIC(x, s) { x, #x, s }
13123 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
13124 #ifdef CONFIG_IPW2100_DEBUG
13125 #endif
13126 #ifdef CONFIG_IPW2100_MONITOR
13127 #endif
13128 #ifdef CONFIG_PM
13129 #endif
13130 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
13131 #ifdef CONFIG_IPW2100_DEBUG
13132 #endif
13133 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
13134 #endif
13135 #ifdef IPW2100_TX_POWER
13136 #endif
13137 #if 0
13138 #endif
13139 #ifdef CONFIG_IPW2100_DEBUG
13140 #endif
13141 #define IPW_PRIVACY_CAPABLE 0x0008
13142 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
13143 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
13144 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
13145 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
13146 #ifdef CONFIG_IPW2100_MONITOR
13147 #endif
13148 #ifdef CONFIG_IPW2100_MONITOR
13149 #endif
13150 #ifdef CONFIG_IPW2100_MONITOR
13151 #endif
13152 #ifdef CONFIG_IPW2100_MONITOR
13153 #endif
13154 #ifdef CONFIG_PM
13155 #endif
13156 #ifdef CONFIG_PM
13157 #endif
13158 /* LDV_COMMENT_END_PREP */
13159 /* LDV_COMMENT_FUNCTION_CALL Function from field "shutdown" from driver structure with callbacks "ipw2100_pci_driver" */
13160 ldv_handler_precall();
13161 ipw2100_shutdown( var_group3);
13162 /* LDV_COMMENT_BEGIN_PREP */
13163 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
13164 #ifdef CONFIG_PM
13165 #endif
13166 #ifdef CONFIG_IPW2100_DEBUG
13167 #endif
13168 #ifdef CONFIG_IPW2100_DEBUG
13169 #endif
13170 #ifdef CONFIG_IPW2100_MONITOR
13171 #endif
13172 #define POWER_MODES 5
13173 #ifdef CONFIG_IPW2100_MONITOR
13174 #endif
13175 #define MAX_POWER_STRING 80
13176 #ifdef CONFIG_IPW2100_MONITOR
13177 #endif
13178 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
13179 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
13180 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
13181 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
13182 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
13183 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
13184 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
13185 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
13186 #ifdef CONFIG_IPW2100_MONITOR
13187 #endif
13188 #ifdef CONFIG_IPW2100_MONITOR
13189 #endif
13190 #ifdef CONFIG_IPW2100_MONITOR
13191 #else
13192 #endif
13193 #ifdef CONFIG_IPW2100_MONITOR
13194 #else
13195 #endif
13196 #ifdef CONFIG_IPW2100_DEBUG
13197 #endif
13198 #define IPW2100_FW_MAJOR_VERSION 1
13199 #define IPW2100_FW_MINOR_VERSION 3
13200 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
13201 #define IPW2100_FW_MAJOR(x) (x & 0xff)
13202 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
13203 IPW2100_FW_MAJOR_VERSION)
13204 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
13205 "." __stringify(IPW2100_FW_MINOR_VERSION)
13206 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
13207 #ifdef CONFIG_IPW2100_MONITOR
13208 #endif
13209 #ifdef CONFIG_IPW2100_MONITOR
13210 #endif
13211 /* LDV_COMMENT_END_PREP */
13212
13213
13214
13215
13216 }
13217
13218 break;
13219 case 11: {
13220
13221 /** STRUCT: struct type: iw_handler_def, struct name: ipw2100_wx_handler_def **/
13222
13223
13224 /* content: static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev)*/
13225 /* LDV_COMMENT_BEGIN_PREP */
13226 #define IPW2100_VERSION "git-1.2.2"
13227 #define DRV_NAME "ipw2100"
13228 #define DRV_VERSION IPW2100_VERSION
13229 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
13230 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
13231 #ifdef CONFIG_IPW2100_DEBUG
13232 #define IPW2100_RX_DEBUG
13233 #endif
13234 #ifdef CONFIG_PM
13235 #endif
13236 #ifdef CONFIG_IPW2100_DEBUG
13237 #define IPW_DEBUG(level, message...) \
13238 do { \
13239 if (ipw2100_debug_level & (level)) { \
13240 printk(KERN_DEBUG "ipw2100: %c %s ", \
13241 in_interrupt() ? 'I' : 'U', __func__); \
13242 printk(message); \
13243 } \
13244 } while (0)
13245 #else
13246 #define IPW_DEBUG(level, message...) do {} while (0)
13247 #endif
13248 #ifdef CONFIG_IPW2100_DEBUG
13249 #endif
13250 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
13251 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
13252 #define MAX_RESET_BACKOFF 10
13253 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
13254 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
13255 #ifndef CONFIG_PM
13256 #endif
13257 #ifdef CONFIG_PM
13258 #else
13259 #endif
13260 #ifndef CONFIG_PM
13261 #endif
13262 #define MAX_RF_KILL_CHECKS 5
13263 #define RF_KILL_CHECK_DELAY 40
13264 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
13265 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
13266 #define MAC_ASSOCIATION_READ_DELAY (HZ)
13267 #ifdef CONFIG_IPW2100_DEBUG
13268 #define IPW2100_HANDLER(v, f) { v, f, # v }
13269 #else
13270 #define IPW2100_HANDLER(v, f) { v, f }
13271 #endif
13272 #ifdef CONFIG_IPW2100_DEBUG
13273 #endif
13274 #ifdef CONFIG_IPW2100_DEBUG
13275 #endif
13276 #define SEARCH_ERROR 0xffffffff
13277 #define SEARCH_FAIL 0xfffffffe
13278 #define SEARCH_SUCCESS 0xfffffff0
13279 #define SEARCH_DISCARD 0
13280 #define SEARCH_SNAPSHOT 1
13281 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
13282 #ifdef IPW2100_DEBUG_C3
13283 #endif
13284 #ifdef IPW2100_RX_DEBUG
13285 #endif
13286 #ifdef IPW2100_DEBUG_C3
13287 #endif
13288 #ifdef IPW2100_DEBUG_C3
13289 #endif
13290 #ifdef IPW2100_RX_DEBUG
13291 #endif
13292 #ifdef IPW2100_RX_DEBUG
13293 #endif
13294 #ifdef CONFIG_IPW2100_MONITOR
13295 #endif
13296 #ifdef CONFIG_IPW2100_MONITOR
13297 #else
13298 #endif
13299 #ifdef CONFIG_IPW2100_MONITOR
13300 #endif
13301 #ifdef CONFIG_IPW2100_DEBUG
13302 #endif
13303 #ifdef CONFIG_IPW2100_DEBUG
13304 #endif
13305 #ifdef CONFIG_IPW2100_DEBUG
13306 #endif
13307 #define IPW2100_REG(x) { IPW_ ##x, #x }
13308 #define IPW2100_NIC(x, s) { x, #x, s }
13309 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
13310 #ifdef CONFIG_IPW2100_DEBUG
13311 #endif
13312 #ifdef CONFIG_IPW2100_MONITOR
13313 #endif
13314 #ifdef CONFIG_PM
13315 #endif
13316 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
13317 #ifdef CONFIG_IPW2100_DEBUG
13318 #endif
13319 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
13320 #endif
13321 #ifdef IPW2100_TX_POWER
13322 #endif
13323 #if 0
13324 #endif
13325 #ifdef CONFIG_IPW2100_DEBUG
13326 #endif
13327 #define IPW_PRIVACY_CAPABLE 0x0008
13328 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
13329 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
13330 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
13331 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
13332 #ifdef CONFIG_IPW2100_MONITOR
13333 #endif
13334 #ifdef CONFIG_IPW2100_MONITOR
13335 #endif
13336 #ifdef CONFIG_IPW2100_MONITOR
13337 #endif
13338 #ifdef CONFIG_IPW2100_MONITOR
13339 #endif
13340 #ifdef CONFIG_PM
13341 #endif
13342 #ifdef CONFIG_PM
13343 #endif
13344 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
13345 #ifdef CONFIG_PM
13346 #endif
13347 #ifdef CONFIG_IPW2100_DEBUG
13348 #endif
13349 #ifdef CONFIG_IPW2100_DEBUG
13350 #endif
13351 #ifdef CONFIG_IPW2100_MONITOR
13352 #endif
13353 #define POWER_MODES 5
13354 #ifdef CONFIG_IPW2100_MONITOR
13355 #endif
13356 #define MAX_POWER_STRING 80
13357 #ifdef CONFIG_IPW2100_MONITOR
13358 #endif
13359 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
13360 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
13361 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
13362 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
13363 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
13364 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
13365 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
13366 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
13367 #ifdef CONFIG_IPW2100_MONITOR
13368 #endif
13369 #ifdef CONFIG_IPW2100_MONITOR
13370 #endif
13371 #ifdef CONFIG_IPW2100_MONITOR
13372 #else
13373 #endif
13374 #ifdef CONFIG_IPW2100_MONITOR
13375 #else
13376 #endif
13377 /* LDV_COMMENT_END_PREP */
13378 /* LDV_COMMENT_FUNCTION_CALL Function from field "get_wireless_stats" from driver structure with callbacks "ipw2100_wx_handler_def" */
13379 ldv_handler_precall();
13380 ipw2100_wx_wireless_stats( var_group1);
13381 /* LDV_COMMENT_BEGIN_PREP */
13382 #define IPW2100_FW_MAJOR_VERSION 1
13383 #define IPW2100_FW_MINOR_VERSION 3
13384 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
13385 #define IPW2100_FW_MAJOR(x) (x & 0xff)
13386 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
13387 IPW2100_FW_MAJOR_VERSION)
13388 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
13389 "." __stringify(IPW2100_FW_MINOR_VERSION)
13390 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
13391 #ifdef CONFIG_IPW2100_MONITOR
13392 #endif
13393 #ifdef CONFIG_IPW2100_MONITOR
13394 #endif
13395 /* LDV_COMMENT_END_PREP */
13396
13397
13398
13399
13400 }
13401
13402 break;
13403 case 12: {
13404
13405 /** CALLBACK SECTION request_irq **/
13406 LDV_IN_INTERRUPT=2;
13407
13408 /* content: static irqreturn_t ipw2100_interrupt(int irq, void *data)*/
13409 /* LDV_COMMENT_BEGIN_PREP */
13410 #define IPW2100_VERSION "git-1.2.2"
13411 #define DRV_NAME "ipw2100"
13412 #define DRV_VERSION IPW2100_VERSION
13413 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
13414 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
13415 #ifdef CONFIG_IPW2100_DEBUG
13416 #define IPW2100_RX_DEBUG
13417 #endif
13418 #ifdef CONFIG_PM
13419 #endif
13420 #ifdef CONFIG_IPW2100_DEBUG
13421 #define IPW_DEBUG(level, message...) \
13422 do { \
13423 if (ipw2100_debug_level & (level)) { \
13424 printk(KERN_DEBUG "ipw2100: %c %s ", \
13425 in_interrupt() ? 'I' : 'U', __func__); \
13426 printk(message); \
13427 } \
13428 } while (0)
13429 #else
13430 #define IPW_DEBUG(level, message...) do {} while (0)
13431 #endif
13432 #ifdef CONFIG_IPW2100_DEBUG
13433 #endif
13434 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
13435 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
13436 #define MAX_RESET_BACKOFF 10
13437 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
13438 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
13439 #ifndef CONFIG_PM
13440 #endif
13441 #ifdef CONFIG_PM
13442 #else
13443 #endif
13444 #ifndef CONFIG_PM
13445 #endif
13446 #define MAX_RF_KILL_CHECKS 5
13447 #define RF_KILL_CHECK_DELAY 40
13448 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
13449 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
13450 #define MAC_ASSOCIATION_READ_DELAY (HZ)
13451 #ifdef CONFIG_IPW2100_DEBUG
13452 #define IPW2100_HANDLER(v, f) { v, f, # v }
13453 #else
13454 #define IPW2100_HANDLER(v, f) { v, f }
13455 #endif
13456 #ifdef CONFIG_IPW2100_DEBUG
13457 #endif
13458 #ifdef CONFIG_IPW2100_DEBUG
13459 #endif
13460 #define SEARCH_ERROR 0xffffffff
13461 #define SEARCH_FAIL 0xfffffffe
13462 #define SEARCH_SUCCESS 0xfffffff0
13463 #define SEARCH_DISCARD 0
13464 #define SEARCH_SNAPSHOT 1
13465 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
13466 #ifdef IPW2100_DEBUG_C3
13467 #endif
13468 #ifdef IPW2100_RX_DEBUG
13469 #endif
13470 #ifdef IPW2100_DEBUG_C3
13471 #endif
13472 #ifdef IPW2100_DEBUG_C3
13473 #endif
13474 #ifdef IPW2100_RX_DEBUG
13475 #endif
13476 #ifdef IPW2100_RX_DEBUG
13477 #endif
13478 #ifdef CONFIG_IPW2100_MONITOR
13479 #endif
13480 #ifdef CONFIG_IPW2100_MONITOR
13481 #else
13482 #endif
13483 #ifdef CONFIG_IPW2100_MONITOR
13484 #endif
13485 #ifdef CONFIG_IPW2100_DEBUG
13486 #endif
13487 #ifdef CONFIG_IPW2100_DEBUG
13488 #endif
13489 #ifdef CONFIG_IPW2100_DEBUG
13490 #endif
13491 /* LDV_COMMENT_END_PREP */
13492 /* LDV_COMMENT_FUNCTION_CALL */
13493 ldv_handler_precall();
13494 ipw2100_interrupt( var_ipw2100_interrupt_69_p0, var_ipw2100_interrupt_69_p1);
13495 /* LDV_COMMENT_BEGIN_PREP */
13496 #define IPW2100_REG(x) { IPW_ ##x, #x }
13497 #define IPW2100_NIC(x, s) { x, #x, s }
13498 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
13499 #ifdef CONFIG_IPW2100_DEBUG
13500 #endif
13501 #ifdef CONFIG_IPW2100_MONITOR
13502 #endif
13503 #ifdef CONFIG_PM
13504 #endif
13505 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
13506 #ifdef CONFIG_IPW2100_DEBUG
13507 #endif
13508 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
13509 #endif
13510 #ifdef IPW2100_TX_POWER
13511 #endif
13512 #if 0
13513 #endif
13514 #ifdef CONFIG_IPW2100_DEBUG
13515 #endif
13516 #define IPW_PRIVACY_CAPABLE 0x0008
13517 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
13518 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
13519 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
13520 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
13521 #ifdef CONFIG_IPW2100_MONITOR
13522 #endif
13523 #ifdef CONFIG_IPW2100_MONITOR
13524 #endif
13525 #ifdef CONFIG_IPW2100_MONITOR
13526 #endif
13527 #ifdef CONFIG_IPW2100_MONITOR
13528 #endif
13529 #ifdef CONFIG_PM
13530 #endif
13531 #ifdef CONFIG_PM
13532 #endif
13533 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
13534 #ifdef CONFIG_PM
13535 #endif
13536 #ifdef CONFIG_IPW2100_DEBUG
13537 #endif
13538 #ifdef CONFIG_IPW2100_DEBUG
13539 #endif
13540 #ifdef CONFIG_IPW2100_MONITOR
13541 #endif
13542 #define POWER_MODES 5
13543 #ifdef CONFIG_IPW2100_MONITOR
13544 #endif
13545 #define MAX_POWER_STRING 80
13546 #ifdef CONFIG_IPW2100_MONITOR
13547 #endif
13548 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
13549 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
13550 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
13551 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
13552 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
13553 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
13554 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
13555 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
13556 #ifdef CONFIG_IPW2100_MONITOR
13557 #endif
13558 #ifdef CONFIG_IPW2100_MONITOR
13559 #endif
13560 #ifdef CONFIG_IPW2100_MONITOR
13561 #else
13562 #endif
13563 #ifdef CONFIG_IPW2100_MONITOR
13564 #else
13565 #endif
13566 #ifdef CONFIG_IPW2100_DEBUG
13567 #endif
13568 #define IPW2100_FW_MAJOR_VERSION 1
13569 #define IPW2100_FW_MINOR_VERSION 3
13570 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
13571 #define IPW2100_FW_MAJOR(x) (x & 0xff)
13572 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
13573 IPW2100_FW_MAJOR_VERSION)
13574 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
13575 "." __stringify(IPW2100_FW_MINOR_VERSION)
13576 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
13577 #ifdef CONFIG_IPW2100_MONITOR
13578 #endif
13579 #ifdef CONFIG_IPW2100_MONITOR
13580 #endif
13581 /* LDV_COMMENT_END_PREP */
13582 LDV_IN_INTERRUPT=1;
13583
13584
13585
13586 }
13587
13588 break;
13589 default: break;
13590
13591 }
13592
13593 }
13594
13595 ldv_module_exit:
13596
13597 /** INIT: init_type: ST_MODULE_EXIT **/
13598 /* content: static void __exit ipw2100_exit(void)*/
13599 /* LDV_COMMENT_BEGIN_PREP */
13600 #define IPW2100_VERSION "git-1.2.2"
13601 #define DRV_NAME "ipw2100"
13602 #define DRV_VERSION IPW2100_VERSION
13603 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
13604 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
13605 #ifdef CONFIG_IPW2100_DEBUG
13606 #define IPW2100_RX_DEBUG
13607 #endif
13608 #ifdef CONFIG_PM
13609 #endif
13610 #ifdef CONFIG_IPW2100_DEBUG
13611 #define IPW_DEBUG(level, message...) \
13612 do { \
13613 if (ipw2100_debug_level & (level)) { \
13614 printk(KERN_DEBUG "ipw2100: %c %s ", \
13615 in_interrupt() ? 'I' : 'U', __func__); \
13616 printk(message); \
13617 } \
13618 } while (0)
13619 #else
13620 #define IPW_DEBUG(level, message...) do {} while (0)
13621 #endif
13622 #ifdef CONFIG_IPW2100_DEBUG
13623 #endif
13624 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
13625 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
13626 #define MAX_RESET_BACKOFF 10
13627 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
13628 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
13629 #ifndef CONFIG_PM
13630 #endif
13631 #ifdef CONFIG_PM
13632 #else
13633 #endif
13634 #ifndef CONFIG_PM
13635 #endif
13636 #define MAX_RF_KILL_CHECKS 5
13637 #define RF_KILL_CHECK_DELAY 40
13638 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
13639 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
13640 #define MAC_ASSOCIATION_READ_DELAY (HZ)
13641 #ifdef CONFIG_IPW2100_DEBUG
13642 #define IPW2100_HANDLER(v, f) { v, f, # v }
13643 #else
13644 #define IPW2100_HANDLER(v, f) { v, f }
13645 #endif
13646 #ifdef CONFIG_IPW2100_DEBUG
13647 #endif
13648 #ifdef CONFIG_IPW2100_DEBUG
13649 #endif
13650 #define SEARCH_ERROR 0xffffffff
13651 #define SEARCH_FAIL 0xfffffffe
13652 #define SEARCH_SUCCESS 0xfffffff0
13653 #define SEARCH_DISCARD 0
13654 #define SEARCH_SNAPSHOT 1
13655 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
13656 #ifdef IPW2100_DEBUG_C3
13657 #endif
13658 #ifdef IPW2100_RX_DEBUG
13659 #endif
13660 #ifdef IPW2100_DEBUG_C3
13661 #endif
13662 #ifdef IPW2100_DEBUG_C3
13663 #endif
13664 #ifdef IPW2100_RX_DEBUG
13665 #endif
13666 #ifdef IPW2100_RX_DEBUG
13667 #endif
13668 #ifdef CONFIG_IPW2100_MONITOR
13669 #endif
13670 #ifdef CONFIG_IPW2100_MONITOR
13671 #else
13672 #endif
13673 #ifdef CONFIG_IPW2100_MONITOR
13674 #endif
13675 #ifdef CONFIG_IPW2100_DEBUG
13676 #endif
13677 #ifdef CONFIG_IPW2100_DEBUG
13678 #endif
13679 #ifdef CONFIG_IPW2100_DEBUG
13680 #endif
13681 #define IPW2100_REG(x) { IPW_ ##x, #x }
13682 #define IPW2100_NIC(x, s) { x, #x, s }
13683 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
13684 #ifdef CONFIG_IPW2100_DEBUG
13685 #endif
13686 #ifdef CONFIG_IPW2100_MONITOR
13687 #endif
13688 #ifdef CONFIG_PM
13689 #endif
13690 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
13691 #ifdef CONFIG_IPW2100_DEBUG
13692 #endif
13693 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
13694 #endif
13695 #ifdef IPW2100_TX_POWER
13696 #endif
13697 #if 0
13698 #endif
13699 #ifdef CONFIG_IPW2100_DEBUG
13700 #endif
13701 #define IPW_PRIVACY_CAPABLE 0x0008
13702 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
13703 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
13704 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
13705 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
13706 #ifdef CONFIG_IPW2100_MONITOR
13707 #endif
13708 #ifdef CONFIG_IPW2100_MONITOR
13709 #endif
13710 #ifdef CONFIG_IPW2100_MONITOR
13711 #endif
13712 #ifdef CONFIG_IPW2100_MONITOR
13713 #endif
13714 #ifdef CONFIG_PM
13715 #endif
13716 #ifdef CONFIG_PM
13717 #endif
13718 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
13719 #ifdef CONFIG_PM
13720 #endif
13721 #ifdef CONFIG_IPW2100_DEBUG
13722 #endif
13723 /* LDV_COMMENT_END_PREP */
13724 /* LDV_COMMENT_FUNCTION_CALL Kernel calls driver release function before driver will be uploaded from kernel. This function declared as "MODULE_EXIT(function name)". */
13725 ldv_handler_precall();
13726 ipw2100_exit();
13727 /* LDV_COMMENT_BEGIN_PREP */
13728 #ifdef CONFIG_IPW2100_MONITOR
13729 #endif
13730 #define POWER_MODES 5
13731 #ifdef CONFIG_IPW2100_MONITOR
13732 #endif
13733 #define MAX_POWER_STRING 80
13734 #ifdef CONFIG_IPW2100_MONITOR
13735 #endif
13736 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
13737 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
13738 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
13739 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
13740 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
13741 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
13742 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
13743 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
13744 #ifdef CONFIG_IPW2100_MONITOR
13745 #endif
13746 #ifdef CONFIG_IPW2100_MONITOR
13747 #endif
13748 #ifdef CONFIG_IPW2100_MONITOR
13749 #else
13750 #endif
13751 #ifdef CONFIG_IPW2100_MONITOR
13752 #else
13753 #endif
13754 #ifdef CONFIG_IPW2100_DEBUG
13755 #endif
13756 #define IPW2100_FW_MAJOR_VERSION 1
13757 #define IPW2100_FW_MINOR_VERSION 3
13758 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
13759 #define IPW2100_FW_MAJOR(x) (x & 0xff)
13760 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
13761 IPW2100_FW_MAJOR_VERSION)
13762 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
13763 "." __stringify(IPW2100_FW_MINOR_VERSION)
13764 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
13765 #ifdef CONFIG_IPW2100_MONITOR
13766 #endif
13767 #ifdef CONFIG_IPW2100_MONITOR
13768 #endif
13769 /* LDV_COMMENT_END_PREP */
13770
13771 /* LDV_COMMENT_FUNCTION_CALL Checks that all resources and locks are correctly released before the driver will be unloaded. */
13772 ldv_final: ldv_check_final_state();
13773
13774 /* LDV_COMMENT_END_FUNCTION_CALL_SECTION */
13775 return;
13776
13777 }
13778 #endif
13779
13780 /* LDV_COMMENT_END_MAIN */
13781
13782 #line 9 "/home/druidos/temp/331_1a/work/current--X--drivers--X--defaultlinux-3.14.1.tar.xz--X--331_1a--X--cpachecker/linux-3.14.1.tar.xz/csd_deg_dscv/6893/dscv_tempdir/dscv/ri/331_1a/drivers/net/wireless/ipw2x00/ipw2100.o.c.prepared" 1
2 #include <linux/types.h>
3 #include <linux/dma-direction.h>
4 #include <verifier/rcv.h>
5 #include <verifier/set.h>
6 #include <verifier/map.h>
7
8 Set LDV_DMA_MAP_CALLS;
9
10 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_dma_map_page') maps page */
11 dma_addr_t ldv_dma_map_page(struct device *dev, struct page *page, size_t offset, size_t size, enum dma_data_direction dir) {
12 dma_addr_t nonedetermined;
13
14 nonedetermined = ldv_undef_ptr();
15
16 /* LDV_COMMENT_ASSERT Check that previos dma_mapping call was checked*/
17 ldv_assert(ldv_set_is_empty(LDV_DMA_MAP_CALLS));
18
19 ldv_set_add(LDV_DMA_MAP_CALLS, nonedetermined);
20
21 return nonedetermined;
22 }
23
24 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_dma_mapping_error') unmaps page */
25 int ldv_dma_mapping_error(struct device *dev, dma_addr_t dma_addr) {
26
27 /* LDV_COMMENT_ASSERT No dma_mapping calls to verify */
28 ldv_assert(ldv_set_contains(LDV_DMA_MAP_CALLS, dma_addr));
29 ldv_set_remove(LDV_DMA_MAP_CALLS, dma_addr);
30
31 int nonedetermined;
32
33 nonedetermined = ldv_undef_int();
34
35 return nonedetermined;
36 }
37
38
39
40 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_dma_map_single') maps pci_dma */
41 dma_addr_t ldv_dma_map_single(struct device *dev, void *cpu_addr, size_t size, enum dma_data_direction dir) {
42 dma_addr_t nonedetermined;
43
44 nonedetermined = ldv_undef_ptr();
45
46 /* LDV_COMMENT_ASSERT Check that previos dma_mapping call was checked*/
47 ldv_assert(ldv_set_is_empty(LDV_DMA_MAP_CALLS));
48
49 ldv_set_add(LDV_DMA_MAP_CALLS, nonedetermined);
50
51 return nonedetermined;
52 }
53
54 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_dma_map_single_attrs') maps pci_dma */
55 dma_addr_t ldv_dma_map_single_attrs(struct device *dev, void *ptr, size_t size, enum dma_data_direction dir, struct dma_attrs *attrs) {
56 dma_addr_t nonedetermined;
57
58 nonedetermined = ldv_undef_ptr();
59
60 /* LDV_COMMENT_ASSERT Check that previos dma_mapping call was checked*/
61 ldv_assert(ldv_set_is_empty(LDV_DMA_MAP_CALLS));
62
63 ldv_set_add(LDV_DMA_MAP_CALLS, nonedetermined);
64
65 return nonedetermined;
66 }
67
68 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_initialize') Initialize all module reference counters at the beginning */
69 void ldv_initialize(void) {
70 /* LDV_COMMENT_CHANGE_STATE All module reference counters have some initial value at the beginning */
71 ldv_set_init(LDV_DMA_MAP_CALLS);
72 }
73
74 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_check_final_state') Check that all module reference counters have their initial values at the end */
75 void ldv_check_final_state(void) {
76 /* LDV_COMMENT_ASSERT All incremented module reference counters should be decremented before module unloading*/
77 ldv_assert(ldv_set_is_empty(LDV_DMA_MAP_CALLS));
78 } 1 #ifndef _ASM_GENERIC_DMA_MAPPING_H
2 #define _ASM_GENERIC_DMA_MAPPING_H
3
4 #include <linux/kmemcheck.h>
5 #include <linux/bug.h>
6 #include <linux/scatterlist.h>
7 #include <linux/dma-debug.h>
8 #include <linux/dma-attrs.h>
9
10 static inline dma_addr_t dma_map_single_attrs(struct device *dev, void *ptr,
11 size_t size,
12 enum dma_data_direction dir,
13 struct dma_attrs *attrs)
14 {
15 struct dma_map_ops *ops = get_dma_ops(dev);
16 dma_addr_t addr;
17
18 kmemcheck_mark_initialized(ptr, size);
19 BUG_ON(!valid_dma_direction(dir));
20 addr = ops->map_page(dev, virt_to_page(ptr),
21 (unsigned long)ptr & ~PAGE_MASK, size,
22 dir, attrs);
23 debug_dma_map_page(dev, virt_to_page(ptr),
24 (unsigned long)ptr & ~PAGE_MASK, size,
25 dir, addr, true);
26 return addr;
27 }
28
29 static inline void dma_unmap_single_attrs(struct device *dev, dma_addr_t addr,
30 size_t size,
31 enum dma_data_direction dir,
32 struct dma_attrs *attrs)
33 {
34 struct dma_map_ops *ops = get_dma_ops(dev);
35
36 BUG_ON(!valid_dma_direction(dir));
37 if (ops->unmap_page)
38 ops->unmap_page(dev, addr, size, dir, attrs);
39 debug_dma_unmap_page(dev, addr, size, dir, true);
40 }
41
42 static inline int dma_map_sg_attrs(struct device *dev, struct scatterlist *sg,
43 int nents, enum dma_data_direction dir,
44 struct dma_attrs *attrs)
45 {
46 struct dma_map_ops *ops = get_dma_ops(dev);
47 int i, ents;
48 struct scatterlist *s;
49
50 for_each_sg(sg, s, nents, i)
51 kmemcheck_mark_initialized(sg_virt(s), s->length);
52 BUG_ON(!valid_dma_direction(dir));
53 ents = ops->map_sg(dev, sg, nents, dir, attrs);
54 debug_dma_map_sg(dev, sg, nents, ents, dir);
55
56 return ents;
57 }
58
59 static inline void dma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg,
60 int nents, enum dma_data_direction dir,
61 struct dma_attrs *attrs)
62 {
63 struct dma_map_ops *ops = get_dma_ops(dev);
64
65 BUG_ON(!valid_dma_direction(dir));
66 debug_dma_unmap_sg(dev, sg, nents, dir);
67 if (ops->unmap_sg)
68 ops->unmap_sg(dev, sg, nents, dir, attrs);
69 }
70
71 static inline dma_addr_t dma_map_page(struct device *dev, struct page *page,
72 size_t offset, size_t size,
73 enum dma_data_direction dir)
74 {
75 struct dma_map_ops *ops = get_dma_ops(dev);
76 dma_addr_t addr;
77
78 kmemcheck_mark_initialized(page_address(page) + offset, size);
79 BUG_ON(!valid_dma_direction(dir));
80 addr = ops->map_page(dev, page, offset, size, dir, NULL);
81 debug_dma_map_page(dev, page, offset, size, dir, addr, false);
82
83 return addr;
84 }
85
86 static inline void dma_unmap_page(struct device *dev, dma_addr_t addr,
87 size_t size, enum dma_data_direction dir)
88 {
89 struct dma_map_ops *ops = get_dma_ops(dev);
90
91 BUG_ON(!valid_dma_direction(dir));
92 if (ops->unmap_page)
93 ops->unmap_page(dev, addr, size, dir, NULL);
94 debug_dma_unmap_page(dev, addr, size, dir, false);
95 }
96
97 static inline void dma_sync_single_for_cpu(struct device *dev, dma_addr_t addr,
98 size_t size,
99 enum dma_data_direction dir)
100 {
101 struct dma_map_ops *ops = get_dma_ops(dev);
102
103 BUG_ON(!valid_dma_direction(dir));
104 if (ops->sync_single_for_cpu)
105 ops->sync_single_for_cpu(dev, addr, size, dir);
106 debug_dma_sync_single_for_cpu(dev, addr, size, dir);
107 }
108
109 static inline void dma_sync_single_for_device(struct device *dev,
110 dma_addr_t addr, size_t size,
111 enum dma_data_direction dir)
112 {
113 struct dma_map_ops *ops = get_dma_ops(dev);
114
115 BUG_ON(!valid_dma_direction(dir));
116 if (ops->sync_single_for_device)
117 ops->sync_single_for_device(dev, addr, size, dir);
118 debug_dma_sync_single_for_device(dev, addr, size, dir);
119 }
120
121 static inline void dma_sync_single_range_for_cpu(struct device *dev,
122 dma_addr_t addr,
123 unsigned long offset,
124 size_t size,
125 enum dma_data_direction dir)
126 {
127 const struct dma_map_ops *ops = get_dma_ops(dev);
128
129 BUG_ON(!valid_dma_direction(dir));
130 if (ops->sync_single_for_cpu)
131 ops->sync_single_for_cpu(dev, addr + offset, size, dir);
132 debug_dma_sync_single_range_for_cpu(dev, addr, offset, size, dir);
133 }
134
135 static inline void dma_sync_single_range_for_device(struct device *dev,
136 dma_addr_t addr,
137 unsigned long offset,
138 size_t size,
139 enum dma_data_direction dir)
140 {
141 const struct dma_map_ops *ops = get_dma_ops(dev);
142
143 BUG_ON(!valid_dma_direction(dir));
144 if (ops->sync_single_for_device)
145 ops->sync_single_for_device(dev, addr + offset, size, dir);
146 debug_dma_sync_single_range_for_device(dev, addr, offset, size, dir);
147 }
148
149 static inline void
150 dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg,
151 int nelems, enum dma_data_direction dir)
152 {
153 struct dma_map_ops *ops = get_dma_ops(dev);
154
155 BUG_ON(!valid_dma_direction(dir));
156 if (ops->sync_sg_for_cpu)
157 ops->sync_sg_for_cpu(dev, sg, nelems, dir);
158 debug_dma_sync_sg_for_cpu(dev, sg, nelems, dir);
159 }
160
161 static inline void
162 dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,
163 int nelems, enum dma_data_direction dir)
164 {
165 struct dma_map_ops *ops = get_dma_ops(dev);
166
167 BUG_ON(!valid_dma_direction(dir));
168 if (ops->sync_sg_for_device)
169 ops->sync_sg_for_device(dev, sg, nelems, dir);
170 debug_dma_sync_sg_for_device(dev, sg, nelems, dir);
171
172 }
173
174 #define dma_map_single(d, a, s, r) dma_map_single_attrs(d, a, s, r, NULL)
175 #define dma_unmap_single(d, a, s, r) dma_unmap_single_attrs(d, a, s, r, NULL)
176 #define dma_map_sg(d, s, n, r) dma_map_sg_attrs(d, s, n, r, NULL)
177 #define dma_unmap_sg(d, s, n, r) dma_unmap_sg_attrs(d, s, n, r, NULL)
178
179 extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,
180 void *cpu_addr, dma_addr_t dma_addr, size_t size);
181
182 /**
183 * dma_mmap_attrs - map a coherent DMA allocation into user space
184 * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
185 * @vma: vm_area_struct describing requested user mapping
186 * @cpu_addr: kernel CPU-view address returned from dma_alloc_attrs
187 * @handle: device-view address returned from dma_alloc_attrs
188 * @size: size of memory originally requested in dma_alloc_attrs
189 * @attrs: attributes of mapping properties requested in dma_alloc_attrs
190 *
191 * Map a coherent DMA buffer previously allocated by dma_alloc_attrs
192 * into user space. The coherent DMA buffer must not be freed by the
193 * driver until the user space mapping has been released.
194 */
195 static inline int
196 dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, void *cpu_addr,
197 dma_addr_t dma_addr, size_t size, struct dma_attrs *attrs)
198 {
199 struct dma_map_ops *ops = get_dma_ops(dev);
200 BUG_ON(!ops);
201 if (ops->mmap)
202 return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs);
203 return dma_common_mmap(dev, vma, cpu_addr, dma_addr, size);
204 }
205
206 #define dma_mmap_coherent(d, v, c, h, s) dma_mmap_attrs(d, v, c, h, s, NULL)
207
208 static inline int dma_mmap_writecombine(struct device *dev, struct vm_area_struct *vma,
209 void *cpu_addr, dma_addr_t dma_addr, size_t size)
210 {
211 DEFINE_DMA_ATTRS(attrs);
212 dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs);
213 return dma_mmap_attrs(dev, vma, cpu_addr, dma_addr, size, &attrs);
214 }
215
216 int
217 dma_common_get_sgtable(struct device *dev, struct sg_table *sgt,
218 void *cpu_addr, dma_addr_t dma_addr, size_t size);
219
220 static inline int
221 dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, void *cpu_addr,
222 dma_addr_t dma_addr, size_t size, struct dma_attrs *attrs)
223 {
224 struct dma_map_ops *ops = get_dma_ops(dev);
225 BUG_ON(!ops);
226 if (ops->get_sgtable)
227 return ops->get_sgtable(dev, sgt, cpu_addr, dma_addr, size,
228 attrs);
229 return dma_common_get_sgtable(dev, sgt, cpu_addr, dma_addr, size);
230 }
231
232 #define dma_get_sgtable(d, t, v, h, s) dma_get_sgtable_attrs(d, t, v, h, s, NULL)
233
234 #endif 1 /* include this file if the platform implements the dma_ DMA Mapping API
2 * and wants to provide the pci_ DMA Mapping API in terms of it */
3
4 #ifndef _ASM_GENERIC_PCI_DMA_COMPAT_H
5 #define _ASM_GENERIC_PCI_DMA_COMPAT_H
6
7 #include <linux/dma-mapping.h>
8
9 static inline int
10 pci_dma_supported(struct pci_dev *hwdev, u64 mask)
11 {
12 return dma_supported(hwdev == NULL ? NULL : &hwdev->dev, mask);
13 }
14
15 static inline void *
16 pci_alloc_consistent(struct pci_dev *hwdev, size_t size,
17 dma_addr_t *dma_handle)
18 {
19 return dma_alloc_coherent(hwdev == NULL ? NULL : &hwdev->dev, size, dma_handle, GFP_ATOMIC);
20 }
21
22 static inline void
23 pci_free_consistent(struct pci_dev *hwdev, size_t size,
24 void *vaddr, dma_addr_t dma_handle)
25 {
26 dma_free_coherent(hwdev == NULL ? NULL : &hwdev->dev, size, vaddr, dma_handle);
27 }
28
29 static inline dma_addr_t
30 pci_map_single(struct pci_dev *hwdev, void *ptr, size_t size, int direction)
31 {
32 return dma_map_single(hwdev == NULL ? NULL : &hwdev->dev, ptr, size, (enum dma_data_direction)direction);
33 }
34
35 static inline void
36 pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr,
37 size_t size, int direction)
38 {
39 dma_unmap_single(hwdev == NULL ? NULL : &hwdev->dev, dma_addr, size, (enum dma_data_direction)direction);
40 }
41
42 static inline dma_addr_t
43 pci_map_page(struct pci_dev *hwdev, struct page *page,
44 unsigned long offset, size_t size, int direction)
45 {
46 return dma_map_page(hwdev == NULL ? NULL : &hwdev->dev, page, offset, size, (enum dma_data_direction)direction);
47 }
48
49 static inline void
50 pci_unmap_page(struct pci_dev *hwdev, dma_addr_t dma_address,
51 size_t size, int direction)
52 {
53 dma_unmap_page(hwdev == NULL ? NULL : &hwdev->dev, dma_address, size, (enum dma_data_direction)direction);
54 }
55
56 static inline int
57 pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg,
58 int nents, int direction)
59 {
60 return dma_map_sg(hwdev == NULL ? NULL : &hwdev->dev, sg, nents, (enum dma_data_direction)direction);
61 }
62
63 static inline void
64 pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg,
65 int nents, int direction)
66 {
67 dma_unmap_sg(hwdev == NULL ? NULL : &hwdev->dev, sg, nents, (enum dma_data_direction)direction);
68 }
69
70 static inline void
71 pci_dma_sync_single_for_cpu(struct pci_dev *hwdev, dma_addr_t dma_handle,
72 size_t size, int direction)
73 {
74 dma_sync_single_for_cpu(hwdev == NULL ? NULL : &hwdev->dev, dma_handle, size, (enum dma_data_direction)direction);
75 }
76
77 static inline void
78 pci_dma_sync_single_for_device(struct pci_dev *hwdev, dma_addr_t dma_handle,
79 size_t size, int direction)
80 {
81 dma_sync_single_for_device(hwdev == NULL ? NULL : &hwdev->dev, dma_handle, size, (enum dma_data_direction)direction);
82 }
83
84 static inline void
85 pci_dma_sync_sg_for_cpu(struct pci_dev *hwdev, struct scatterlist *sg,
86 int nelems, int direction)
87 {
88 dma_sync_sg_for_cpu(hwdev == NULL ? NULL : &hwdev->dev, sg, nelems, (enum dma_data_direction)direction);
89 }
90
91 static inline void
92 pci_dma_sync_sg_for_device(struct pci_dev *hwdev, struct scatterlist *sg,
93 int nelems, int direction)
94 {
95 dma_sync_sg_for_device(hwdev == NULL ? NULL : &hwdev->dev, sg, nelems, (enum dma_data_direction)direction);
96 }
97
98 static inline int
99 pci_dma_mapping_error(struct pci_dev *pdev, dma_addr_t dma_addr)
100 {
101 return dma_mapping_error(&pdev->dev, dma_addr);
102 }
103
104 #ifdef CONFIG_PCI
105 static inline int pci_set_dma_mask(struct pci_dev *dev, u64 mask)
106 {
107 return dma_set_mask(&dev->dev, mask);
108 }
109
110 static inline int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
111 {
112 return dma_set_coherent_mask(&dev->dev, mask);
113 }
114 #endif
115
116 #endif 1 #ifndef _LINUX_DMA_MAPPING_H
2 #define _LINUX_DMA_MAPPING_H
3
4 #include <linux/string.h>
5 #include <linux/device.h>
6 #include <linux/err.h>
7 #include <linux/dma-attrs.h>
8 #include <linux/dma-direction.h>
9 #include <linux/scatterlist.h>
10
11 struct dma_map_ops {
12 void* (*alloc)(struct device *dev, size_t size,
13 dma_addr_t *dma_handle, gfp_t gfp,
14 struct dma_attrs *attrs);
15 void (*free)(struct device *dev, size_t size,
16 void *vaddr, dma_addr_t dma_handle,
17 struct dma_attrs *attrs);
18 int (*mmap)(struct device *, struct vm_area_struct *,
19 void *, dma_addr_t, size_t, struct dma_attrs *attrs);
20
21 int (*get_sgtable)(struct device *dev, struct sg_table *sgt, void *,
22 dma_addr_t, size_t, struct dma_attrs *attrs);
23
24 dma_addr_t (*map_page)(struct device *dev, struct page *page,
25 unsigned long offset, size_t size,
26 enum dma_data_direction dir,
27 struct dma_attrs *attrs);
28 void (*unmap_page)(struct device *dev, dma_addr_t dma_handle,
29 size_t size, enum dma_data_direction dir,
30 struct dma_attrs *attrs);
31 int (*map_sg)(struct device *dev, struct scatterlist *sg,
32 int nents, enum dma_data_direction dir,
33 struct dma_attrs *attrs);
34 void (*unmap_sg)(struct device *dev,
35 struct scatterlist *sg, int nents,
36 enum dma_data_direction dir,
37 struct dma_attrs *attrs);
38 void (*sync_single_for_cpu)(struct device *dev,
39 dma_addr_t dma_handle, size_t size,
40 enum dma_data_direction dir);
41 void (*sync_single_for_device)(struct device *dev,
42 dma_addr_t dma_handle, size_t size,
43 enum dma_data_direction dir);
44 void (*sync_sg_for_cpu)(struct device *dev,
45 struct scatterlist *sg, int nents,
46 enum dma_data_direction dir);
47 void (*sync_sg_for_device)(struct device *dev,
48 struct scatterlist *sg, int nents,
49 enum dma_data_direction dir);
50 int (*mapping_error)(struct device *dev, dma_addr_t dma_addr);
51 int (*dma_supported)(struct device *dev, u64 mask);
52 int (*set_dma_mask)(struct device *dev, u64 mask);
53 #ifdef ARCH_HAS_DMA_GET_REQUIRED_MASK
54 u64 (*get_required_mask)(struct device *dev);
55 #endif
56 int is_phys;
57 };
58
59 #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
60
61 #define DMA_MASK_NONE 0x0ULL
62
63 static inline int valid_dma_direction(int dma_direction)
64 {
65 return ((dma_direction == DMA_BIDIRECTIONAL) ||
66 (dma_direction == DMA_TO_DEVICE) ||
67 (dma_direction == DMA_FROM_DEVICE));
68 }
69
70 static inline int is_device_dma_capable(struct device *dev)
71 {
72 return dev->dma_mask != NULL && *dev->dma_mask != DMA_MASK_NONE;
73 }
74
75 #ifdef CONFIG_HAS_DMA
76 #include <asm/dma-mapping.h>
77 #else
78 #include <asm-generic/dma-mapping-broken.h>
79 #endif
80
81 static inline u64 dma_get_mask(struct device *dev)
82 {
83 if (dev && dev->dma_mask && *dev->dma_mask)
84 return *dev->dma_mask;
85 return DMA_BIT_MASK(32);
86 }
87
88 #ifdef CONFIG_ARCH_HAS_DMA_SET_COHERENT_MASK
89 int dma_set_coherent_mask(struct device *dev, u64 mask);
90 #else
91 static inline int dma_set_coherent_mask(struct device *dev, u64 mask)
92 {
93 if (!dma_supported(dev, mask))
94 return -EIO;
95 dev->coherent_dma_mask = mask;
96 return 0;
97 }
98 #endif
99
100 /*
101 * Set both the DMA mask and the coherent DMA mask to the same thing.
102 * Note that we don't check the return value from dma_set_coherent_mask()
103 * as the DMA API guarantees that the coherent DMA mask can be set to
104 * the same or smaller than the streaming DMA mask.
105 */
106 static inline int dma_set_mask_and_coherent(struct device *dev, u64 mask)
107 {
108 int rc = dma_set_mask(dev, mask);
109 if (rc == 0)
110 dma_set_coherent_mask(dev, mask);
111 return rc;
112 }
113
114 /*
115 * Similar to the above, except it deals with the case where the device
116 * does not have dev->dma_mask appropriately setup.
117 */
118 static inline int dma_coerce_mask_and_coherent(struct device *dev, u64 mask)
119 {
120 dev->dma_mask = &dev->coherent_dma_mask;
121 return dma_set_mask_and_coherent(dev, mask);
122 }
123
124 extern u64 dma_get_required_mask(struct device *dev);
125
126 static inline unsigned int dma_get_max_seg_size(struct device *dev)
127 {
128 return dev->dma_parms ? dev->dma_parms->max_segment_size : 65536;
129 }
130
131 static inline unsigned int dma_set_max_seg_size(struct device *dev,
132 unsigned int size)
133 {
134 if (dev->dma_parms) {
135 dev->dma_parms->max_segment_size = size;
136 return 0;
137 } else
138 return -EIO;
139 }
140
141 static inline unsigned long dma_get_seg_boundary(struct device *dev)
142 {
143 return dev->dma_parms ?
144 dev->dma_parms->segment_boundary_mask : 0xffffffff;
145 }
146
147 static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask)
148 {
149 if (dev->dma_parms) {
150 dev->dma_parms->segment_boundary_mask = mask;
151 return 0;
152 } else
153 return -EIO;
154 }
155
156 #ifndef dma_max_pfn
157 static inline unsigned long dma_max_pfn(struct device *dev)
158 {
159 return *dev->dma_mask >> PAGE_SHIFT;
160 }
161 #endif
162
163 static inline void *dma_zalloc_coherent(struct device *dev, size_t size,
164 dma_addr_t *dma_handle, gfp_t flag)
165 {
166 void *ret = dma_alloc_coherent(dev, size, dma_handle,
167 flag | __GFP_ZERO);
168 return ret;
169 }
170
171 #ifdef CONFIG_HAS_DMA
172 static inline int dma_get_cache_alignment(void)
173 {
174 #ifdef ARCH_DMA_MINALIGN
175 return ARCH_DMA_MINALIGN;
176 #endif
177 return 1;
178 }
179 #endif
180
181 /* flags for the coherent memory api */
182 #define DMA_MEMORY_MAP 0x01
183 #define DMA_MEMORY_IO 0x02
184 #define DMA_MEMORY_INCLUDES_CHILDREN 0x04
185 #define DMA_MEMORY_EXCLUSIVE 0x08
186
187 #ifndef ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY
188 static inline int
189 dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
190 dma_addr_t device_addr, size_t size, int flags)
191 {
192 return 0;
193 }
194
195 static inline void
196 dma_release_declared_memory(struct device *dev)
197 {
198 }
199
200 static inline void *
201 dma_mark_declared_memory_occupied(struct device *dev,
202 dma_addr_t device_addr, size_t size)
203 {
204 return ERR_PTR(-EBUSY);
205 }
206 #endif
207
208 /*
209 * Managed DMA API
210 */
211 extern void *dmam_alloc_coherent(struct device *dev, size_t size,
212 dma_addr_t *dma_handle, gfp_t gfp);
213 extern void dmam_free_coherent(struct device *dev, size_t size, void *vaddr,
214 dma_addr_t dma_handle);
215 extern void *dmam_alloc_noncoherent(struct device *dev, size_t size,
216 dma_addr_t *dma_handle, gfp_t gfp);
217 extern void dmam_free_noncoherent(struct device *dev, size_t size, void *vaddr,
218 dma_addr_t dma_handle);
219 #ifdef ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY
220 extern int dmam_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
221 dma_addr_t device_addr, size_t size,
222 int flags);
223 extern void dmam_release_declared_memory(struct device *dev);
224 #else /* ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY */
225 static inline int dmam_declare_coherent_memory(struct device *dev,
226 dma_addr_t bus_addr, dma_addr_t device_addr,
227 size_t size, gfp_t gfp)
228 {
229 return 0;
230 }
231
232 static inline void dmam_release_declared_memory(struct device *dev)
233 {
234 }
235 #endif /* ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY */
236
237 #ifndef CONFIG_HAVE_DMA_ATTRS
238 struct dma_attrs;
239
240 #define dma_map_single_attrs(dev, cpu_addr, size, dir, attrs) \
241 dma_map_single(dev, cpu_addr, size, dir)
242
243 #define dma_unmap_single_attrs(dev, dma_addr, size, dir, attrs) \
244 dma_unmap_single(dev, dma_addr, size, dir)
245
246 #define dma_map_sg_attrs(dev, sgl, nents, dir, attrs) \
247 dma_map_sg(dev, sgl, nents, dir)
248
249 #define dma_unmap_sg_attrs(dev, sgl, nents, dir, attrs) \
250 dma_unmap_sg(dev, sgl, nents, dir)
251
252 #endif /* CONFIG_HAVE_DMA_ATTRS */
253
254 #ifdef CONFIG_NEED_DMA_MAP_STATE
255 #define DEFINE_DMA_UNMAP_ADDR(ADDR_NAME) dma_addr_t ADDR_NAME
256 #define DEFINE_DMA_UNMAP_LEN(LEN_NAME) __u32 LEN_NAME
257 #define dma_unmap_addr(PTR, ADDR_NAME) ((PTR)->ADDR_NAME)
258 #define dma_unmap_addr_set(PTR, ADDR_NAME, VAL) (((PTR)->ADDR_NAME) = (VAL))
259 #define dma_unmap_len(PTR, LEN_NAME) ((PTR)->LEN_NAME)
260 #define dma_unmap_len_set(PTR, LEN_NAME, VAL) (((PTR)->LEN_NAME) = (VAL))
261 #else
262 #define DEFINE_DMA_UNMAP_ADDR(ADDR_NAME)
263 #define DEFINE_DMA_UNMAP_LEN(LEN_NAME)
264 #define dma_unmap_addr(PTR, ADDR_NAME) (0)
265 #define dma_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0)
266 #define dma_unmap_len(PTR, LEN_NAME) (0)
267 #define dma_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0)
268 #endif
269
270 #endif 1 #ifndef _LINUX_LIST_H
2 #define _LINUX_LIST_H
3
4 #include <linux/types.h>
5 #include <linux/stddef.h>
6 #include <linux/poison.h>
7 #include <linux/const.h>
8
9 /*
10 * Simple doubly linked list implementation.
11 *
12 * Some of the internal functions ("__xxx") are useful when
13 * manipulating whole lists rather than single entries, as
14 * sometimes we already know the next/prev entries and we can
15 * generate better code by using them directly rather than
16 * using the generic single-entry routines.
17 */
18
19 #define LIST_HEAD_INIT(name) { &(name), &(name) }
20
21 #define LIST_HEAD(name) \
22 struct list_head name = LIST_HEAD_INIT(name)
23
24 static inline void INIT_LIST_HEAD(struct list_head *list)
25 {
26 list->next = list;
27 list->prev = list;
28 }
29
30 /*
31 * Insert a new entry between two known consecutive entries.
32 *
33 * This is only for internal list manipulation where we know
34 * the prev/next entries already!
35 */
36 #ifndef CONFIG_DEBUG_LIST
37 static inline void __list_add(struct list_head *new,
38 struct list_head *prev,
39 struct list_head *next)
40 {
41 next->prev = new;
42 new->next = next;
43 new->prev = prev;
44 prev->next = new;
45 }
46 #else
47 extern void __list_add(struct list_head *new,
48 struct list_head *prev,
49 struct list_head *next);
50 #endif
51
52 /**
53 * list_add - add a new entry
54 * @new: new entry to be added
55 * @head: list head to add it after
56 *
57 * Insert a new entry after the specified head.
58 * This is good for implementing stacks.
59 */
60 static inline void list_add(struct list_head *new, struct list_head *head)
61 {
62 __list_add(new, head, head->next);
63 }
64
65
66 /**
67 * list_add_tail - add a new entry
68 * @new: new entry to be added
69 * @head: list head to add it before
70 *
71 * Insert a new entry before the specified head.
72 * This is useful for implementing queues.
73 */
74 static inline void list_add_tail(struct list_head *new, struct list_head *head)
75 {
76 __list_add(new, head->prev, head);
77 }
78
79 /*
80 * Delete a list entry by making the prev/next entries
81 * point to each other.
82 *
83 * This is only for internal list manipulation where we know
84 * the prev/next entries already!
85 */
86 static inline void __list_del(struct list_head * prev, struct list_head * next)
87 {
88 next->prev = prev;
89 prev->next = next;
90 }
91
92 /**
93 * list_del - deletes entry from list.
94 * @entry: the element to delete from the list.
95 * Note: list_empty() on entry does not return true after this, the entry is
96 * in an undefined state.
97 */
98 #ifndef CONFIG_DEBUG_LIST
99 static inline void __list_del_entry(struct list_head *entry)
100 {
101 __list_del(entry->prev, entry->next);
102 }
103
104 static inline void list_del(struct list_head *entry)
105 {
106 __list_del(entry->prev, entry->next);
107 entry->next = LIST_POISON1;
108 entry->prev = LIST_POISON2;
109 }
110 #else
111 extern void __list_del_entry(struct list_head *entry);
112 extern void list_del(struct list_head *entry);
113 #endif
114
115 /**
116 * list_replace - replace old entry by new one
117 * @old : the element to be replaced
118 * @new : the new element to insert
119 *
120 * If @old was empty, it will be overwritten.
121 */
122 static inline void list_replace(struct list_head *old,
123 struct list_head *new)
124 {
125 new->next = old->next;
126 new->next->prev = new;
127 new->prev = old->prev;
128 new->prev->next = new;
129 }
130
131 static inline void list_replace_init(struct list_head *old,
132 struct list_head *new)
133 {
134 list_replace(old, new);
135 INIT_LIST_HEAD(old);
136 }
137
138 /**
139 * list_del_init - deletes entry from list and reinitialize it.
140 * @entry: the element to delete from the list.
141 */
142 static inline void list_del_init(struct list_head *entry)
143 {
144 __list_del_entry(entry);
145 INIT_LIST_HEAD(entry);
146 }
147
148 /**
149 * list_move - delete from one list and add as another's head
150 * @list: the entry to move
151 * @head: the head that will precede our entry
152 */
153 static inline void list_move(struct list_head *list, struct list_head *head)
154 {
155 __list_del_entry(list);
156 list_add(list, head);
157 }
158
159 /**
160 * list_move_tail - delete from one list and add as another's tail
161 * @list: the entry to move
162 * @head: the head that will follow our entry
163 */
164 static inline void list_move_tail(struct list_head *list,
165 struct list_head *head)
166 {
167 __list_del_entry(list);
168 list_add_tail(list, head);
169 }
170
171 /**
172 * list_is_last - tests whether @list is the last entry in list @head
173 * @list: the entry to test
174 * @head: the head of the list
175 */
176 static inline int list_is_last(const struct list_head *list,
177 const struct list_head *head)
178 {
179 return list->next == head;
180 }
181
182 /**
183 * list_empty - tests whether a list is empty
184 * @head: the list to test.
185 */
186 static inline int list_empty(const struct list_head *head)
187 {
188 return head->next == head;
189 }
190
191 /**
192 * list_empty_careful - tests whether a list is empty and not being modified
193 * @head: the list to test
194 *
195 * Description:
196 * tests whether a list is empty _and_ checks that no other CPU might be
197 * in the process of modifying either member (next or prev)
198 *
199 * NOTE: using list_empty_careful() without synchronization
200 * can only be safe if the only activity that can happen
201 * to the list entry is list_del_init(). Eg. it cannot be used
202 * if another CPU could re-list_add() it.
203 */
204 static inline int list_empty_careful(const struct list_head *head)
205 {
206 struct list_head *next = head->next;
207 return (next == head) && (next == head->prev);
208 }
209
210 /**
211 * list_rotate_left - rotate the list to the left
212 * @head: the head of the list
213 */
214 static inline void list_rotate_left(struct list_head *head)
215 {
216 struct list_head *first;
217
218 if (!list_empty(head)) {
219 first = head->next;
220 list_move_tail(first, head);
221 }
222 }
223
224 /**
225 * list_is_singular - tests whether a list has just one entry.
226 * @head: the list to test.
227 */
228 static inline int list_is_singular(const struct list_head *head)
229 {
230 return !list_empty(head) && (head->next == head->prev);
231 }
232
233 static inline void __list_cut_position(struct list_head *list,
234 struct list_head *head, struct list_head *entry)
235 {
236 struct list_head *new_first = entry->next;
237 list->next = head->next;
238 list->next->prev = list;
239 list->prev = entry;
240 entry->next = list;
241 head->next = new_first;
242 new_first->prev = head;
243 }
244
245 /**
246 * list_cut_position - cut a list into two
247 * @list: a new list to add all removed entries
248 * @head: a list with entries
249 * @entry: an entry within head, could be the head itself
250 * and if so we won't cut the list
251 *
252 * This helper moves the initial part of @head, up to and
253 * including @entry, from @head to @list. You should
254 * pass on @entry an element you know is on @head. @list
255 * should be an empty list or a list you do not care about
256 * losing its data.
257 *
258 */
259 static inline void list_cut_position(struct list_head *list,
260 struct list_head *head, struct list_head *entry)
261 {
262 if (list_empty(head))
263 return;
264 if (list_is_singular(head) &&
265 (head->next != entry && head != entry))
266 return;
267 if (entry == head)
268 INIT_LIST_HEAD(list);
269 else
270 __list_cut_position(list, head, entry);
271 }
272
273 static inline void __list_splice(const struct list_head *list,
274 struct list_head *prev,
275 struct list_head *next)
276 {
277 struct list_head *first = list->next;
278 struct list_head *last = list->prev;
279
280 first->prev = prev;
281 prev->next = first;
282
283 last->next = next;
284 next->prev = last;
285 }
286
287 /**
288 * list_splice - join two lists, this is designed for stacks
289 * @list: the new list to add.
290 * @head: the place to add it in the first list.
291 */
292 static inline void list_splice(const struct list_head *list,
293 struct list_head *head)
294 {
295 if (!list_empty(list))
296 __list_splice(list, head, head->next);
297 }
298
299 /**
300 * list_splice_tail - join two lists, each list being a queue
301 * @list: the new list to add.
302 * @head: the place to add it in the first list.
303 */
304 static inline void list_splice_tail(struct list_head *list,
305 struct list_head *head)
306 {
307 if (!list_empty(list))
308 __list_splice(list, head->prev, head);
309 }
310
311 /**
312 * list_splice_init - join two lists and reinitialise the emptied list.
313 * @list: the new list to add.
314 * @head: the place to add it in the first list.
315 *
316 * The list at @list is reinitialised
317 */
318 static inline void list_splice_init(struct list_head *list,
319 struct list_head *head)
320 {
321 if (!list_empty(list)) {
322 __list_splice(list, head, head->next);
323 INIT_LIST_HEAD(list);
324 }
325 }
326
327 /**
328 * list_splice_tail_init - join two lists and reinitialise the emptied list
329 * @list: the new list to add.
330 * @head: the place to add it in the first list.
331 *
332 * Each of the lists is a queue.
333 * The list at @list is reinitialised
334 */
335 static inline void list_splice_tail_init(struct list_head *list,
336 struct list_head *head)
337 {
338 if (!list_empty(list)) {
339 __list_splice(list, head->prev, head);
340 INIT_LIST_HEAD(list);
341 }
342 }
343
344 /**
345 * list_entry - get the struct for this entry
346 * @ptr: the &struct list_head pointer.
347 * @type: the type of the struct this is embedded in.
348 * @member: the name of the list_struct within the struct.
349 */
350 #define list_entry(ptr, type, member) \
351 container_of(ptr, type, member)
352
353 /**
354 * list_first_entry - get the first element from a list
355 * @ptr: the list head to take the element from.
356 * @type: the type of the struct this is embedded in.
357 * @member: the name of the list_struct within the struct.
358 *
359 * Note, that list is expected to be not empty.
360 */
361 #define list_first_entry(ptr, type, member) \
362 list_entry((ptr)->next, type, member)
363
364 /**
365 * list_last_entry - get the last element from a list
366 * @ptr: the list head to take the element from.
367 * @type: the type of the struct this is embedded in.
368 * @member: the name of the list_struct within the struct.
369 *
370 * Note, that list is expected to be not empty.
371 */
372 #define list_last_entry(ptr, type, member) \
373 list_entry((ptr)->prev, type, member)
374
375 /**
376 * list_first_entry_or_null - get the first element from a list
377 * @ptr: the list head to take the element from.
378 * @type: the type of the struct this is embedded in.
379 * @member: the name of the list_struct within the struct.
380 *
381 * Note that if the list is empty, it returns NULL.
382 */
383 #define list_first_entry_or_null(ptr, type, member) \
384 (!list_empty(ptr) ? list_first_entry(ptr, type, member) : NULL)
385
386 /**
387 * list_next_entry - get the next element in list
388 * @pos: the type * to cursor
389 * @member: the name of the list_struct within the struct.
390 */
391 #define list_next_entry(pos, member) \
392 list_entry((pos)->member.next, typeof(*(pos)), member)
393
394 /**
395 * list_prev_entry - get the prev element in list
396 * @pos: the type * to cursor
397 * @member: the name of the list_struct within the struct.
398 */
399 #define list_prev_entry(pos, member) \
400 list_entry((pos)->member.prev, typeof(*(pos)), member)
401
402 /**
403 * list_for_each - iterate over a list
404 * @pos: the &struct list_head to use as a loop cursor.
405 * @head: the head for your list.
406 */
407 #define list_for_each(pos, head) \
408 for (pos = (head)->next; pos != (head); pos = pos->next)
409
410 /**
411 * list_for_each_prev - iterate over a list backwards
412 * @pos: the &struct list_head to use as a loop cursor.
413 * @head: the head for your list.
414 */
415 #define list_for_each_prev(pos, head) \
416 for (pos = (head)->prev; pos != (head); pos = pos->prev)
417
418 /**
419 * list_for_each_safe - iterate over a list safe against removal of list entry
420 * @pos: the &struct list_head to use as a loop cursor.
421 * @n: another &struct list_head to use as temporary storage
422 * @head: the head for your list.
423 */
424 #define list_for_each_safe(pos, n, head) \
425 for (pos = (head)->next, n = pos->next; pos != (head); \
426 pos = n, n = pos->next)
427
428 /**
429 * list_for_each_prev_safe - iterate over a list backwards safe against removal of list entry
430 * @pos: the &struct list_head to use as a loop cursor.
431 * @n: another &struct list_head to use as temporary storage
432 * @head: the head for your list.
433 */
434 #define list_for_each_prev_safe(pos, n, head) \
435 for (pos = (head)->prev, n = pos->prev; \
436 pos != (head); \
437 pos = n, n = pos->prev)
438
439 /**
440 * list_for_each_entry - iterate over list of given type
441 * @pos: the type * to use as a loop cursor.
442 * @head: the head for your list.
443 * @member: the name of the list_struct within the struct.
444 */
445 #define list_for_each_entry(pos, head, member) \
446 for (pos = list_first_entry(head, typeof(*pos), member); \
447 &pos->member != (head); \
448 pos = list_next_entry(pos, member))
449
450 /**
451 * list_for_each_entry_reverse - iterate backwards over list of given type.
452 * @pos: the type * to use as a loop cursor.
453 * @head: the head for your list.
454 * @member: the name of the list_struct within the struct.
455 */
456 #define list_for_each_entry_reverse(pos, head, member) \
457 for (pos = list_last_entry(head, typeof(*pos), member); \
458 &pos->member != (head); \
459 pos = list_prev_entry(pos, member))
460
461 /**
462 * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue()
463 * @pos: the type * to use as a start point
464 * @head: the head of the list
465 * @member: the name of the list_struct within the struct.
466 *
467 * Prepares a pos entry for use as a start point in list_for_each_entry_continue().
468 */
469 #define list_prepare_entry(pos, head, member) \
470 ((pos) ? : list_entry(head, typeof(*pos), member))
471
472 /**
473 * list_for_each_entry_continue - continue iteration over list of given type
474 * @pos: the type * to use as a loop cursor.
475 * @head: the head for your list.
476 * @member: the name of the list_struct within the struct.
477 *
478 * Continue to iterate over list of given type, continuing after
479 * the current position.
480 */
481 #define list_for_each_entry_continue(pos, head, member) \
482 for (pos = list_next_entry(pos, member); \
483 &pos->member != (head); \
484 pos = list_next_entry(pos, member))
485
486 /**
487 * list_for_each_entry_continue_reverse - iterate backwards from the given point
488 * @pos: the type * to use as a loop cursor.
489 * @head: the head for your list.
490 * @member: the name of the list_struct within the struct.
491 *
492 * Start to iterate over list of given type backwards, continuing after
493 * the current position.
494 */
495 #define list_for_each_entry_continue_reverse(pos, head, member) \
496 for (pos = list_prev_entry(pos, member); \
497 &pos->member != (head); \
498 pos = list_prev_entry(pos, member))
499
500 /**
501 * list_for_each_entry_from - iterate over list of given type from the current point
502 * @pos: the type * to use as a loop cursor.
503 * @head: the head for your list.
504 * @member: the name of the list_struct within the struct.
505 *
506 * Iterate over list of given type, continuing from current position.
507 */
508 #define list_for_each_entry_from(pos, head, member) \
509 for (; &pos->member != (head); \
510 pos = list_next_entry(pos, member))
511
512 /**
513 * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry
514 * @pos: the type * to use as a loop cursor.
515 * @n: another type * to use as temporary storage
516 * @head: the head for your list.
517 * @member: the name of the list_struct within the struct.
518 */
519 #define list_for_each_entry_safe(pos, n, head, member) \
520 for (pos = list_first_entry(head, typeof(*pos), member), \
521 n = list_next_entry(pos, member); \
522 &pos->member != (head); \
523 pos = n, n = list_next_entry(n, member))
524
525 /**
526 * list_for_each_entry_safe_continue - continue list iteration safe against removal
527 * @pos: the type * to use as a loop cursor.
528 * @n: another type * to use as temporary storage
529 * @head: the head for your list.
530 * @member: the name of the list_struct within the struct.
531 *
532 * Iterate over list of given type, continuing after current point,
533 * safe against removal of list entry.
534 */
535 #define list_for_each_entry_safe_continue(pos, n, head, member) \
536 for (pos = list_next_entry(pos, member), \
537 n = list_next_entry(pos, member); \
538 &pos->member != (head); \
539 pos = n, n = list_next_entry(n, member))
540
541 /**
542 * list_for_each_entry_safe_from - iterate over list from current point safe against removal
543 * @pos: the type * to use as a loop cursor.
544 * @n: another type * to use as temporary storage
545 * @head: the head for your list.
546 * @member: the name of the list_struct within the struct.
547 *
548 * Iterate over list of given type from current point, safe against
549 * removal of list entry.
550 */
551 #define list_for_each_entry_safe_from(pos, n, head, member) \
552 for (n = list_next_entry(pos, member); \
553 &pos->member != (head); \
554 pos = n, n = list_next_entry(n, member))
555
556 /**
557 * list_for_each_entry_safe_reverse - iterate backwards over list safe against removal
558 * @pos: the type * to use as a loop cursor.
559 * @n: another type * to use as temporary storage
560 * @head: the head for your list.
561 * @member: the name of the list_struct within the struct.
562 *
563 * Iterate backwards over list of given type, safe against removal
564 * of list entry.
565 */
566 #define list_for_each_entry_safe_reverse(pos, n, head, member) \
567 for (pos = list_last_entry(head, typeof(*pos), member), \
568 n = list_prev_entry(pos, member); \
569 &pos->member != (head); \
570 pos = n, n = list_prev_entry(n, member))
571
572 /**
573 * list_safe_reset_next - reset a stale list_for_each_entry_safe loop
574 * @pos: the loop cursor used in the list_for_each_entry_safe loop
575 * @n: temporary storage used in list_for_each_entry_safe
576 * @member: the name of the list_struct within the struct.
577 *
578 * list_safe_reset_next is not safe to use in general if the list may be
579 * modified concurrently (eg. the lock is dropped in the loop body). An
580 * exception to this is if the cursor element (pos) is pinned in the list,
581 * and list_safe_reset_next is called after re-taking the lock and before
582 * completing the current iteration of the loop body.
583 */
584 #define list_safe_reset_next(pos, n, member) \
585 n = list_next_entry(pos, member)
586
587 /*
588 * Double linked lists with a single pointer list head.
589 * Mostly useful for hash tables where the two pointer list head is
590 * too wasteful.
591 * You lose the ability to access the tail in O(1).
592 */
593
594 #define HLIST_HEAD_INIT { .first = NULL }
595 #define HLIST_HEAD(name) struct hlist_head name = { .first = NULL }
596 #define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL)
597 static inline void INIT_HLIST_NODE(struct hlist_node *h)
598 {
599 h->next = NULL;
600 h->pprev = NULL;
601 }
602
603 static inline int hlist_unhashed(const struct hlist_node *h)
604 {
605 return !h->pprev;
606 }
607
608 static inline int hlist_empty(const struct hlist_head *h)
609 {
610 return !h->first;
611 }
612
613 static inline void __hlist_del(struct hlist_node *n)
614 {
615 struct hlist_node *next = n->next;
616 struct hlist_node **pprev = n->pprev;
617 *pprev = next;
618 if (next)
619 next->pprev = pprev;
620 }
621
622 static inline void hlist_del(struct hlist_node *n)
623 {
624 __hlist_del(n);
625 n->next = LIST_POISON1;
626 n->pprev = LIST_POISON2;
627 }
628
629 static inline void hlist_del_init(struct hlist_node *n)
630 {
631 if (!hlist_unhashed(n)) {
632 __hlist_del(n);
633 INIT_HLIST_NODE(n);
634 }
635 }
636
637 static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
638 {
639 struct hlist_node *first = h->first;
640 n->next = first;
641 if (first)
642 first->pprev = &n->next;
643 h->first = n;
644 n->pprev = &h->first;
645 }
646
647 /* next must be != NULL */
648 static inline void hlist_add_before(struct hlist_node *n,
649 struct hlist_node *next)
650 {
651 n->pprev = next->pprev;
652 n->next = next;
653 next->pprev = &n->next;
654 *(n->pprev) = n;
655 }
656
657 static inline void hlist_add_after(struct hlist_node *n,
658 struct hlist_node *next)
659 {
660 next->next = n->next;
661 n->next = next;
662 next->pprev = &n->next;
663
664 if(next->next)
665 next->next->pprev = &next->next;
666 }
667
668 /* after that we'll appear to be on some hlist and hlist_del will work */
669 static inline void hlist_add_fake(struct hlist_node *n)
670 {
671 n->pprev = &n->next;
672 }
673
674 /*
675 * Move a list from one list head to another. Fixup the pprev
676 * reference of the first entry if it exists.
677 */
678 static inline void hlist_move_list(struct hlist_head *old,
679 struct hlist_head *new)
680 {
681 new->first = old->first;
682 if (new->first)
683 new->first->pprev = &new->first;
684 old->first = NULL;
685 }
686
687 #define hlist_entry(ptr, type, member) container_of(ptr,type,member)
688
689 #define hlist_for_each(pos, head) \
690 for (pos = (head)->first; pos ; pos = pos->next)
691
692 #define hlist_for_each_safe(pos, n, head) \
693 for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
694 pos = n)
695
696 #define hlist_entry_safe(ptr, type, member) \
697 ({ typeof(ptr) ____ptr = (ptr); \
698 ____ptr ? hlist_entry(____ptr, type, member) : NULL; \
699 })
700
701 /**
702 * hlist_for_each_entry - iterate over list of given type
703 * @pos: the type * to use as a loop cursor.
704 * @head: the head for your list.
705 * @member: the name of the hlist_node within the struct.
706 */
707 #define hlist_for_each_entry(pos, head, member) \
708 for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\
709 pos; \
710 pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
711
712 /**
713 * hlist_for_each_entry_continue - iterate over a hlist continuing after current point
714 * @pos: the type * to use as a loop cursor.
715 * @member: the name of the hlist_node within the struct.
716 */
717 #define hlist_for_each_entry_continue(pos, member) \
718 for (pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member);\
719 pos; \
720 pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
721
722 /**
723 * hlist_for_each_entry_from - iterate over a hlist continuing from current point
724 * @pos: the type * to use as a loop cursor.
725 * @member: the name of the hlist_node within the struct.
726 */
727 #define hlist_for_each_entry_from(pos, member) \
728 for (; pos; \
729 pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
730
731 /**
732 * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry
733 * @pos: the type * to use as a loop cursor.
734 * @n: another &struct hlist_node to use as temporary storage
735 * @head: the head for your list.
736 * @member: the name of the hlist_node within the struct.
737 */
738 #define hlist_for_each_entry_safe(pos, n, head, member) \
739 for (pos = hlist_entry_safe((head)->first, typeof(*pos), member);\
740 pos && ({ n = pos->member.next; 1; }); \
741 pos = hlist_entry_safe(n, typeof(*pos), member))
742
743 #endif 1 /*
2 * INET An implementation of the TCP/IP protocol suite for the LINUX
3 * operating system. INET is implemented using the BSD Socket
4 * interface as the means of communication with the user level.
5 *
6 * Definitions for the Interfaces handler.
7 *
8 * Version: @(#)dev.h 1.0.10 08/12/93
9 *
10 * Authors: Ross Biro
11 * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
12 * Corey Minyard <wf-rch!minyard@relay.EU.net>
13 * Donald J. Becker, <becker@cesdis.gsfc.nasa.gov>
14 * Alan Cox, <alan@lxorguk.ukuu.org.uk>
15 * Bjorn Ekwall. <bj0rn@blox.se>
16 * Pekka Riikonen <priikone@poseidon.pspt.fi>
17 *
18 * This program is free software; you can redistribute it and/or
19 * modify it under the terms of the GNU General Public License
20 * as published by the Free Software Foundation; either version
21 * 2 of the License, or (at your option) any later version.
22 *
23 * Moved to /usr/include/linux for NET3
24 */
25 #ifndef _LINUX_NETDEVICE_H
26 #define _LINUX_NETDEVICE_H
27
28 #include <linux/pm_qos.h>
29 #include <linux/timer.h>
30 #include <linux/bug.h>
31 #include <linux/delay.h>
32 #include <linux/atomic.h>
33 #include <asm/cache.h>
34 #include <asm/byteorder.h>
35
36 #include <linux/percpu.h>
37 #include <linux/rculist.h>
38 #include <linux/dmaengine.h>
39 #include <linux/workqueue.h>
40 #include <linux/dynamic_queue_limits.h>
41
42 #include <linux/ethtool.h>
43 #include <net/net_namespace.h>
44 #include <net/dsa.h>
45 #ifdef CONFIG_DCB
46 #include <net/dcbnl.h>
47 #endif
48 #include <net/netprio_cgroup.h>
49
50 #include <linux/netdev_features.h>
51 #include <linux/neighbour.h>
52 #include <uapi/linux/netdevice.h>
53
54 struct netpoll_info;
55 struct device;
56 struct phy_device;
57 /* 802.11 specific */
58 struct wireless_dev;
59 /* source back-compat hooks */
60 #define SET_ETHTOOL_OPS(netdev,ops) \
61 ( (netdev)->ethtool_ops = (ops) )
62
63 void netdev_set_default_ethtool_ops(struct net_device *dev,
64 const struct ethtool_ops *ops);
65
66 /* hardware address assignment types */
67 #define NET_ADDR_PERM 0 /* address is permanent (default) */
68 #define NET_ADDR_RANDOM 1 /* address is generated randomly */
69 #define NET_ADDR_STOLEN 2 /* address is stolen from other device */
70 #define NET_ADDR_SET 3 /* address is set using
71 * dev_set_mac_address() */
72
73 /* Backlog congestion levels */
74 #define NET_RX_SUCCESS 0 /* keep 'em coming, baby */
75 #define NET_RX_DROP 1 /* packet dropped */
76
77 /*
78 * Transmit return codes: transmit return codes originate from three different
79 * namespaces:
80 *
81 * - qdisc return codes
82 * - driver transmit return codes
83 * - errno values
84 *
85 * Drivers are allowed to return any one of those in their hard_start_xmit()
86 * function. Real network devices commonly used with qdiscs should only return
87 * the driver transmit return codes though - when qdiscs are used, the actual
88 * transmission happens asynchronously, so the value is not propagated to
89 * higher layers. Virtual network devices transmit synchronously, in this case
90 * the driver transmit return codes are consumed by dev_queue_xmit(), all
91 * others are propagated to higher layers.
92 */
93
94 /* qdisc ->enqueue() return codes. */
95 #define NET_XMIT_SUCCESS 0x00
96 #define NET_XMIT_DROP 0x01 /* skb dropped */
97 #define NET_XMIT_CN 0x02 /* congestion notification */
98 #define NET_XMIT_POLICED 0x03 /* skb is shot by police */
99 #define NET_XMIT_MASK 0x0f /* qdisc flags in net/sch_generic.h */
100
101 /* NET_XMIT_CN is special. It does not guarantee that this packet is lost. It
102 * indicates that the device will soon be dropping packets, or already drops
103 * some packets of the same priority; prompting us to send less aggressively. */
104 #define net_xmit_eval(e) ((e) == NET_XMIT_CN ? 0 : (e))
105 #define net_xmit_errno(e) ((e) != NET_XMIT_CN ? -ENOBUFS : 0)
106
107 /* Driver transmit return codes */
108 #define NETDEV_TX_MASK 0xf0
109
110 enum netdev_tx {
111 __NETDEV_TX_MIN = INT_MIN, /* make sure enum is signed */
112 NETDEV_TX_OK = 0x00, /* driver took care of packet */
113 NETDEV_TX_BUSY = 0x10, /* driver tx path was busy*/
114 NETDEV_TX_LOCKED = 0x20, /* driver tx lock was already taken */
115 };
116 typedef enum netdev_tx netdev_tx_t;
117
118 /*
119 * Current order: NETDEV_TX_MASK > NET_XMIT_MASK >= 0 is significant;
120 * hard_start_xmit() return < NET_XMIT_MASK means skb was consumed.
121 */
122 static inline bool dev_xmit_complete(int rc)
123 {
124 /*
125 * Positive cases with an skb consumed by a driver:
126 * - successful transmission (rc == NETDEV_TX_OK)
127 * - error while transmitting (rc < 0)
128 * - error while queueing to a different device (rc & NET_XMIT_MASK)
129 */
130 if (likely(rc < NET_XMIT_MASK))
131 return true;
132
133 return false;
134 }
135
136 /*
137 * Compute the worst case header length according to the protocols
138 * used.
139 */
140
141 #if defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25)
142 # if defined(CONFIG_MAC80211_MESH)
143 # define LL_MAX_HEADER 128
144 # else
145 # define LL_MAX_HEADER 96
146 # endif
147 #else
148 # define LL_MAX_HEADER 32
149 #endif
150
151 #if !IS_ENABLED(CONFIG_NET_IPIP) && !IS_ENABLED(CONFIG_NET_IPGRE) && \
152 !IS_ENABLED(CONFIG_IPV6_SIT) && !IS_ENABLED(CONFIG_IPV6_TUNNEL)
153 #define MAX_HEADER LL_MAX_HEADER
154 #else
155 #define MAX_HEADER (LL_MAX_HEADER + 48)
156 #endif
157
158 /*
159 * Old network device statistics. Fields are native words
160 * (unsigned long) so they can be read and written atomically.
161 */
162
163 struct net_device_stats {
164 unsigned long rx_packets;
165 unsigned long tx_packets;
166 unsigned long rx_bytes;
167 unsigned long tx_bytes;
168 unsigned long rx_errors;
169 unsigned long tx_errors;
170 unsigned long rx_dropped;
171 unsigned long tx_dropped;
172 unsigned long multicast;
173 unsigned long collisions;
174 unsigned long rx_length_errors;
175 unsigned long rx_over_errors;
176 unsigned long rx_crc_errors;
177 unsigned long rx_frame_errors;
178 unsigned long rx_fifo_errors;
179 unsigned long rx_missed_errors;
180 unsigned long tx_aborted_errors;
181 unsigned long tx_carrier_errors;
182 unsigned long tx_fifo_errors;
183 unsigned long tx_heartbeat_errors;
184 unsigned long tx_window_errors;
185 unsigned long rx_compressed;
186 unsigned long tx_compressed;
187 };
188
189
190 #include <linux/cache.h>
191 #include <linux/skbuff.h>
192
193 #ifdef CONFIG_RPS
194 #include <linux/static_key.h>
195 extern struct static_key rps_needed;
196 #endif
197
198 struct neighbour;
199 struct neigh_parms;
200 struct sk_buff;
201
202 struct netdev_hw_addr {
203 struct list_head list;
204 unsigned char addr[MAX_ADDR_LEN];
205 unsigned char type;
206 #define NETDEV_HW_ADDR_T_LAN 1
207 #define NETDEV_HW_ADDR_T_SAN 2
208 #define NETDEV_HW_ADDR_T_SLAVE 3
209 #define NETDEV_HW_ADDR_T_UNICAST 4
210 #define NETDEV_HW_ADDR_T_MULTICAST 5
211 bool global_use;
212 int sync_cnt;
213 int refcount;
214 int synced;
215 struct rcu_head rcu_head;
216 };
217
218 struct netdev_hw_addr_list {
219 struct list_head list;
220 int count;
221 };
222
223 #define netdev_hw_addr_list_count(l) ((l)->count)
224 #define netdev_hw_addr_list_empty(l) (netdev_hw_addr_list_count(l) == 0)
225 #define netdev_hw_addr_list_for_each(ha, l) \
226 list_for_each_entry(ha, &(l)->list, list)
227
228 #define netdev_uc_count(dev) netdev_hw_addr_list_count(&(dev)->uc)
229 #define netdev_uc_empty(dev) netdev_hw_addr_list_empty(&(dev)->uc)
230 #define netdev_for_each_uc_addr(ha, dev) \
231 netdev_hw_addr_list_for_each(ha, &(dev)->uc)
232
233 #define netdev_mc_count(dev) netdev_hw_addr_list_count(&(dev)->mc)
234 #define netdev_mc_empty(dev) netdev_hw_addr_list_empty(&(dev)->mc)
235 #define netdev_for_each_mc_addr(ha, dev) \
236 netdev_hw_addr_list_for_each(ha, &(dev)->mc)
237
238 struct hh_cache {
239 u16 hh_len;
240 u16 __pad;
241 seqlock_t hh_lock;
242
243 /* cached hardware header; allow for machine alignment needs. */
244 #define HH_DATA_MOD 16
245 #define HH_DATA_OFF(__len) \
246 (HH_DATA_MOD - (((__len - 1) & (HH_DATA_MOD - 1)) + 1))
247 #define HH_DATA_ALIGN(__len) \
248 (((__len)+(HH_DATA_MOD-1))&~(HH_DATA_MOD - 1))
249 unsigned long hh_data[HH_DATA_ALIGN(LL_MAX_HEADER) / sizeof(long)];
250 };
251
252 /* Reserve HH_DATA_MOD byte aligned hard_header_len, but at least that much.
253 * Alternative is:
254 * dev->hard_header_len ? (dev->hard_header_len +
255 * (HH_DATA_MOD - 1)) & ~(HH_DATA_MOD - 1) : 0
256 *
257 * We could use other alignment values, but we must maintain the
258 * relationship HH alignment <= LL alignment.
259 */
260 #define LL_RESERVED_SPACE(dev) \
261 ((((dev)->hard_header_len+(dev)->needed_headroom)&~(HH_DATA_MOD - 1)) + HH_DATA_MOD)
262 #define LL_RESERVED_SPACE_EXTRA(dev,extra) \
263 ((((dev)->hard_header_len+(dev)->needed_headroom+(extra))&~(HH_DATA_MOD - 1)) + HH_DATA_MOD)
264
265 struct header_ops {
266 int (*create) (struct sk_buff *skb, struct net_device *dev,
267 unsigned short type, const void *daddr,
268 const void *saddr, unsigned int len);
269 int (*parse)(const struct sk_buff *skb, unsigned char *haddr);
270 int (*rebuild)(struct sk_buff *skb);
271 int (*cache)(const struct neighbour *neigh, struct hh_cache *hh, __be16 type);
272 void (*cache_update)(struct hh_cache *hh,
273 const struct net_device *dev,
274 const unsigned char *haddr);
275 };
276
277 /* These flag bits are private to the generic network queueing
278 * layer, they may not be explicitly referenced by any other
279 * code.
280 */
281
282 enum netdev_state_t {
283 __LINK_STATE_START,
284 __LINK_STATE_PRESENT,
285 __LINK_STATE_NOCARRIER,
286 __LINK_STATE_LINKWATCH_PENDING,
287 __LINK_STATE_DORMANT,
288 };
289
290
291 /*
292 * This structure holds at boot time configured netdevice settings. They
293 * are then used in the device probing.
294 */
295 struct netdev_boot_setup {
296 char name[IFNAMSIZ];
297 struct ifmap map;
298 };
299 #define NETDEV_BOOT_SETUP_MAX 8
300
301 int __init netdev_boot_setup(char *str);
302
303 /*
304 * Structure for NAPI scheduling similar to tasklet but with weighting
305 */
306 struct napi_struct {
307 /* The poll_list must only be managed by the entity which
308 * changes the state of the NAPI_STATE_SCHED bit. This means
309 * whoever atomically sets that bit can add this napi_struct
310 * to the per-cpu poll_list, and whoever clears that bit
311 * can remove from the list right before clearing the bit.
312 */
313 struct list_head poll_list;
314
315 unsigned long state;
316 int weight;
317 unsigned int gro_count;
318 int (*poll)(struct napi_struct *, int);
319 #ifdef CONFIG_NETPOLL
320 spinlock_t poll_lock;
321 int poll_owner;
322 #endif
323 struct net_device *dev;
324 struct sk_buff *gro_list;
325 struct sk_buff *skb;
326 struct list_head dev_list;
327 struct hlist_node napi_hash_node;
328 unsigned int napi_id;
329 };
330
331 enum {
332 NAPI_STATE_SCHED, /* Poll is scheduled */
333 NAPI_STATE_DISABLE, /* Disable pending */
334 NAPI_STATE_NPSVC, /* Netpoll - don't dequeue from poll_list */
335 NAPI_STATE_HASHED, /* In NAPI hash */
336 };
337
338 enum gro_result {
339 GRO_MERGED,
340 GRO_MERGED_FREE,
341 GRO_HELD,
342 GRO_NORMAL,
343 GRO_DROP,
344 };
345 typedef enum gro_result gro_result_t;
346
347 /*
348 * enum rx_handler_result - Possible return values for rx_handlers.
349 * @RX_HANDLER_CONSUMED: skb was consumed by rx_handler, do not process it
350 * further.
351 * @RX_HANDLER_ANOTHER: Do another round in receive path. This is indicated in
352 * case skb->dev was changed by rx_handler.
353 * @RX_HANDLER_EXACT: Force exact delivery, no wildcard.
354 * @RX_HANDLER_PASS: Do nothing, passe the skb as if no rx_handler was called.
355 *
356 * rx_handlers are functions called from inside __netif_receive_skb(), to do
357 * special processing of the skb, prior to delivery to protocol handlers.
358 *
359 * Currently, a net_device can only have a single rx_handler registered. Trying
360 * to register a second rx_handler will return -EBUSY.
361 *
362 * To register a rx_handler on a net_device, use netdev_rx_handler_register().
363 * To unregister a rx_handler on a net_device, use
364 * netdev_rx_handler_unregister().
365 *
366 * Upon return, rx_handler is expected to tell __netif_receive_skb() what to
367 * do with the skb.
368 *
369 * If the rx_handler consumed to skb in some way, it should return
370 * RX_HANDLER_CONSUMED. This is appropriate when the rx_handler arranged for
371 * the skb to be delivered in some other ways.
372 *
373 * If the rx_handler changed skb->dev, to divert the skb to another
374 * net_device, it should return RX_HANDLER_ANOTHER. The rx_handler for the
375 * new device will be called if it exists.
376 *
377 * If the rx_handler consider the skb should be ignored, it should return
378 * RX_HANDLER_EXACT. The skb will only be delivered to protocol handlers that
379 * are registered on exact device (ptype->dev == skb->dev).
380 *
381 * If the rx_handler didn't changed skb->dev, but want the skb to be normally
382 * delivered, it should return RX_HANDLER_PASS.
383 *
384 * A device without a registered rx_handler will behave as if rx_handler
385 * returned RX_HANDLER_PASS.
386 */
387
388 enum rx_handler_result {
389 RX_HANDLER_CONSUMED,
390 RX_HANDLER_ANOTHER,
391 RX_HANDLER_EXACT,
392 RX_HANDLER_PASS,
393 };
394 typedef enum rx_handler_result rx_handler_result_t;
395 typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **pskb);
396
397 void __napi_schedule(struct napi_struct *n);
398
399 static inline bool napi_disable_pending(struct napi_struct *n)
400 {
401 return test_bit(NAPI_STATE_DISABLE, &n->state);
402 }
403
404 /**
405 * napi_schedule_prep - check if napi can be scheduled
406 * @n: napi context
407 *
408 * Test if NAPI routine is already running, and if not mark
409 * it as running. This is used as a condition variable
410 * insure only one NAPI poll instance runs. We also make
411 * sure there is no pending NAPI disable.
412 */
413 static inline bool napi_schedule_prep(struct napi_struct *n)
414 {
415 return !napi_disable_pending(n) &&
416 !test_and_set_bit(NAPI_STATE_SCHED, &n->state);
417 }
418
419 /**
420 * napi_schedule - schedule NAPI poll
421 * @n: napi context
422 *
423 * Schedule NAPI poll routine to be called if it is not already
424 * running.
425 */
426 static inline void napi_schedule(struct napi_struct *n)
427 {
428 if (napi_schedule_prep(n))
429 __napi_schedule(n);
430 }
431
432 /* Try to reschedule poll. Called by dev->poll() after napi_complete(). */
433 static inline bool napi_reschedule(struct napi_struct *napi)
434 {
435 if (napi_schedule_prep(napi)) {
436 __napi_schedule(napi);
437 return true;
438 }
439 return false;
440 }
441
442 /**
443 * napi_complete - NAPI processing complete
444 * @n: napi context
445 *
446 * Mark NAPI processing as complete.
447 */
448 void __napi_complete(struct napi_struct *n);
449 void napi_complete(struct napi_struct *n);
450
451 /**
452 * napi_by_id - lookup a NAPI by napi_id
453 * @napi_id: hashed napi_id
454 *
455 * lookup @napi_id in napi_hash table
456 * must be called under rcu_read_lock()
457 */
458 struct napi_struct *napi_by_id(unsigned int napi_id);
459
460 /**
461 * napi_hash_add - add a NAPI to global hashtable
462 * @napi: napi context
463 *
464 * generate a new napi_id and store a @napi under it in napi_hash
465 */
466 void napi_hash_add(struct napi_struct *napi);
467
468 /**
469 * napi_hash_del - remove a NAPI from global table
470 * @napi: napi context
471 *
472 * Warning: caller must observe rcu grace period
473 * before freeing memory containing @napi
474 */
475 void napi_hash_del(struct napi_struct *napi);
476
477 /**
478 * napi_disable - prevent NAPI from scheduling
479 * @n: napi context
480 *
481 * Stop NAPI from being scheduled on this context.
482 * Waits till any outstanding processing completes.
483 */
484 static inline void napi_disable(struct napi_struct *n)
485 {
486 might_sleep();
487 set_bit(NAPI_STATE_DISABLE, &n->state);
488 while (test_and_set_bit(NAPI_STATE_SCHED, &n->state))
489 msleep(1);
490 clear_bit(NAPI_STATE_DISABLE, &n->state);
491 }
492
493 /**
494 * napi_enable - enable NAPI scheduling
495 * @n: napi context
496 *
497 * Resume NAPI from being scheduled on this context.
498 * Must be paired with napi_disable.
499 */
500 static inline void napi_enable(struct napi_struct *n)
501 {
502 BUG_ON(!test_bit(NAPI_STATE_SCHED, &n->state));
503 smp_mb__before_clear_bit();
504 clear_bit(NAPI_STATE_SCHED, &n->state);
505 }
506
507 #ifdef CONFIG_SMP
508 /**
509 * napi_synchronize - wait until NAPI is not running
510 * @n: napi context
511 *
512 * Wait until NAPI is done being scheduled on this context.
513 * Waits till any outstanding processing completes but
514 * does not disable future activations.
515 */
516 static inline void napi_synchronize(const struct napi_struct *n)
517 {
518 while (test_bit(NAPI_STATE_SCHED, &n->state))
519 msleep(1);
520 }
521 #else
522 # define napi_synchronize(n) barrier()
523 #endif
524
525 enum netdev_queue_state_t {
526 __QUEUE_STATE_DRV_XOFF,
527 __QUEUE_STATE_STACK_XOFF,
528 __QUEUE_STATE_FROZEN,
529 #define QUEUE_STATE_ANY_XOFF ((1 << __QUEUE_STATE_DRV_XOFF) | \
530 (1 << __QUEUE_STATE_STACK_XOFF))
531 #define QUEUE_STATE_ANY_XOFF_OR_FROZEN (QUEUE_STATE_ANY_XOFF | \
532 (1 << __QUEUE_STATE_FROZEN))
533 };
534 /*
535 * __QUEUE_STATE_DRV_XOFF is used by drivers to stop the transmit queue. The
536 * netif_tx_* functions below are used to manipulate this flag. The
537 * __QUEUE_STATE_STACK_XOFF flag is used by the stack to stop the transmit
538 * queue independently. The netif_xmit_*stopped functions below are called
539 * to check if the queue has been stopped by the driver or stack (either
540 * of the XOFF bits are set in the state). Drivers should not need to call
541 * netif_xmit*stopped functions, they should only be using netif_tx_*.
542 */
543
544 struct netdev_queue {
545 /*
546 * read mostly part
547 */
548 struct net_device *dev;
549 struct Qdisc *qdisc;
550 struct Qdisc *qdisc_sleeping;
551 #ifdef CONFIG_SYSFS
552 struct kobject kobj;
553 #endif
554 #if defined(CONFIG_XPS) && defined(CONFIG_NUMA)
555 int numa_node;
556 #endif
557 /*
558 * write mostly part
559 */
560 spinlock_t _xmit_lock ____cacheline_aligned_in_smp;
561 int xmit_lock_owner;
562 /*
563 * please use this field instead of dev->trans_start
564 */
565 unsigned long trans_start;
566
567 /*
568 * Number of TX timeouts for this queue
569 * (/sys/class/net/DEV/Q/trans_timeout)
570 */
571 unsigned long trans_timeout;
572
573 unsigned long state;
574
575 #ifdef CONFIG_BQL
576 struct dql dql;
577 #endif
578 } ____cacheline_aligned_in_smp;
579
580 static inline int netdev_queue_numa_node_read(const struct netdev_queue *q)
581 {
582 #if defined(CONFIG_XPS) && defined(CONFIG_NUMA)
583 return q->numa_node;
584 #else
585 return NUMA_NO_NODE;
586 #endif
587 }
588
589 static inline void netdev_queue_numa_node_write(struct netdev_queue *q, int node)
590 {
591 #if defined(CONFIG_XPS) && defined(CONFIG_NUMA)
592 q->numa_node = node;
593 #endif
594 }
595
596 #ifdef CONFIG_RPS
597 /*
598 * This structure holds an RPS map which can be of variable length. The
599 * map is an array of CPUs.
600 */
601 struct rps_map {
602 unsigned int len;
603 struct rcu_head rcu;
604 u16 cpus[0];
605 };
606 #define RPS_MAP_SIZE(_num) (sizeof(struct rps_map) + ((_num) * sizeof(u16)))
607
608 /*
609 * The rps_dev_flow structure contains the mapping of a flow to a CPU, the
610 * tail pointer for that CPU's input queue at the time of last enqueue, and
611 * a hardware filter index.
612 */
613 struct rps_dev_flow {
614 u16 cpu;
615 u16 filter;
616 unsigned int last_qtail;
617 };
618 #define RPS_NO_FILTER 0xffff
619
620 /*
621 * The rps_dev_flow_table structure contains a table of flow mappings.
622 */
623 struct rps_dev_flow_table {
624 unsigned int mask;
625 struct rcu_head rcu;
626 struct rps_dev_flow flows[0];
627 };
628 #define RPS_DEV_FLOW_TABLE_SIZE(_num) (sizeof(struct rps_dev_flow_table) + \
629 ((_num) * sizeof(struct rps_dev_flow)))
630
631 /*
632 * The rps_sock_flow_table contains mappings of flows to the last CPU
633 * on which they were processed by the application (set in recvmsg).
634 */
635 struct rps_sock_flow_table {
636 unsigned int mask;
637 u16 ents[0];
638 };
639 #define RPS_SOCK_FLOW_TABLE_SIZE(_num) (sizeof(struct rps_sock_flow_table) + \
640 ((_num) * sizeof(u16)))
641
642 #define RPS_NO_CPU 0xffff
643
644 static inline void rps_record_sock_flow(struct rps_sock_flow_table *table,
645 u32 hash)
646 {
647 if (table && hash) {
648 unsigned int cpu, index = hash & table->mask;
649
650 /* We only give a hint, preemption can change cpu under us */
651 cpu = raw_smp_processor_id();
652
653 if (table->ents[index] != cpu)
654 table->ents[index] = cpu;
655 }
656 }
657
658 static inline void rps_reset_sock_flow(struct rps_sock_flow_table *table,
659 u32 hash)
660 {
661 if (table && hash)
662 table->ents[hash & table->mask] = RPS_NO_CPU;
663 }
664
665 extern struct rps_sock_flow_table __rcu *rps_sock_flow_table;
666
667 #ifdef CONFIG_RFS_ACCEL
668 bool rps_may_expire_flow(struct net_device *dev, u16 rxq_index, u32 flow_id,
669 u16 filter_id);
670 #endif
671 #endif /* CONFIG_RPS */
672
673 /* This structure contains an instance of an RX queue. */
674 struct netdev_rx_queue {
675 #ifdef CONFIG_RPS
676 struct rps_map __rcu *rps_map;
677 struct rps_dev_flow_table __rcu *rps_flow_table;
678 #endif
679 struct kobject kobj;
680 struct net_device *dev;
681 } ____cacheline_aligned_in_smp;
682
683 /*
684 * RX queue sysfs structures and functions.
685 */
686 struct rx_queue_attribute {
687 struct attribute attr;
688 ssize_t (*show)(struct netdev_rx_queue *queue,
689 struct rx_queue_attribute *attr, char *buf);
690 ssize_t (*store)(struct netdev_rx_queue *queue,
691 struct rx_queue_attribute *attr, const char *buf, size_t len);
692 };
693
694 #ifdef CONFIG_XPS
695 /*
696 * This structure holds an XPS map which can be of variable length. The
697 * map is an array of queues.
698 */
699 struct xps_map {
700 unsigned int len;
701 unsigned int alloc_len;
702 struct rcu_head rcu;
703 u16 queues[0];
704 };
705 #define XPS_MAP_SIZE(_num) (sizeof(struct xps_map) + ((_num) * sizeof(u16)))
706 #define XPS_MIN_MAP_ALLOC ((L1_CACHE_BYTES - sizeof(struct xps_map)) \
707 / sizeof(u16))
708
709 /*
710 * This structure holds all XPS maps for device. Maps are indexed by CPU.
711 */
712 struct xps_dev_maps {
713 struct rcu_head rcu;
714 struct xps_map __rcu *cpu_map[0];
715 };
716 #define XPS_DEV_MAPS_SIZE (sizeof(struct xps_dev_maps) + \
717 (nr_cpu_ids * sizeof(struct xps_map *)))
718 #endif /* CONFIG_XPS */
719
720 #define TC_MAX_QUEUE 16
721 #define TC_BITMASK 15
722 /* HW offloaded queuing disciplines txq count and offset maps */
723 struct netdev_tc_txq {
724 u16 count;
725 u16 offset;
726 };
727
728 #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
729 /*
730 * This structure is to hold information about the device
731 * configured to run FCoE protocol stack.
732 */
733 struct netdev_fcoe_hbainfo {
734 char manufacturer[64];
735 char serial_number[64];
736 char hardware_version[64];
737 char driver_version[64];
738 char optionrom_version[64];
739 char firmware_version[64];
740 char model[256];
741 char model_description[256];
742 };
743 #endif
744
745 #define MAX_PHYS_PORT_ID_LEN 32
746
747 /* This structure holds a unique identifier to identify the
748 * physical port used by a netdevice.
749 */
750 struct netdev_phys_port_id {
751 unsigned char id[MAX_PHYS_PORT_ID_LEN];
752 unsigned char id_len;
753 };
754
755 typedef u16 (*select_queue_fallback_t)(struct net_device *dev,
756 struct sk_buff *skb);
757
758 /*
759 * This structure defines the management hooks for network devices.
760 * The following hooks can be defined; unless noted otherwise, they are
761 * optional and can be filled with a null pointer.
762 *
763 * int (*ndo_init)(struct net_device *dev);
764 * This function is called once when network device is registered.
765 * The network device can use this to any late stage initializaton
766 * or semantic validattion. It can fail with an error code which will
767 * be propogated back to register_netdev
768 *
769 * void (*ndo_uninit)(struct net_device *dev);
770 * This function is called when device is unregistered or when registration
771 * fails. It is not called if init fails.
772 *
773 * int (*ndo_open)(struct net_device *dev);
774 * This function is called when network device transistions to the up
775 * state.
776 *
777 * int (*ndo_stop)(struct net_device *dev);
778 * This function is called when network device transistions to the down
779 * state.
780 *
781 * netdev_tx_t (*ndo_start_xmit)(struct sk_buff *skb,
782 * struct net_device *dev);
783 * Called when a packet needs to be transmitted.
784 * Must return NETDEV_TX_OK , NETDEV_TX_BUSY.
785 * (can also return NETDEV_TX_LOCKED iff NETIF_F_LLTX)
786 * Required can not be NULL.
787 *
788 * u16 (*ndo_select_queue)(struct net_device *dev, struct sk_buff *skb,
789 * void *accel_priv, select_queue_fallback_t fallback);
790 * Called to decide which queue to when device supports multiple
791 * transmit queues.
792 *
793 * void (*ndo_change_rx_flags)(struct net_device *dev, int flags);
794 * This function is called to allow device receiver to make
795 * changes to configuration when multicast or promiscious is enabled.
796 *
797 * void (*ndo_set_rx_mode)(struct net_device *dev);
798 * This function is called device changes address list filtering.
799 * If driver handles unicast address filtering, it should set
800 * IFF_UNICAST_FLT to its priv_flags.
801 *
802 * int (*ndo_set_mac_address)(struct net_device *dev, void *addr);
803 * This function is called when the Media Access Control address
804 * needs to be changed. If this interface is not defined, the
805 * mac address can not be changed.
806 *
807 * int (*ndo_validate_addr)(struct net_device *dev);
808 * Test if Media Access Control address is valid for the device.
809 *
810 * int (*ndo_do_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd);
811 * Called when a user request an ioctl which can't be handled by
812 * the generic interface code. If not defined ioctl's return
813 * not supported error code.
814 *
815 * int (*ndo_set_config)(struct net_device *dev, struct ifmap *map);
816 * Used to set network devices bus interface parameters. This interface
817 * is retained for legacy reason, new devices should use the bus
818 * interface (PCI) for low level management.
819 *
820 * int (*ndo_change_mtu)(struct net_device *dev, int new_mtu);
821 * Called when a user wants to change the Maximum Transfer Unit
822 * of a device. If not defined, any request to change MTU will
823 * will return an error.
824 *
825 * void (*ndo_tx_timeout)(struct net_device *dev);
826 * Callback uses when the transmitter has not made any progress
827 * for dev->watchdog ticks.
828 *
829 * struct rtnl_link_stats64* (*ndo_get_stats64)(struct net_device *dev,
830 * struct rtnl_link_stats64 *storage);
831 * struct net_device_stats* (*ndo_get_stats)(struct net_device *dev);
832 * Called when a user wants to get the network device usage
833 * statistics. Drivers must do one of the following:
834 * 1. Define @ndo_get_stats64 to fill in a zero-initialised
835 * rtnl_link_stats64 structure passed by the caller.
836 * 2. Define @ndo_get_stats to update a net_device_stats structure
837 * (which should normally be dev->stats) and return a pointer to
838 * it. The structure may be changed asynchronously only if each
839 * field is written atomically.
840 * 3. Update dev->stats asynchronously and atomically, and define
841 * neither operation.
842 *
843 * int (*ndo_vlan_rx_add_vid)(struct net_device *dev, __be16 proto, u16t vid);
844 * If device support VLAN filtering this function is called when a
845 * VLAN id is registered.
846 *
847 * int (*ndo_vlan_rx_kill_vid)(struct net_device *dev, unsigned short vid);
848 * If device support VLAN filtering this function is called when a
849 * VLAN id is unregistered.
850 *
851 * void (*ndo_poll_controller)(struct net_device *dev);
852 *
853 * SR-IOV management functions.
854 * int (*ndo_set_vf_mac)(struct net_device *dev, int vf, u8* mac);
855 * int (*ndo_set_vf_vlan)(struct net_device *dev, int vf, u16 vlan, u8 qos);
856 * int (*ndo_set_vf_tx_rate)(struct net_device *dev, int vf, int rate);
857 * int (*ndo_set_vf_spoofchk)(struct net_device *dev, int vf, bool setting);
858 * int (*ndo_get_vf_config)(struct net_device *dev,
859 * int vf, struct ifla_vf_info *ivf);
860 * int (*ndo_set_vf_link_state)(struct net_device *dev, int vf, int link_state);
861 * int (*ndo_set_vf_port)(struct net_device *dev, int vf,
862 * struct nlattr *port[]);
863 * int (*ndo_get_vf_port)(struct net_device *dev, int vf, struct sk_buff *skb);
864 * int (*ndo_setup_tc)(struct net_device *dev, u8 tc)
865 * Called to setup 'tc' number of traffic classes in the net device. This
866 * is always called from the stack with the rtnl lock held and netif tx
867 * queues stopped. This allows the netdevice to perform queue management
868 * safely.
869 *
870 * Fiber Channel over Ethernet (FCoE) offload functions.
871 * int (*ndo_fcoe_enable)(struct net_device *dev);
872 * Called when the FCoE protocol stack wants to start using LLD for FCoE
873 * so the underlying device can perform whatever needed configuration or
874 * initialization to support acceleration of FCoE traffic.
875 *
876 * int (*ndo_fcoe_disable)(struct net_device *dev);
877 * Called when the FCoE protocol stack wants to stop using LLD for FCoE
878 * so the underlying device can perform whatever needed clean-ups to
879 * stop supporting acceleration of FCoE traffic.
880 *
881 * int (*ndo_fcoe_ddp_setup)(struct net_device *dev, u16 xid,
882 * struct scatterlist *sgl, unsigned int sgc);
883 * Called when the FCoE Initiator wants to initialize an I/O that
884 * is a possible candidate for Direct Data Placement (DDP). The LLD can
885 * perform necessary setup and returns 1 to indicate the device is set up
886 * successfully to perform DDP on this I/O, otherwise this returns 0.
887 *
888 * int (*ndo_fcoe_ddp_done)(struct net_device *dev, u16 xid);
889 * Called when the FCoE Initiator/Target is done with the DDPed I/O as
890 * indicated by the FC exchange id 'xid', so the underlying device can
891 * clean up and reuse resources for later DDP requests.
892 *
893 * int (*ndo_fcoe_ddp_target)(struct net_device *dev, u16 xid,
894 * struct scatterlist *sgl, unsigned int sgc);
895 * Called when the FCoE Target wants to initialize an I/O that
896 * is a possible candidate for Direct Data Placement (DDP). The LLD can
897 * perform necessary setup and returns 1 to indicate the device is set up
898 * successfully to perform DDP on this I/O, otherwise this returns 0.
899 *
900 * int (*ndo_fcoe_get_hbainfo)(struct net_device *dev,
901 * struct netdev_fcoe_hbainfo *hbainfo);
902 * Called when the FCoE Protocol stack wants information on the underlying
903 * device. This information is utilized by the FCoE protocol stack to
904 * register attributes with Fiber Channel management service as per the
905 * FC-GS Fabric Device Management Information(FDMI) specification.
906 *
907 * int (*ndo_fcoe_get_wwn)(struct net_device *dev, u64 *wwn, int type);
908 * Called when the underlying device wants to override default World Wide
909 * Name (WWN) generation mechanism in FCoE protocol stack to pass its own
910 * World Wide Port Name (WWPN) or World Wide Node Name (WWNN) to the FCoE
911 * protocol stack to use.
912 *
913 * RFS acceleration.
914 * int (*ndo_rx_flow_steer)(struct net_device *dev, const struct sk_buff *skb,
915 * u16 rxq_index, u32 flow_id);
916 * Set hardware filter for RFS. rxq_index is the target queue index;
917 * flow_id is a flow ID to be passed to rps_may_expire_flow() later.
918 * Return the filter ID on success, or a negative error code.
919 *
920 * Slave management functions (for bridge, bonding, etc).
921 * int (*ndo_add_slave)(struct net_device *dev, struct net_device *slave_dev);
922 * Called to make another netdev an underling.
923 *
924 * int (*ndo_del_slave)(struct net_device *dev, struct net_device *slave_dev);
925 * Called to release previously enslaved netdev.
926 *
927 * Feature/offload setting functions.
928 * netdev_features_t (*ndo_fix_features)(struct net_device *dev,
929 * netdev_features_t features);
930 * Adjusts the requested feature flags according to device-specific
931 * constraints, and returns the resulting flags. Must not modify
932 * the device state.
933 *
934 * int (*ndo_set_features)(struct net_device *dev, netdev_features_t features);
935 * Called to update device configuration to new features. Passed
936 * feature set might be less than what was returned by ndo_fix_features()).
937 * Must return >0 or -errno if it changed dev->features itself.
938 *
939 * int (*ndo_fdb_add)(struct ndmsg *ndm, struct nlattr *tb[],
940 * struct net_device *dev,
941 * const unsigned char *addr, u16 flags)
942 * Adds an FDB entry to dev for addr.
943 * int (*ndo_fdb_del)(struct ndmsg *ndm, struct nlattr *tb[],
944 * struct net_device *dev,
945 * const unsigned char *addr)
946 * Deletes the FDB entry from dev coresponding to addr.
947 * int (*ndo_fdb_dump)(struct sk_buff *skb, struct netlink_callback *cb,
948 * struct net_device *dev, int idx)
949 * Used to add FDB entries to dump requests. Implementers should add
950 * entries to skb and update idx with the number of entries.
951 *
952 * int (*ndo_bridge_setlink)(struct net_device *dev, struct nlmsghdr *nlh)
953 * int (*ndo_bridge_getlink)(struct sk_buff *skb, u32 pid, u32 seq,
954 * struct net_device *dev, u32 filter_mask)
955 *
956 * int (*ndo_change_carrier)(struct net_device *dev, bool new_carrier);
957 * Called to change device carrier. Soft-devices (like dummy, team, etc)
958 * which do not represent real hardware may define this to allow their
959 * userspace components to manage their virtual carrier state. Devices
960 * that determine carrier state from physical hardware properties (eg
961 * network cables) or protocol-dependent mechanisms (eg
962 * USB_CDC_NOTIFY_NETWORK_CONNECTION) should NOT implement this function.
963 *
964 * int (*ndo_get_phys_port_id)(struct net_device *dev,
965 * struct netdev_phys_port_id *ppid);
966 * Called to get ID of physical port of this device. If driver does
967 * not implement this, it is assumed that the hw is not able to have
968 * multiple net devices on single physical port.
969 *
970 * void (*ndo_add_vxlan_port)(struct net_device *dev,
971 * sa_family_t sa_family, __be16 port);
972 * Called by vxlan to notiy a driver about the UDP port and socket
973 * address family that vxlan is listnening to. It is called only when
974 * a new port starts listening. The operation is protected by the
975 * vxlan_net->sock_lock.
976 *
977 * void (*ndo_del_vxlan_port)(struct net_device *dev,
978 * sa_family_t sa_family, __be16 port);
979 * Called by vxlan to notify the driver about a UDP port and socket
980 * address family that vxlan is not listening to anymore. The operation
981 * is protected by the vxlan_net->sock_lock.
982 *
983 * void* (*ndo_dfwd_add_station)(struct net_device *pdev,
984 * struct net_device *dev)
985 * Called by upper layer devices to accelerate switching or other
986 * station functionality into hardware. 'pdev is the lowerdev
987 * to use for the offload and 'dev' is the net device that will
988 * back the offload. Returns a pointer to the private structure
989 * the upper layer will maintain.
990 * void (*ndo_dfwd_del_station)(struct net_device *pdev, void *priv)
991 * Called by upper layer device to delete the station created
992 * by 'ndo_dfwd_add_station'. 'pdev' is the net device backing
993 * the station and priv is the structure returned by the add
994 * operation.
995 * netdev_tx_t (*ndo_dfwd_start_xmit)(struct sk_buff *skb,
996 * struct net_device *dev,
997 * void *priv);
998 * Callback to use for xmit over the accelerated station. This
999 * is used in place of ndo_start_xmit on accelerated net
1000 * devices.
1001 */
1002 struct net_device_ops {
1003 int (*ndo_init)(struct net_device *dev);
1004 void (*ndo_uninit)(struct net_device *dev);
1005 int (*ndo_open)(struct net_device *dev);
1006 int (*ndo_stop)(struct net_device *dev);
1007 netdev_tx_t (*ndo_start_xmit) (struct sk_buff *skb,
1008 struct net_device *dev);
1009 u16 (*ndo_select_queue)(struct net_device *dev,
1010 struct sk_buff *skb,
1011 void *accel_priv,
1012 select_queue_fallback_t fallback);
1013 void (*ndo_change_rx_flags)(struct net_device *dev,
1014 int flags);
1015 void (*ndo_set_rx_mode)(struct net_device *dev);
1016 int (*ndo_set_mac_address)(struct net_device *dev,
1017 void *addr);
1018 int (*ndo_validate_addr)(struct net_device *dev);
1019 int (*ndo_do_ioctl)(struct net_device *dev,
1020 struct ifreq *ifr, int cmd);
1021 int (*ndo_set_config)(struct net_device *dev,
1022 struct ifmap *map);
1023 int (*ndo_change_mtu)(struct net_device *dev,
1024 int new_mtu);
1025 int (*ndo_neigh_setup)(struct net_device *dev,
1026 struct neigh_parms *);
1027 void (*ndo_tx_timeout) (struct net_device *dev);
1028
1029 struct rtnl_link_stats64* (*ndo_get_stats64)(struct net_device *dev,
1030 struct rtnl_link_stats64 *storage);
1031 struct net_device_stats* (*ndo_get_stats)(struct net_device *dev);
1032
1033 int (*ndo_vlan_rx_add_vid)(struct net_device *dev,
1034 __be16 proto, u16 vid);
1035 int (*ndo_vlan_rx_kill_vid)(struct net_device *dev,
1036 __be16 proto, u16 vid);
1037 #ifdef CONFIG_NET_POLL_CONTROLLER
1038 void (*ndo_poll_controller)(struct net_device *dev);
1039 int (*ndo_netpoll_setup)(struct net_device *dev,
1040 struct netpoll_info *info,
1041 gfp_t gfp);
1042 void (*ndo_netpoll_cleanup)(struct net_device *dev);
1043 #endif
1044 #ifdef CONFIG_NET_RX_BUSY_POLL
1045 int (*ndo_busy_poll)(struct napi_struct *dev);
1046 #endif
1047 int (*ndo_set_vf_mac)(struct net_device *dev,
1048 int queue, u8 *mac);
1049 int (*ndo_set_vf_vlan)(struct net_device *dev,
1050 int queue, u16 vlan, u8 qos);
1051 int (*ndo_set_vf_tx_rate)(struct net_device *dev,
1052 int vf, int rate);
1053 int (*ndo_set_vf_spoofchk)(struct net_device *dev,
1054 int vf, bool setting);
1055 int (*ndo_get_vf_config)(struct net_device *dev,
1056 int vf,
1057 struct ifla_vf_info *ivf);
1058 int (*ndo_set_vf_link_state)(struct net_device *dev,
1059 int vf, int link_state);
1060 int (*ndo_set_vf_port)(struct net_device *dev,
1061 int vf,
1062 struct nlattr *port[]);
1063 int (*ndo_get_vf_port)(struct net_device *dev,
1064 int vf, struct sk_buff *skb);
1065 int (*ndo_setup_tc)(struct net_device *dev, u8 tc);
1066 #if IS_ENABLED(CONFIG_FCOE)
1067 int (*ndo_fcoe_enable)(struct net_device *dev);
1068 int (*ndo_fcoe_disable)(struct net_device *dev);
1069 int (*ndo_fcoe_ddp_setup)(struct net_device *dev,
1070 u16 xid,
1071 struct scatterlist *sgl,
1072 unsigned int sgc);
1073 int (*ndo_fcoe_ddp_done)(struct net_device *dev,
1074 u16 xid);
1075 int (*ndo_fcoe_ddp_target)(struct net_device *dev,
1076 u16 xid,
1077 struct scatterlist *sgl,
1078 unsigned int sgc);
1079 int (*ndo_fcoe_get_hbainfo)(struct net_device *dev,
1080 struct netdev_fcoe_hbainfo *hbainfo);
1081 #endif
1082
1083 #if IS_ENABLED(CONFIG_LIBFCOE)
1084 #define NETDEV_FCOE_WWNN 0
1085 #define NETDEV_FCOE_WWPN 1
1086 int (*ndo_fcoe_get_wwn)(struct net_device *dev,
1087 u64 *wwn, int type);
1088 #endif
1089
1090 #ifdef CONFIG_RFS_ACCEL
1091 int (*ndo_rx_flow_steer)(struct net_device *dev,
1092 const struct sk_buff *skb,
1093 u16 rxq_index,
1094 u32 flow_id);
1095 #endif
1096 int (*ndo_add_slave)(struct net_device *dev,
1097 struct net_device *slave_dev);
1098 int (*ndo_del_slave)(struct net_device *dev,
1099 struct net_device *slave_dev);
1100 netdev_features_t (*ndo_fix_features)(struct net_device *dev,
1101 netdev_features_t features);
1102 int (*ndo_set_features)(struct net_device *dev,
1103 netdev_features_t features);
1104 int (*ndo_neigh_construct)(struct neighbour *n);
1105 void (*ndo_neigh_destroy)(struct neighbour *n);
1106
1107 int (*ndo_fdb_add)(struct ndmsg *ndm,
1108 struct nlattr *tb[],
1109 struct net_device *dev,
1110 const unsigned char *addr,
1111 u16 flags);
1112 int (*ndo_fdb_del)(struct ndmsg *ndm,
1113 struct nlattr *tb[],
1114 struct net_device *dev,
1115 const unsigned char *addr);
1116 int (*ndo_fdb_dump)(struct sk_buff *skb,
1117 struct netlink_callback *cb,
1118 struct net_device *dev,
1119 int idx);
1120
1121 int (*ndo_bridge_setlink)(struct net_device *dev,
1122 struct nlmsghdr *nlh);
1123 int (*ndo_bridge_getlink)(struct sk_buff *skb,
1124 u32 pid, u32 seq,
1125 struct net_device *dev,
1126 u32 filter_mask);
1127 int (*ndo_bridge_dellink)(struct net_device *dev,
1128 struct nlmsghdr *nlh);
1129 int (*ndo_change_carrier)(struct net_device *dev,
1130 bool new_carrier);
1131 int (*ndo_get_phys_port_id)(struct net_device *dev,
1132 struct netdev_phys_port_id *ppid);
1133 void (*ndo_add_vxlan_port)(struct net_device *dev,
1134 sa_family_t sa_family,
1135 __be16 port);
1136 void (*ndo_del_vxlan_port)(struct net_device *dev,
1137 sa_family_t sa_family,
1138 __be16 port);
1139
1140 void* (*ndo_dfwd_add_station)(struct net_device *pdev,
1141 struct net_device *dev);
1142 void (*ndo_dfwd_del_station)(struct net_device *pdev,
1143 void *priv);
1144
1145 netdev_tx_t (*ndo_dfwd_start_xmit) (struct sk_buff *skb,
1146 struct net_device *dev,
1147 void *priv);
1148 };
1149
1150 /*
1151 * The DEVICE structure.
1152 * Actually, this whole structure is a big mistake. It mixes I/O
1153 * data with strictly "high-level" data, and it has to know about
1154 * almost every data structure used in the INET module.
1155 *
1156 * FIXME: cleanup struct net_device such that network protocol info
1157 * moves out.
1158 */
1159
1160 struct net_device {
1161
1162 /*
1163 * This is the first field of the "visible" part of this structure
1164 * (i.e. as seen by users in the "Space.c" file). It is the name
1165 * of the interface.
1166 */
1167 char name[IFNAMSIZ];
1168
1169 /* device name hash chain, please keep it close to name[] */
1170 struct hlist_node name_hlist;
1171
1172 /* snmp alias */
1173 char *ifalias;
1174
1175 /*
1176 * I/O specific fields
1177 * FIXME: Merge these and struct ifmap into one
1178 */
1179 unsigned long mem_end; /* shared mem end */
1180 unsigned long mem_start; /* shared mem start */
1181 unsigned long base_addr; /* device I/O address */
1182 int irq; /* device IRQ number */
1183
1184 /*
1185 * Some hardware also needs these fields, but they are not
1186 * part of the usual set specified in Space.c.
1187 */
1188
1189 unsigned long state;
1190
1191 struct list_head dev_list;
1192 struct list_head napi_list;
1193 struct list_head unreg_list;
1194 struct list_head close_list;
1195
1196 /* directly linked devices, like slaves for bonding */
1197 struct {
1198 struct list_head upper;
1199 struct list_head lower;
1200 } adj_list;
1201
1202 /* all linked devices, *including* neighbours */
1203 struct {
1204 struct list_head upper;
1205 struct list_head lower;
1206 } all_adj_list;
1207
1208
1209 /* currently active device features */
1210 netdev_features_t features;
1211 /* user-changeable features */
1212 netdev_features_t hw_features;
1213 /* user-requested features */
1214 netdev_features_t wanted_features;
1215 /* mask of features inheritable by VLAN devices */
1216 netdev_features_t vlan_features;
1217 /* mask of features inherited by encapsulating devices
1218 * This field indicates what encapsulation offloads
1219 * the hardware is capable of doing, and drivers will
1220 * need to set them appropriately.
1221 */
1222 netdev_features_t hw_enc_features;
1223 /* mask of fetures inheritable by MPLS */
1224 netdev_features_t mpls_features;
1225
1226 /* Interface index. Unique device identifier */
1227 int ifindex;
1228 int iflink;
1229
1230 struct net_device_stats stats;
1231 atomic_long_t rx_dropped; /* dropped packets by core network
1232 * Do not use this in drivers.
1233 */
1234
1235 #ifdef CONFIG_WIRELESS_EXT
1236 /* List of functions to handle Wireless Extensions (instead of ioctl).
1237 * See <net/iw_handler.h> for details. Jean II */
1238 const struct iw_handler_def * wireless_handlers;
1239 /* Instance data managed by the core of Wireless Extensions. */
1240 struct iw_public_data * wireless_data;
1241 #endif
1242 /* Management operations */
1243 const struct net_device_ops *netdev_ops;
1244 const struct ethtool_ops *ethtool_ops;
1245 const struct forwarding_accel_ops *fwd_ops;
1246
1247 /* Hardware header description */
1248 const struct header_ops *header_ops;
1249
1250 unsigned int flags; /* interface flags (a la BSD) */
1251 unsigned int priv_flags; /* Like 'flags' but invisible to userspace.
1252 * See if.h for definitions. */
1253 unsigned short gflags;
1254 unsigned short padded; /* How much padding added by alloc_netdev() */
1255
1256 unsigned char operstate; /* RFC2863 operstate */
1257 unsigned char link_mode; /* mapping policy to operstate */
1258
1259 unsigned char if_port; /* Selectable AUI, TP,..*/
1260 unsigned char dma; /* DMA channel */
1261
1262 unsigned int mtu; /* interface MTU value */
1263 unsigned short type; /* interface hardware type */
1264 unsigned short hard_header_len; /* hardware hdr length */
1265
1266 /* extra head- and tailroom the hardware may need, but not in all cases
1267 * can this be guaranteed, especially tailroom. Some cases also use
1268 * LL_MAX_HEADER instead to allocate the skb.
1269 */
1270 unsigned short needed_headroom;
1271 unsigned short needed_tailroom;
1272
1273 /* Interface address info. */
1274 unsigned char perm_addr[MAX_ADDR_LEN]; /* permanent hw address */
1275 unsigned char addr_assign_type; /* hw address assignment type */
1276 unsigned char addr_len; /* hardware address length */
1277 unsigned short neigh_priv_len;
1278 unsigned short dev_id; /* Used to differentiate devices
1279 * that share the same link
1280 * layer address
1281 */
1282 spinlock_t addr_list_lock;
1283 struct netdev_hw_addr_list uc; /* Unicast mac addresses */
1284 struct netdev_hw_addr_list mc; /* Multicast mac addresses */
1285 struct netdev_hw_addr_list dev_addrs; /* list of device
1286 * hw addresses
1287 */
1288 #ifdef CONFIG_SYSFS
1289 struct kset *queues_kset;
1290 #endif
1291
1292 bool uc_promisc;
1293 unsigned int promiscuity;
1294 unsigned int allmulti;
1295
1296
1297 /* Protocol specific pointers */
1298
1299 #if IS_ENABLED(CONFIG_VLAN_8021Q)
1300 struct vlan_info __rcu *vlan_info; /* VLAN info */
1301 #endif
1302 #if IS_ENABLED(CONFIG_NET_DSA)
1303 struct dsa_switch_tree *dsa_ptr; /* dsa specific data */
1304 #endif
1305 #if IS_ENABLED(CONFIG_TIPC)
1306 struct tipc_bearer __rcu *tipc_ptr; /* TIPC specific data */
1307 #endif
1308 void *atalk_ptr; /* AppleTalk link */
1309 struct in_device __rcu *ip_ptr; /* IPv4 specific data */
1310 struct dn_dev __rcu *dn_ptr; /* DECnet specific data */
1311 struct inet6_dev __rcu *ip6_ptr; /* IPv6 specific data */
1312 void *ax25_ptr; /* AX.25 specific data */
1313 struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data,
1314 assign before registering */
1315
1316 /*
1317 * Cache lines mostly used on receive path (including eth_type_trans())
1318 */
1319 unsigned long last_rx; /* Time of last Rx
1320 * This should not be set in
1321 * drivers, unless really needed,
1322 * because network stack (bonding)
1323 * use it if/when necessary, to
1324 * avoid dirtying this cache line.
1325 */
1326
1327 /* Interface address info used in eth_type_trans() */
1328 unsigned char *dev_addr; /* hw address, (before bcast
1329 because most packets are
1330 unicast) */
1331
1332
1333 #ifdef CONFIG_SYSFS
1334 struct netdev_rx_queue *_rx;
1335
1336 /* Number of RX queues allocated at register_netdev() time */
1337 unsigned int num_rx_queues;
1338
1339 /* Number of RX queues currently active in device */
1340 unsigned int real_num_rx_queues;
1341
1342 #endif
1343
1344 rx_handler_func_t __rcu *rx_handler;
1345 void __rcu *rx_handler_data;
1346
1347 struct netdev_queue __rcu *ingress_queue;
1348 unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */
1349
1350
1351 /*
1352 * Cache lines mostly used on transmit path
1353 */
1354 struct netdev_queue *_tx ____cacheline_aligned_in_smp;
1355
1356 /* Number of TX queues allocated at alloc_netdev_mq() time */
1357 unsigned int num_tx_queues;
1358
1359 /* Number of TX queues currently active in device */
1360 unsigned int real_num_tx_queues;
1361
1362 /* root qdisc from userspace point of view */
1363 struct Qdisc *qdisc;
1364
1365 unsigned long tx_queue_len; /* Max frames per queue allowed */
1366 spinlock_t tx_global_lock;
1367
1368 #ifdef CONFIG_XPS
1369 struct xps_dev_maps __rcu *xps_maps;
1370 #endif
1371 #ifdef CONFIG_RFS_ACCEL
1372 /* CPU reverse-mapping for RX completion interrupts, indexed
1373 * by RX queue number. Assigned by driver. This must only be
1374 * set if the ndo_rx_flow_steer operation is defined. */
1375 struct cpu_rmap *rx_cpu_rmap;
1376 #endif
1377
1378 /* These may be needed for future network-power-down code. */
1379
1380 /*
1381 * trans_start here is expensive for high speed devices on SMP,
1382 * please use netdev_queue->trans_start instead.
1383 */
1384 unsigned long trans_start; /* Time (in jiffies) of last Tx */
1385
1386 int watchdog_timeo; /* used by dev_watchdog() */
1387 struct timer_list watchdog_timer;
1388
1389 /* Number of references to this device */
1390 int __percpu *pcpu_refcnt;
1391
1392 /* delayed register/unregister */
1393 struct list_head todo_list;
1394 /* device index hash chain */
1395 struct hlist_node index_hlist;
1396
1397 struct list_head link_watch_list;
1398
1399 /* register/unregister state machine */
1400 enum { NETREG_UNINITIALIZED=0,
1401 NETREG_REGISTERED, /* completed register_netdevice */
1402 NETREG_UNREGISTERING, /* called unregister_netdevice */
1403 NETREG_UNREGISTERED, /* completed unregister todo */
1404 NETREG_RELEASED, /* called free_netdev */
1405 NETREG_DUMMY, /* dummy device for NAPI poll */
1406 } reg_state:8;
1407
1408 bool dismantle; /* device is going do be freed */
1409
1410 enum {
1411 RTNL_LINK_INITIALIZED,
1412 RTNL_LINK_INITIALIZING,
1413 } rtnl_link_state:16;
1414
1415 /* Called from unregister, can be used to call free_netdev */
1416 void (*destructor)(struct net_device *dev);
1417
1418 #ifdef CONFIG_NETPOLL
1419 struct netpoll_info __rcu *npinfo;
1420 #endif
1421
1422 #ifdef CONFIG_NET_NS
1423 /* Network namespace this network device is inside */
1424 struct net *nd_net;
1425 #endif
1426
1427 /* mid-layer private */
1428 union {
1429 void *ml_priv;
1430 struct pcpu_lstats __percpu *lstats; /* loopback stats */
1431 struct pcpu_sw_netstats __percpu *tstats;
1432 struct pcpu_dstats __percpu *dstats; /* dummy stats */
1433 struct pcpu_vstats __percpu *vstats; /* veth stats */
1434 };
1435 /* GARP */
1436 struct garp_port __rcu *garp_port;
1437 /* MRP */
1438 struct mrp_port __rcu *mrp_port;
1439
1440 /* class/net/name entry */
1441 struct device dev;
1442 /* space for optional device, statistics, and wireless sysfs groups */
1443 const struct attribute_group *sysfs_groups[4];
1444 /* space for optional per-rx queue attributes */
1445 const struct attribute_group *sysfs_rx_queue_group;
1446
1447 /* rtnetlink link ops */
1448 const struct rtnl_link_ops *rtnl_link_ops;
1449
1450 /* for setting kernel sock attribute on TCP connection setup */
1451 #define GSO_MAX_SIZE 65536
1452 unsigned int gso_max_size;
1453 #define GSO_MAX_SEGS 65535
1454 u16 gso_max_segs;
1455
1456 #ifdef CONFIG_DCB
1457 /* Data Center Bridging netlink ops */
1458 const struct dcbnl_rtnl_ops *dcbnl_ops;
1459 #endif
1460 u8 num_tc;
1461 struct netdev_tc_txq tc_to_txq[TC_MAX_QUEUE];
1462 u8 prio_tc_map[TC_BITMASK + 1];
1463
1464 #if IS_ENABLED(CONFIG_FCOE)
1465 /* max exchange id for FCoE LRO by ddp */
1466 unsigned int fcoe_ddp_xid;
1467 #endif
1468 #if IS_ENABLED(CONFIG_CGROUP_NET_PRIO)
1469 struct netprio_map __rcu *priomap;
1470 #endif
1471 /* phy device may attach itself for hardware timestamping */
1472 struct phy_device *phydev;
1473
1474 struct lock_class_key *qdisc_tx_busylock;
1475
1476 /* group the device belongs to */
1477 int group;
1478
1479 struct pm_qos_request pm_qos_req;
1480 };
1481 #define to_net_dev(d) container_of(d, struct net_device, dev)
1482
1483 #define NETDEV_ALIGN 32
1484
1485 static inline
1486 int netdev_get_prio_tc_map(const struct net_device *dev, u32 prio)
1487 {
1488 return dev->prio_tc_map[prio & TC_BITMASK];
1489 }
1490
1491 static inline
1492 int netdev_set_prio_tc_map(struct net_device *dev, u8 prio, u8 tc)
1493 {
1494 if (tc >= dev->num_tc)
1495 return -EINVAL;
1496
1497 dev->prio_tc_map[prio & TC_BITMASK] = tc & TC_BITMASK;
1498 return 0;
1499 }
1500
1501 static inline
1502 void netdev_reset_tc(struct net_device *dev)
1503 {
1504 dev->num_tc = 0;
1505 memset(dev->tc_to_txq, 0, sizeof(dev->tc_to_txq));
1506 memset(dev->prio_tc_map, 0, sizeof(dev->prio_tc_map));
1507 }
1508
1509 static inline
1510 int netdev_set_tc_queue(struct net_device *dev, u8 tc, u16 count, u16 offset)
1511 {
1512 if (tc >= dev->num_tc)
1513 return -EINVAL;
1514
1515 dev->tc_to_txq[tc].count = count;
1516 dev->tc_to_txq[tc].offset = offset;
1517 return 0;
1518 }
1519
1520 static inline
1521 int netdev_set_num_tc(struct net_device *dev, u8 num_tc)
1522 {
1523 if (num_tc > TC_MAX_QUEUE)
1524 return -EINVAL;
1525
1526 dev->num_tc = num_tc;
1527 return 0;
1528 }
1529
1530 static inline
1531 int netdev_get_num_tc(struct net_device *dev)
1532 {
1533 return dev->num_tc;
1534 }
1535
1536 static inline
1537 struct netdev_queue *netdev_get_tx_queue(const struct net_device *dev,
1538 unsigned int index)
1539 {
1540 return &dev->_tx[index];
1541 }
1542
1543 static inline void netdev_for_each_tx_queue(struct net_device *dev,
1544 void (*f)(struct net_device *,
1545 struct netdev_queue *,
1546 void *),
1547 void *arg)
1548 {
1549 unsigned int i;
1550
1551 for (i = 0; i < dev->num_tx_queues; i++)
1552 f(dev, &dev->_tx[i], arg);
1553 }
1554
1555 struct netdev_queue *netdev_pick_tx(struct net_device *dev,
1556 struct sk_buff *skb,
1557 void *accel_priv);
1558
1559 /*
1560 * Net namespace inlines
1561 */
1562 static inline
1563 struct net *dev_net(const struct net_device *dev)
1564 {
1565 return read_pnet(&dev->nd_net);
1566 }
1567
1568 static inline
1569 void dev_net_set(struct net_device *dev, struct net *net)
1570 {
1571 #ifdef CONFIG_NET_NS
1572 release_net(dev->nd_net);
1573 dev->nd_net = hold_net(net);
1574 #endif
1575 }
1576
1577 static inline bool netdev_uses_dsa_tags(struct net_device *dev)
1578 {
1579 #ifdef CONFIG_NET_DSA_TAG_DSA
1580 if (dev->dsa_ptr != NULL)
1581 return dsa_uses_dsa_tags(dev->dsa_ptr);
1582 #endif
1583
1584 return 0;
1585 }
1586
1587 static inline bool netdev_uses_trailer_tags(struct net_device *dev)
1588 {
1589 #ifdef CONFIG_NET_DSA_TAG_TRAILER
1590 if (dev->dsa_ptr != NULL)
1591 return dsa_uses_trailer_tags(dev->dsa_ptr);
1592 #endif
1593
1594 return 0;
1595 }
1596
1597 /**
1598 * netdev_priv - access network device private data
1599 * @dev: network device
1600 *
1601 * Get network device private data
1602 */
1603 static inline void *netdev_priv(const struct net_device *dev)
1604 {
1605 return (char *)dev + ALIGN(sizeof(struct net_device), NETDEV_ALIGN);
1606 }
1607
1608 /* Set the sysfs physical device reference for the network logical device
1609 * if set prior to registration will cause a symlink during initialization.
1610 */
1611 #define SET_NETDEV_DEV(net, pdev) ((net)->dev.parent = (pdev))
1612
1613 /* Set the sysfs device type for the network logical device to allow
1614 * fine-grained identification of different network device types. For
1615 * example Ethernet, Wirelss LAN, Bluetooth, WiMAX etc.
1616 */
1617 #define SET_NETDEV_DEVTYPE(net, devtype) ((net)->dev.type = (devtype))
1618
1619 /* Default NAPI poll() weight
1620 * Device drivers are strongly advised to not use bigger value
1621 */
1622 #define NAPI_POLL_WEIGHT 64
1623
1624 /**
1625 * netif_napi_add - initialize a napi context
1626 * @dev: network device
1627 * @napi: napi context
1628 * @poll: polling function
1629 * @weight: default weight
1630 *
1631 * netif_napi_add() must be used to initialize a napi context prior to calling
1632 * *any* of the other napi related functions.
1633 */
1634 void netif_napi_add(struct net_device *dev, struct napi_struct *napi,
1635 int (*poll)(struct napi_struct *, int), int weight);
1636
1637 /**
1638 * netif_napi_del - remove a napi context
1639 * @napi: napi context
1640 *
1641 * netif_napi_del() removes a napi context from the network device napi list
1642 */
1643 void netif_napi_del(struct napi_struct *napi);
1644
1645 struct napi_gro_cb {
1646 /* Virtual address of skb_shinfo(skb)->frags[0].page + offset. */
1647 void *frag0;
1648
1649 /* Length of frag0. */
1650 unsigned int frag0_len;
1651
1652 /* This indicates where we are processing relative to skb->data. */
1653 int data_offset;
1654
1655 /* This is non-zero if the packet cannot be merged with the new skb. */
1656 u16 flush;
1657
1658 /* Save the IP ID here and check when we get to the transport layer */
1659 u16 flush_id;
1660
1661 /* Number of segments aggregated. */
1662 u16 count;
1663
1664 /* This is non-zero if the packet may be of the same flow. */
1665 u8 same_flow;
1666
1667 /* Free the skb? */
1668 u8 free;
1669 #define NAPI_GRO_FREE 1
1670 #define NAPI_GRO_FREE_STOLEN_HEAD 2
1671
1672 /* jiffies when first packet was created/queued */
1673 unsigned long age;
1674
1675 /* Used in ipv6_gro_receive() */
1676 u16 proto;
1677
1678 /* Used in udp_gro_receive */
1679 u16 udp_mark;
1680
1681 /* used to support CHECKSUM_COMPLETE for tunneling protocols */
1682 __wsum csum;
1683
1684 /* used in skb_gro_receive() slow path */
1685 struct sk_buff *last;
1686 };
1687
1688 #define NAPI_GRO_CB(skb) ((struct napi_gro_cb *)(skb)->cb)
1689
1690 struct packet_type {
1691 __be16 type; /* This is really htons(ether_type). */
1692 struct net_device *dev; /* NULL is wildcarded here */
1693 int (*func) (struct sk_buff *,
1694 struct net_device *,
1695 struct packet_type *,
1696 struct net_device *);
1697 bool (*id_match)(struct packet_type *ptype,
1698 struct sock *sk);
1699 void *af_packet_priv;
1700 struct list_head list;
1701 };
1702
1703 struct offload_callbacks {
1704 struct sk_buff *(*gso_segment)(struct sk_buff *skb,
1705 netdev_features_t features);
1706 int (*gso_send_check)(struct sk_buff *skb);
1707 struct sk_buff **(*gro_receive)(struct sk_buff **head,
1708 struct sk_buff *skb);
1709 int (*gro_complete)(struct sk_buff *skb, int nhoff);
1710 };
1711
1712 struct packet_offload {
1713 __be16 type; /* This is really htons(ether_type). */
1714 struct offload_callbacks callbacks;
1715 struct list_head list;
1716 };
1717
1718 struct udp_offload {
1719 __be16 port;
1720 struct offload_callbacks callbacks;
1721 };
1722
1723 /* often modified stats are per cpu, other are shared (netdev->stats) */
1724 struct pcpu_sw_netstats {
1725 u64 rx_packets;
1726 u64 rx_bytes;
1727 u64 tx_packets;
1728 u64 tx_bytes;
1729 struct u64_stats_sync syncp;
1730 };
1731
1732 #include <linux/notifier.h>
1733
1734 /* netdevice notifier chain. Please remember to update the rtnetlink
1735 * notification exclusion list in rtnetlink_event() when adding new
1736 * types.
1737 */
1738 #define NETDEV_UP 0x0001 /* For now you can't veto a device up/down */
1739 #define NETDEV_DOWN 0x0002
1740 #define NETDEV_REBOOT 0x0003 /* Tell a protocol stack a network interface
1741 detected a hardware crash and restarted
1742 - we can use this eg to kick tcp sessions
1743 once done */
1744 #define NETDEV_CHANGE 0x0004 /* Notify device state change */
1745 #define NETDEV_REGISTER 0x0005
1746 #define NETDEV_UNREGISTER 0x0006
1747 #define NETDEV_CHANGEMTU 0x0007 /* notify after mtu change happened */
1748 #define NETDEV_CHANGEADDR 0x0008
1749 #define NETDEV_GOING_DOWN 0x0009
1750 #define NETDEV_CHANGENAME 0x000A
1751 #define NETDEV_FEAT_CHANGE 0x000B
1752 #define NETDEV_BONDING_FAILOVER 0x000C
1753 #define NETDEV_PRE_UP 0x000D
1754 #define NETDEV_PRE_TYPE_CHANGE 0x000E
1755 #define NETDEV_POST_TYPE_CHANGE 0x000F
1756 #define NETDEV_POST_INIT 0x0010
1757 #define NETDEV_UNREGISTER_FINAL 0x0011
1758 #define NETDEV_RELEASE 0x0012
1759 #define NETDEV_NOTIFY_PEERS 0x0013
1760 #define NETDEV_JOIN 0x0014
1761 #define NETDEV_CHANGEUPPER 0x0015
1762 #define NETDEV_RESEND_IGMP 0x0016
1763 #define NETDEV_PRECHANGEMTU 0x0017 /* notify before mtu change happened */
1764
1765 int register_netdevice_notifier(struct notifier_block *nb);
1766 int unregister_netdevice_notifier(struct notifier_block *nb);
1767
1768 struct netdev_notifier_info {
1769 struct net_device *dev;
1770 };
1771
1772 struct netdev_notifier_change_info {
1773 struct netdev_notifier_info info; /* must be first */
1774 unsigned int flags_changed;
1775 };
1776
1777 static inline void netdev_notifier_info_init(struct netdev_notifier_info *info,
1778 struct net_device *dev)
1779 {
1780 info->dev = dev;
1781 }
1782
1783 static inline struct net_device *
1784 netdev_notifier_info_to_dev(const struct netdev_notifier_info *info)
1785 {
1786 return info->dev;
1787 }
1788
1789 int call_netdevice_notifiers(unsigned long val, struct net_device *dev);
1790
1791
1792 extern rwlock_t dev_base_lock; /* Device list lock */
1793
1794 #define for_each_netdev(net, d) \
1795 list_for_each_entry(d, &(net)->dev_base_head, dev_list)
1796 #define for_each_netdev_reverse(net, d) \
1797 list_for_each_entry_reverse(d, &(net)->dev_base_head, dev_list)
1798 #define for_each_netdev_rcu(net, d) \
1799 list_for_each_entry_rcu(d, &(net)->dev_base_head, dev_list)
1800 #define for_each_netdev_safe(net, d, n) \
1801 list_for_each_entry_safe(d, n, &(net)->dev_base_head, dev_list)
1802 #define for_each_netdev_continue(net, d) \
1803 list_for_each_entry_continue(d, &(net)->dev_base_head, dev_list)
1804 #define for_each_netdev_continue_rcu(net, d) \
1805 list_for_each_entry_continue_rcu(d, &(net)->dev_base_head, dev_list)
1806 #define for_each_netdev_in_bond_rcu(bond, slave) \
1807 for_each_netdev_rcu(&init_net, slave) \
1808 if (netdev_master_upper_dev_get_rcu(slave) == bond)
1809 #define net_device_entry(lh) list_entry(lh, struct net_device, dev_list)
1810
1811 static inline struct net_device *next_net_device(struct net_device *dev)
1812 {
1813 struct list_head *lh;
1814 struct net *net;
1815
1816 net = dev_net(dev);
1817 lh = dev->dev_list.next;
1818 return lh == &net->dev_base_head ? NULL : net_device_entry(lh);
1819 }
1820
1821 static inline struct net_device *next_net_device_rcu(struct net_device *dev)
1822 {
1823 struct list_head *lh;
1824 struct net *net;
1825
1826 net = dev_net(dev);
1827 lh = rcu_dereference(list_next_rcu(&dev->dev_list));
1828 return lh == &net->dev_base_head ? NULL : net_device_entry(lh);
1829 }
1830
1831 static inline struct net_device *first_net_device(struct net *net)
1832 {
1833 return list_empty(&net->dev_base_head) ? NULL :
1834 net_device_entry(net->dev_base_head.next);
1835 }
1836
1837 static inline struct net_device *first_net_device_rcu(struct net *net)
1838 {
1839 struct list_head *lh = rcu_dereference(list_next_rcu(&net->dev_base_head));
1840
1841 return lh == &net->dev_base_head ? NULL : net_device_entry(lh);
1842 }
1843
1844 int netdev_boot_setup_check(struct net_device *dev);
1845 unsigned long netdev_boot_base(const char *prefix, int unit);
1846 struct net_device *dev_getbyhwaddr_rcu(struct net *net, unsigned short type,
1847 const char *hwaddr);
1848 struct net_device *dev_getfirstbyhwtype(struct net *net, unsigned short type);
1849 struct net_device *__dev_getfirstbyhwtype(struct net *net, unsigned short type);
1850 void dev_add_pack(struct packet_type *pt);
1851 void dev_remove_pack(struct packet_type *pt);
1852 void __dev_remove_pack(struct packet_type *pt);
1853 void dev_add_offload(struct packet_offload *po);
1854 void dev_remove_offload(struct packet_offload *po);
1855
1856 struct net_device *dev_get_by_flags_rcu(struct net *net, unsigned short flags,
1857 unsigned short mask);
1858 struct net_device *dev_get_by_name(struct net *net, const char *name);
1859 struct net_device *dev_get_by_name_rcu(struct net *net, const char *name);
1860 struct net_device *__dev_get_by_name(struct net *net, const char *name);
1861 int dev_alloc_name(struct net_device *dev, const char *name);
1862 int dev_open(struct net_device *dev);
1863 int dev_close(struct net_device *dev);
1864 void dev_disable_lro(struct net_device *dev);
1865 int dev_loopback_xmit(struct sk_buff *newskb);
1866 int dev_queue_xmit(struct sk_buff *skb);
1867 int dev_queue_xmit_accel(struct sk_buff *skb, void *accel_priv);
1868 int register_netdevice(struct net_device *dev);
1869 void unregister_netdevice_queue(struct net_device *dev, struct list_head *head);
1870 void unregister_netdevice_many(struct list_head *head);
1871 static inline void unregister_netdevice(struct net_device *dev)
1872 {
1873 unregister_netdevice_queue(dev, NULL);
1874 }
1875
1876 int netdev_refcnt_read(const struct net_device *dev);
1877 void free_netdev(struct net_device *dev);
1878 void netdev_freemem(struct net_device *dev);
1879 void synchronize_net(void);
1880 int init_dummy_netdev(struct net_device *dev);
1881
1882 struct net_device *dev_get_by_index(struct net *net, int ifindex);
1883 struct net_device *__dev_get_by_index(struct net *net, int ifindex);
1884 struct net_device *dev_get_by_index_rcu(struct net *net, int ifindex);
1885 int netdev_get_name(struct net *net, char *name, int ifindex);
1886 int dev_restart(struct net_device *dev);
1887 #ifdef CONFIG_NETPOLL_TRAP
1888 int netpoll_trap(void);
1889 #endif
1890 int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb);
1891
1892 static inline unsigned int skb_gro_offset(const struct sk_buff *skb)
1893 {
1894 return NAPI_GRO_CB(skb)->data_offset;
1895 }
1896
1897 static inline unsigned int skb_gro_len(const struct sk_buff *skb)
1898 {
1899 return skb->len - NAPI_GRO_CB(skb)->data_offset;
1900 }
1901
1902 static inline void skb_gro_pull(struct sk_buff *skb, unsigned int len)
1903 {
1904 NAPI_GRO_CB(skb)->data_offset += len;
1905 }
1906
1907 static inline void *skb_gro_header_fast(struct sk_buff *skb,
1908 unsigned int offset)
1909 {
1910 return NAPI_GRO_CB(skb)->frag0 + offset;
1911 }
1912
1913 static inline int skb_gro_header_hard(struct sk_buff *skb, unsigned int hlen)
1914 {
1915 return NAPI_GRO_CB(skb)->frag0_len < hlen;
1916 }
1917
1918 static inline void *skb_gro_header_slow(struct sk_buff *skb, unsigned int hlen,
1919 unsigned int offset)
1920 {
1921 if (!pskb_may_pull(skb, hlen))
1922 return NULL;
1923
1924 NAPI_GRO_CB(skb)->frag0 = NULL;
1925 NAPI_GRO_CB(skb)->frag0_len = 0;
1926 return skb->data + offset;
1927 }
1928
1929 static inline void *skb_gro_mac_header(struct sk_buff *skb)
1930 {
1931 return NAPI_GRO_CB(skb)->frag0 ?: skb_mac_header(skb);
1932 }
1933
1934 static inline void *skb_gro_network_header(struct sk_buff *skb)
1935 {
1936 return (NAPI_GRO_CB(skb)->frag0 ?: skb->data) +
1937 skb_network_offset(skb);
1938 }
1939
1940 static inline void skb_gro_postpull_rcsum(struct sk_buff *skb,
1941 const void *start, unsigned int len)
1942 {
1943 if (skb->ip_summed == CHECKSUM_COMPLETE)
1944 NAPI_GRO_CB(skb)->csum = csum_sub(NAPI_GRO_CB(skb)->csum,
1945 csum_partial(start, len, 0));
1946 }
1947
1948 static inline int dev_hard_header(struct sk_buff *skb, struct net_device *dev,
1949 unsigned short type,
1950 const void *daddr, const void *saddr,
1951 unsigned int len)
1952 {
1953 if (!dev->header_ops || !dev->header_ops->create)
1954 return 0;
1955
1956 return dev->header_ops->create(skb, dev, type, daddr, saddr, len);
1957 }
1958
1959 static inline int dev_parse_header(const struct sk_buff *skb,
1960 unsigned char *haddr)
1961 {
1962 const struct net_device *dev = skb->dev;
1963
1964 if (!dev->header_ops || !dev->header_ops->parse)
1965 return 0;
1966 return dev->header_ops->parse(skb, haddr);
1967 }
1968
1969 static inline int dev_rebuild_header(struct sk_buff *skb)
1970 {
1971 const struct net_device *dev = skb->dev;
1972
1973 if (!dev->header_ops || !dev->header_ops->rebuild)
1974 return 0;
1975 return dev->header_ops->rebuild(skb);
1976 }
1977
1978 typedef int gifconf_func_t(struct net_device * dev, char __user * bufptr, int len);
1979 int register_gifconf(unsigned int family, gifconf_func_t *gifconf);
1980 static inline int unregister_gifconf(unsigned int family)
1981 {
1982 return register_gifconf(family, NULL);
1983 }
1984
1985 #ifdef CONFIG_NET_FLOW_LIMIT
1986 #define FLOW_LIMIT_HISTORY (1 << 7) /* must be ^2 and !overflow buckets */
1987 struct sd_flow_limit {
1988 u64 count;
1989 unsigned int num_buckets;
1990 unsigned int history_head;
1991 u16 history[FLOW_LIMIT_HISTORY];
1992 u8 buckets[];
1993 };
1994
1995 extern int netdev_flow_limit_table_len;
1996 #endif /* CONFIG_NET_FLOW_LIMIT */
1997
1998 /*
1999 * Incoming packets are placed on per-cpu queues
2000 */
2001 struct softnet_data {
2002 struct Qdisc *output_queue;
2003 struct Qdisc **output_queue_tailp;
2004 struct list_head poll_list;
2005 struct sk_buff *completion_queue;
2006 struct sk_buff_head process_queue;
2007
2008 /* stats */
2009 unsigned int processed;
2010 unsigned int time_squeeze;
2011 unsigned int cpu_collision;
2012 unsigned int received_rps;
2013
2014 #ifdef CONFIG_RPS
2015 struct softnet_data *rps_ipi_list;
2016
2017 /* Elements below can be accessed between CPUs for RPS */
2018 struct call_single_data csd ____cacheline_aligned_in_smp;
2019 struct softnet_data *rps_ipi_next;
2020 unsigned int cpu;
2021 unsigned int input_queue_head;
2022 unsigned int input_queue_tail;
2023 #endif
2024 unsigned int dropped;
2025 struct sk_buff_head input_pkt_queue;
2026 struct napi_struct backlog;
2027
2028 #ifdef CONFIG_NET_FLOW_LIMIT
2029 struct sd_flow_limit __rcu *flow_limit;
2030 #endif
2031 };
2032
2033 static inline void input_queue_head_incr(struct softnet_data *sd)
2034 {
2035 #ifdef CONFIG_RPS
2036 sd->input_queue_head++;
2037 #endif
2038 }
2039
2040 static inline void input_queue_tail_incr_save(struct softnet_data *sd,
2041 unsigned int *qtail)
2042 {
2043 #ifdef CONFIG_RPS
2044 *qtail = ++sd->input_queue_tail;
2045 #endif
2046 }
2047
2048 DECLARE_PER_CPU_ALIGNED(struct softnet_data, softnet_data);
2049
2050 void __netif_schedule(struct Qdisc *q);
2051
2052 static inline void netif_schedule_queue(struct netdev_queue *txq)
2053 {
2054 if (!(txq->state & QUEUE_STATE_ANY_XOFF))
2055 __netif_schedule(txq->qdisc);
2056 }
2057
2058 static inline void netif_tx_schedule_all(struct net_device *dev)
2059 {
2060 unsigned int i;
2061
2062 for (i = 0; i < dev->num_tx_queues; i++)
2063 netif_schedule_queue(netdev_get_tx_queue(dev, i));
2064 }
2065
2066 static inline void netif_tx_start_queue(struct netdev_queue *dev_queue)
2067 {
2068 clear_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state);
2069 }
2070
2071 /**
2072 * netif_start_queue - allow transmit
2073 * @dev: network device
2074 *
2075 * Allow upper layers to call the device hard_start_xmit routine.
2076 */
2077 static inline void netif_start_queue(struct net_device *dev)
2078 {
2079 netif_tx_start_queue(netdev_get_tx_queue(dev, 0));
2080 }
2081
2082 static inline void netif_tx_start_all_queues(struct net_device *dev)
2083 {
2084 unsigned int i;
2085
2086 for (i = 0; i < dev->num_tx_queues; i++) {
2087 struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
2088 netif_tx_start_queue(txq);
2089 }
2090 }
2091
2092 static inline void netif_tx_wake_queue(struct netdev_queue *dev_queue)
2093 {
2094 #ifdef CONFIG_NETPOLL_TRAP
2095 if (netpoll_trap()) {
2096 netif_tx_start_queue(dev_queue);
2097 return;
2098 }
2099 #endif
2100 if (test_and_clear_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state))
2101 __netif_schedule(dev_queue->qdisc);
2102 }
2103
2104 /**
2105 * netif_wake_queue - restart transmit
2106 * @dev: network device
2107 *
2108 * Allow upper layers to call the device hard_start_xmit routine.
2109 * Used for flow control when transmit resources are available.
2110 */
2111 static inline void netif_wake_queue(struct net_device *dev)
2112 {
2113 netif_tx_wake_queue(netdev_get_tx_queue(dev, 0));
2114 }
2115
2116 static inline void netif_tx_wake_all_queues(struct net_device *dev)
2117 {
2118 unsigned int i;
2119
2120 for (i = 0; i < dev->num_tx_queues; i++) {
2121 struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
2122 netif_tx_wake_queue(txq);
2123 }
2124 }
2125
2126 static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue)
2127 {
2128 if (WARN_ON(!dev_queue)) {
2129 pr_info("netif_stop_queue() cannot be called before register_netdev()\n");
2130 return;
2131 }
2132 set_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state);
2133 }
2134
2135 /**
2136 * netif_stop_queue - stop transmitted packets
2137 * @dev: network device
2138 *
2139 * Stop upper layers calling the device hard_start_xmit routine.
2140 * Used for flow control when transmit resources are unavailable.
2141 */
2142 static inline void netif_stop_queue(struct net_device *dev)
2143 {
2144 netif_tx_stop_queue(netdev_get_tx_queue(dev, 0));
2145 }
2146
2147 static inline void netif_tx_stop_all_queues(struct net_device *dev)
2148 {
2149 unsigned int i;
2150
2151 for (i = 0; i < dev->num_tx_queues; i++) {
2152 struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
2153 netif_tx_stop_queue(txq);
2154 }
2155 }
2156
2157 static inline bool netif_tx_queue_stopped(const struct netdev_queue *dev_queue)
2158 {
2159 return test_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state);
2160 }
2161
2162 /**
2163 * netif_queue_stopped - test if transmit queue is flowblocked
2164 * @dev: network device
2165 *
2166 * Test if transmit queue on device is currently unable to send.
2167 */
2168 static inline bool netif_queue_stopped(const struct net_device *dev)
2169 {
2170 return netif_tx_queue_stopped(netdev_get_tx_queue(dev, 0));
2171 }
2172
2173 static inline bool netif_xmit_stopped(const struct netdev_queue *dev_queue)
2174 {
2175 return dev_queue->state & QUEUE_STATE_ANY_XOFF;
2176 }
2177
2178 static inline bool netif_xmit_frozen_or_stopped(const struct netdev_queue *dev_queue)
2179 {
2180 return dev_queue->state & QUEUE_STATE_ANY_XOFF_OR_FROZEN;
2181 }
2182
2183 static inline void netdev_tx_sent_queue(struct netdev_queue *dev_queue,
2184 unsigned int bytes)
2185 {
2186 #ifdef CONFIG_BQL
2187 dql_queued(&dev_queue->dql, bytes);
2188
2189 if (likely(dql_avail(&dev_queue->dql) >= 0))
2190 return;
2191
2192 set_bit(__QUEUE_STATE_STACK_XOFF, &dev_queue->state);
2193
2194 /*
2195 * The XOFF flag must be set before checking the dql_avail below,
2196 * because in netdev_tx_completed_queue we update the dql_completed
2197 * before checking the XOFF flag.
2198 */
2199 smp_mb();
2200
2201 /* check again in case another CPU has just made room avail */
2202 if (unlikely(dql_avail(&dev_queue->dql) >= 0))
2203 clear_bit(__QUEUE_STATE_STACK_XOFF, &dev_queue->state);
2204 #endif
2205 }
2206
2207 /**
2208 * netdev_sent_queue - report the number of bytes queued to hardware
2209 * @dev: network device
2210 * @bytes: number of bytes queued to the hardware device queue
2211 *
2212 * Report the number of bytes queued for sending/completion to the network
2213 * device hardware queue. @bytes should be a good approximation and should
2214 * exactly match netdev_completed_queue() @bytes
2215 */
2216 static inline void netdev_sent_queue(struct net_device *dev, unsigned int bytes)
2217 {
2218 netdev_tx_sent_queue(netdev_get_tx_queue(dev, 0), bytes);
2219 }
2220
2221 static inline void netdev_tx_completed_queue(struct netdev_queue *dev_queue,
2222 unsigned int pkts, unsigned int bytes)
2223 {
2224 #ifdef CONFIG_BQL
2225 if (unlikely(!bytes))
2226 return;
2227
2228 dql_completed(&dev_queue->dql, bytes);
2229
2230 /*
2231 * Without the memory barrier there is a small possiblity that
2232 * netdev_tx_sent_queue will miss the update and cause the queue to
2233 * be stopped forever
2234 */
2235 smp_mb();
2236
2237 if (dql_avail(&dev_queue->dql) < 0)
2238 return;
2239
2240 if (test_and_clear_bit(__QUEUE_STATE_STACK_XOFF, &dev_queue->state))
2241 netif_schedule_queue(dev_queue);
2242 #endif
2243 }
2244
2245 /**
2246 * netdev_completed_queue - report bytes and packets completed by device
2247 * @dev: network device
2248 * @pkts: actual number of packets sent over the medium
2249 * @bytes: actual number of bytes sent over the medium
2250 *
2251 * Report the number of bytes and packets transmitted by the network device
2252 * hardware queue over the physical medium, @bytes must exactly match the
2253 * @bytes amount passed to netdev_sent_queue()
2254 */
2255 static inline void netdev_completed_queue(struct net_device *dev,
2256 unsigned int pkts, unsigned int bytes)
2257 {
2258 netdev_tx_completed_queue(netdev_get_tx_queue(dev, 0), pkts, bytes);
2259 }
2260
2261 static inline void netdev_tx_reset_queue(struct netdev_queue *q)
2262 {
2263 #ifdef CONFIG_BQL
2264 clear_bit(__QUEUE_STATE_STACK_XOFF, &q->state);
2265 dql_reset(&q->dql);
2266 #endif
2267 }
2268
2269 /**
2270 * netdev_reset_queue - reset the packets and bytes count of a network device
2271 * @dev_queue: network device
2272 *
2273 * Reset the bytes and packet count of a network device and clear the
2274 * software flow control OFF bit for this network device
2275 */
2276 static inline void netdev_reset_queue(struct net_device *dev_queue)
2277 {
2278 netdev_tx_reset_queue(netdev_get_tx_queue(dev_queue, 0));
2279 }
2280
2281 /**
2282 * netdev_cap_txqueue - check if selected tx queue exceeds device queues
2283 * @dev: network device
2284 * @queue_index: given tx queue index
2285 *
2286 * Returns 0 if given tx queue index >= number of device tx queues,
2287 * otherwise returns the originally passed tx queue index.
2288 */
2289 static inline u16 netdev_cap_txqueue(struct net_device *dev, u16 queue_index)
2290 {
2291 if (unlikely(queue_index >= dev->real_num_tx_queues)) {
2292 net_warn_ratelimited("%s selects TX queue %d, but real number of TX queues is %d\n",
2293 dev->name, queue_index,
2294 dev->real_num_tx_queues);
2295 return 0;
2296 }
2297
2298 return queue_index;
2299 }
2300
2301 /**
2302 * netif_running - test if up
2303 * @dev: network device
2304 *
2305 * Test if the device has been brought up.
2306 */
2307 static inline bool netif_running(const struct net_device *dev)
2308 {
2309 return test_bit(__LINK_STATE_START, &dev->state);
2310 }
2311
2312 /*
2313 * Routines to manage the subqueues on a device. We only need start
2314 * stop, and a check if it's stopped. All other device management is
2315 * done at the overall netdevice level.
2316 * Also test the device if we're multiqueue.
2317 */
2318
2319 /**
2320 * netif_start_subqueue - allow sending packets on subqueue
2321 * @dev: network device
2322 * @queue_index: sub queue index
2323 *
2324 * Start individual transmit queue of a device with multiple transmit queues.
2325 */
2326 static inline void netif_start_subqueue(struct net_device *dev, u16 queue_index)
2327 {
2328 struct netdev_queue *txq = netdev_get_tx_queue(dev, queue_index);
2329
2330 netif_tx_start_queue(txq);
2331 }
2332
2333 /**
2334 * netif_stop_subqueue - stop sending packets on subqueue
2335 * @dev: network device
2336 * @queue_index: sub queue index
2337 *
2338 * Stop individual transmit queue of a device with multiple transmit queues.
2339 */
2340 static inline void netif_stop_subqueue(struct net_device *dev, u16 queue_index)
2341 {
2342 struct netdev_queue *txq = netdev_get_tx_queue(dev, queue_index);
2343 #ifdef CONFIG_NETPOLL_TRAP
2344 if (netpoll_trap())
2345 return;
2346 #endif
2347 netif_tx_stop_queue(txq);
2348 }
2349
2350 /**
2351 * netif_subqueue_stopped - test status of subqueue
2352 * @dev: network device
2353 * @queue_index: sub queue index
2354 *
2355 * Check individual transmit queue of a device with multiple transmit queues.
2356 */
2357 static inline bool __netif_subqueue_stopped(const struct net_device *dev,
2358 u16 queue_index)
2359 {
2360 struct netdev_queue *txq = netdev_get_tx_queue(dev, queue_index);
2361
2362 return netif_tx_queue_stopped(txq);
2363 }
2364
2365 static inline bool netif_subqueue_stopped(const struct net_device *dev,
2366 struct sk_buff *skb)
2367 {
2368 return __netif_subqueue_stopped(dev, skb_get_queue_mapping(skb));
2369 }
2370
2371 /**
2372 * netif_wake_subqueue - allow sending packets on subqueue
2373 * @dev: network device
2374 * @queue_index: sub queue index
2375 *
2376 * Resume individual transmit queue of a device with multiple transmit queues.
2377 */
2378 static inline void netif_wake_subqueue(struct net_device *dev, u16 queue_index)
2379 {
2380 struct netdev_queue *txq = netdev_get_tx_queue(dev, queue_index);
2381 #ifdef CONFIG_NETPOLL_TRAP
2382 if (netpoll_trap())
2383 return;
2384 #endif
2385 if (test_and_clear_bit(__QUEUE_STATE_DRV_XOFF, &txq->state))
2386 __netif_schedule(txq->qdisc);
2387 }
2388
2389 #ifdef CONFIG_XPS
2390 int netif_set_xps_queue(struct net_device *dev, const struct cpumask *mask,
2391 u16 index);
2392 #else
2393 static inline int netif_set_xps_queue(struct net_device *dev,
2394 const struct cpumask *mask,
2395 u16 index)
2396 {
2397 return 0;
2398 }
2399 #endif
2400
2401 /*
2402 * Returns a Tx hash for the given packet when dev->real_num_tx_queues is used
2403 * as a distribution range limit for the returned value.
2404 */
2405 static inline u16 skb_tx_hash(const struct net_device *dev,
2406 const struct sk_buff *skb)
2407 {
2408 return __skb_tx_hash(dev, skb, dev->real_num_tx_queues);
2409 }
2410
2411 /**
2412 * netif_is_multiqueue - test if device has multiple transmit queues
2413 * @dev: network device
2414 *
2415 * Check if device has multiple transmit queues
2416 */
2417 static inline bool netif_is_multiqueue(const struct net_device *dev)
2418 {
2419 return dev->num_tx_queues > 1;
2420 }
2421
2422 int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq);
2423
2424 #ifdef CONFIG_SYSFS
2425 int netif_set_real_num_rx_queues(struct net_device *dev, unsigned int rxq);
2426 #else
2427 static inline int netif_set_real_num_rx_queues(struct net_device *dev,
2428 unsigned int rxq)
2429 {
2430 return 0;
2431 }
2432 #endif
2433
2434 static inline int netif_copy_real_num_queues(struct net_device *to_dev,
2435 const struct net_device *from_dev)
2436 {
2437 int err;
2438
2439 err = netif_set_real_num_tx_queues(to_dev,
2440 from_dev->real_num_tx_queues);
2441 if (err)
2442 return err;
2443 #ifdef CONFIG_SYSFS
2444 return netif_set_real_num_rx_queues(to_dev,
2445 from_dev->real_num_rx_queues);
2446 #else
2447 return 0;
2448 #endif
2449 }
2450
2451 #ifdef CONFIG_SYSFS
2452 static inline unsigned int get_netdev_rx_queue_index(
2453 struct netdev_rx_queue *queue)
2454 {
2455 struct net_device *dev = queue->dev;
2456 int index = queue - dev->_rx;
2457
2458 BUG_ON(index >= dev->num_rx_queues);
2459 return index;
2460 }
2461 #endif
2462
2463 #define DEFAULT_MAX_NUM_RSS_QUEUES (8)
2464 int netif_get_num_default_rss_queues(void);
2465
2466 enum skb_free_reason {
2467 SKB_REASON_CONSUMED,
2468 SKB_REASON_DROPPED,
2469 };
2470
2471 void __dev_kfree_skb_irq(struct sk_buff *skb, enum skb_free_reason reason);
2472 void __dev_kfree_skb_any(struct sk_buff *skb, enum skb_free_reason reason);
2473
2474 /*
2475 * It is not allowed to call kfree_skb() or consume_skb() from hardware
2476 * interrupt context or with hardware interrupts being disabled.
2477 * (in_irq() || irqs_disabled())
2478 *
2479 * We provide four helpers that can be used in following contexts :
2480 *
2481 * dev_kfree_skb_irq(skb) when caller drops a packet from irq context,
2482 * replacing kfree_skb(skb)
2483 *
2484 * dev_consume_skb_irq(skb) when caller consumes a packet from irq context.
2485 * Typically used in place of consume_skb(skb) in TX completion path
2486 *
2487 * dev_kfree_skb_any(skb) when caller doesn't know its current irq context,
2488 * replacing kfree_skb(skb)
2489 *
2490 * dev_consume_skb_any(skb) when caller doesn't know its current irq context,
2491 * and consumed a packet. Used in place of consume_skb(skb)
2492 */
2493 static inline void dev_kfree_skb_irq(struct sk_buff *skb)
2494 {
2495 __dev_kfree_skb_irq(skb, SKB_REASON_DROPPED);
2496 }
2497
2498 static inline void dev_consume_skb_irq(struct sk_buff *skb)
2499 {
2500 __dev_kfree_skb_irq(skb, SKB_REASON_CONSUMED);
2501 }
2502
2503 static inline void dev_kfree_skb_any(struct sk_buff *skb)
2504 {
2505 __dev_kfree_skb_any(skb, SKB_REASON_DROPPED);
2506 }
2507
2508 static inline void dev_consume_skb_any(struct sk_buff *skb)
2509 {
2510 __dev_kfree_skb_any(skb, SKB_REASON_CONSUMED);
2511 }
2512
2513 int netif_rx(struct sk_buff *skb);
2514 int netif_rx_ni(struct sk_buff *skb);
2515 int netif_receive_skb(struct sk_buff *skb);
2516 gro_result_t napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb);
2517 void napi_gro_flush(struct napi_struct *napi, bool flush_old);
2518 struct sk_buff *napi_get_frags(struct napi_struct *napi);
2519 gro_result_t napi_gro_frags(struct napi_struct *napi);
2520 struct packet_offload *gro_find_receive_by_type(__be16 type);
2521 struct packet_offload *gro_find_complete_by_type(__be16 type);
2522
2523 static inline void napi_free_frags(struct napi_struct *napi)
2524 {
2525 kfree_skb(napi->skb);
2526 napi->skb = NULL;
2527 }
2528
2529 int netdev_rx_handler_register(struct net_device *dev,
2530 rx_handler_func_t *rx_handler,
2531 void *rx_handler_data);
2532 void netdev_rx_handler_unregister(struct net_device *dev);
2533
2534 bool dev_valid_name(const char *name);
2535 int dev_ioctl(struct net *net, unsigned int cmd, void __user *);
2536 int dev_ethtool(struct net *net, struct ifreq *);
2537 unsigned int dev_get_flags(const struct net_device *);
2538 int __dev_change_flags(struct net_device *, unsigned int flags);
2539 int dev_change_flags(struct net_device *, unsigned int);
2540 void __dev_notify_flags(struct net_device *, unsigned int old_flags,
2541 unsigned int gchanges);
2542 int dev_change_name(struct net_device *, const char *);
2543 int dev_set_alias(struct net_device *, const char *, size_t);
2544 int dev_change_net_namespace(struct net_device *, struct net *, const char *);
2545 int dev_set_mtu(struct net_device *, int);
2546 void dev_set_group(struct net_device *, int);
2547 int dev_set_mac_address(struct net_device *, struct sockaddr *);
2548 int dev_change_carrier(struct net_device *, bool new_carrier);
2549 int dev_get_phys_port_id(struct net_device *dev,
2550 struct netdev_phys_port_id *ppid);
2551 int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
2552 struct netdev_queue *txq);
2553 int dev_forward_skb(struct net_device *dev, struct sk_buff *skb);
2554
2555 extern int netdev_budget;
2556
2557 /* Called by rtnetlink.c:rtnl_unlock() */
2558 void netdev_run_todo(void);
2559
2560 /**
2561 * dev_put - release reference to device
2562 * @dev: network device
2563 *
2564 * Release reference to device to allow it to be freed.
2565 */
2566 static inline void dev_put(struct net_device *dev)
2567 {
2568 this_cpu_dec(*dev->pcpu_refcnt);
2569 }
2570
2571 /**
2572 * dev_hold - get reference to device
2573 * @dev: network device
2574 *
2575 * Hold reference to device to keep it from being freed.
2576 */
2577 static inline void dev_hold(struct net_device *dev)
2578 {
2579 this_cpu_inc(*dev->pcpu_refcnt);
2580 }
2581
2582 /* Carrier loss detection, dial on demand. The functions netif_carrier_on
2583 * and _off may be called from IRQ context, but it is caller
2584 * who is responsible for serialization of these calls.
2585 *
2586 * The name carrier is inappropriate, these functions should really be
2587 * called netif_lowerlayer_*() because they represent the state of any
2588 * kind of lower layer not just hardware media.
2589 */
2590
2591 void linkwatch_init_dev(struct net_device *dev);
2592 void linkwatch_fire_event(struct net_device *dev);
2593 void linkwatch_forget_dev(struct net_device *dev);
2594
2595 /**
2596 * netif_carrier_ok - test if carrier present
2597 * @dev: network device
2598 *
2599 * Check if carrier is present on device
2600 */
2601 static inline bool netif_carrier_ok(const struct net_device *dev)
2602 {
2603 return !test_bit(__LINK_STATE_NOCARRIER, &dev->state);
2604 }
2605
2606 unsigned long dev_trans_start(struct net_device *dev);
2607
2608 void __netdev_watchdog_up(struct net_device *dev);
2609
2610 void netif_carrier_on(struct net_device *dev);
2611
2612 void netif_carrier_off(struct net_device *dev);
2613
2614 /**
2615 * netif_dormant_on - mark device as dormant.
2616 * @dev: network device
2617 *
2618 * Mark device as dormant (as per RFC2863).
2619 *
2620 * The dormant state indicates that the relevant interface is not
2621 * actually in a condition to pass packets (i.e., it is not 'up') but is
2622 * in a "pending" state, waiting for some external event. For "on-
2623 * demand" interfaces, this new state identifies the situation where the
2624 * interface is waiting for events to place it in the up state.
2625 *
2626 */
2627 static inline void netif_dormant_on(struct net_device *dev)
2628 {
2629 if (!test_and_set_bit(__LINK_STATE_DORMANT, &dev->state))
2630 linkwatch_fire_event(dev);
2631 }
2632
2633 /**
2634 * netif_dormant_off - set device as not dormant.
2635 * @dev: network device
2636 *
2637 * Device is not in dormant state.
2638 */
2639 static inline void netif_dormant_off(struct net_device *dev)
2640 {
2641 if (test_and_clear_bit(__LINK_STATE_DORMANT, &dev->state))
2642 linkwatch_fire_event(dev);
2643 }
2644
2645 /**
2646 * netif_dormant - test if carrier present
2647 * @dev: network device
2648 *
2649 * Check if carrier is present on device
2650 */
2651 static inline bool netif_dormant(const struct net_device *dev)
2652 {
2653 return test_bit(__LINK_STATE_DORMANT, &dev->state);
2654 }
2655
2656
2657 /**
2658 * netif_oper_up - test if device is operational
2659 * @dev: network device
2660 *
2661 * Check if carrier is operational
2662 */
2663 static inline bool netif_oper_up(const struct net_device *dev)
2664 {
2665 return (dev->operstate == IF_OPER_UP ||
2666 dev->operstate == IF_OPER_UNKNOWN /* backward compat */);
2667 }
2668
2669 /**
2670 * netif_device_present - is device available or removed
2671 * @dev: network device
2672 *
2673 * Check if device has not been removed from system.
2674 */
2675 static inline bool netif_device_present(struct net_device *dev)
2676 {
2677 return test_bit(__LINK_STATE_PRESENT, &dev->state);
2678 }
2679
2680 void netif_device_detach(struct net_device *dev);
2681
2682 void netif_device_attach(struct net_device *dev);
2683
2684 /*
2685 * Network interface message level settings
2686 */
2687
2688 enum {
2689 NETIF_MSG_DRV = 0x0001,
2690 NETIF_MSG_PROBE = 0x0002,
2691 NETIF_MSG_LINK = 0x0004,
2692 NETIF_MSG_TIMER = 0x0008,
2693 NETIF_MSG_IFDOWN = 0x0010,
2694 NETIF_MSG_IFUP = 0x0020,
2695 NETIF_MSG_RX_ERR = 0x0040,
2696 NETIF_MSG_TX_ERR = 0x0080,
2697 NETIF_MSG_TX_QUEUED = 0x0100,
2698 NETIF_MSG_INTR = 0x0200,
2699 NETIF_MSG_TX_DONE = 0x0400,
2700 NETIF_MSG_RX_STATUS = 0x0800,
2701 NETIF_MSG_PKTDATA = 0x1000,
2702 NETIF_MSG_HW = 0x2000,
2703 NETIF_MSG_WOL = 0x4000,
2704 };
2705
2706 #define netif_msg_drv(p) ((p)->msg_enable & NETIF_MSG_DRV)
2707 #define netif_msg_probe(p) ((p)->msg_enable & NETIF_MSG_PROBE)
2708 #define netif_msg_link(p) ((p)->msg_enable & NETIF_MSG_LINK)
2709 #define netif_msg_timer(p) ((p)->msg_enable & NETIF_MSG_TIMER)
2710 #define netif_msg_ifdown(p) ((p)->msg_enable & NETIF_MSG_IFDOWN)
2711 #define netif_msg_ifup(p) ((p)->msg_enable & NETIF_MSG_IFUP)
2712 #define netif_msg_rx_err(p) ((p)->msg_enable & NETIF_MSG_RX_ERR)
2713 #define netif_msg_tx_err(p) ((p)->msg_enable & NETIF_MSG_TX_ERR)
2714 #define netif_msg_tx_queued(p) ((p)->msg_enable & NETIF_MSG_TX_QUEUED)
2715 #define netif_msg_intr(p) ((p)->msg_enable & NETIF_MSG_INTR)
2716 #define netif_msg_tx_done(p) ((p)->msg_enable & NETIF_MSG_TX_DONE)
2717 #define netif_msg_rx_status(p) ((p)->msg_enable & NETIF_MSG_RX_STATUS)
2718 #define netif_msg_pktdata(p) ((p)->msg_enable & NETIF_MSG_PKTDATA)
2719 #define netif_msg_hw(p) ((p)->msg_enable & NETIF_MSG_HW)
2720 #define netif_msg_wol(p) ((p)->msg_enable & NETIF_MSG_WOL)
2721
2722 static inline u32 netif_msg_init(int debug_value, int default_msg_enable_bits)
2723 {
2724 /* use default */
2725 if (debug_value < 0 || debug_value >= (sizeof(u32) * 8))
2726 return default_msg_enable_bits;
2727 if (debug_value == 0) /* no output */
2728 return 0;
2729 /* set low N bits */
2730 return (1 << debug_value) - 1;
2731 }
2732
2733 static inline void __netif_tx_lock(struct netdev_queue *txq, int cpu)
2734 {
2735 spin_lock(&txq->_xmit_lock);
2736 txq->xmit_lock_owner = cpu;
2737 }
2738
2739 static inline void __netif_tx_lock_bh(struct netdev_queue *txq)
2740 {
2741 spin_lock_bh(&txq->_xmit_lock);
2742 txq->xmit_lock_owner = smp_processor_id();
2743 }
2744
2745 static inline bool __netif_tx_trylock(struct netdev_queue *txq)
2746 {
2747 bool ok = spin_trylock(&txq->_xmit_lock);
2748 if (likely(ok))
2749 txq->xmit_lock_owner = smp_processor_id();
2750 return ok;
2751 }
2752
2753 static inline void __netif_tx_unlock(struct netdev_queue *txq)
2754 {
2755 txq->xmit_lock_owner = -1;
2756 spin_unlock(&txq->_xmit_lock);
2757 }
2758
2759 static inline void __netif_tx_unlock_bh(struct netdev_queue *txq)
2760 {
2761 txq->xmit_lock_owner = -1;
2762 spin_unlock_bh(&txq->_xmit_lock);
2763 }
2764
2765 static inline void txq_trans_update(struct netdev_queue *txq)
2766 {
2767 if (txq->xmit_lock_owner != -1)
2768 txq->trans_start = jiffies;
2769 }
2770
2771 /**
2772 * netif_tx_lock - grab network device transmit lock
2773 * @dev: network device
2774 *
2775 * Get network device transmit lock
2776 */
2777 static inline void netif_tx_lock(struct net_device *dev)
2778 {
2779 unsigned int i;
2780 int cpu;
2781
2782 spin_lock(&dev->tx_global_lock);
2783 cpu = smp_processor_id();
2784 for (i = 0; i < dev->num_tx_queues; i++) {
2785 struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
2786
2787 /* We are the only thread of execution doing a
2788 * freeze, but we have to grab the _xmit_lock in
2789 * order to synchronize with threads which are in
2790 * the ->hard_start_xmit() handler and already
2791 * checked the frozen bit.
2792 */
2793 __netif_tx_lock(txq, cpu);
2794 set_bit(__QUEUE_STATE_FROZEN, &txq->state);
2795 __netif_tx_unlock(txq);
2796 }
2797 }
2798
2799 static inline void netif_tx_lock_bh(struct net_device *dev)
2800 {
2801 local_bh_disable();
2802 netif_tx_lock(dev);
2803 }
2804
2805 static inline void netif_tx_unlock(struct net_device *dev)
2806 {
2807 unsigned int i;
2808
2809 for (i = 0; i < dev->num_tx_queues; i++) {
2810 struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
2811
2812 /* No need to grab the _xmit_lock here. If the
2813 * queue is not stopped for another reason, we
2814 * force a schedule.
2815 */
2816 clear_bit(__QUEUE_STATE_FROZEN, &txq->state);
2817 netif_schedule_queue(txq);
2818 }
2819 spin_unlock(&dev->tx_global_lock);
2820 }
2821
2822 static inline void netif_tx_unlock_bh(struct net_device *dev)
2823 {
2824 netif_tx_unlock(dev);
2825 local_bh_enable();
2826 }
2827
2828 #define HARD_TX_LOCK(dev, txq, cpu) { \
2829 if ((dev->features & NETIF_F_LLTX) == 0) { \
2830 __netif_tx_lock(txq, cpu); \
2831 } \
2832 }
2833
2834 #define HARD_TX_UNLOCK(dev, txq) { \
2835 if ((dev->features & NETIF_F_LLTX) == 0) { \
2836 __netif_tx_unlock(txq); \
2837 } \
2838 }
2839
2840 static inline void netif_tx_disable(struct net_device *dev)
2841 {
2842 unsigned int i;
2843 int cpu;
2844
2845 local_bh_disable();
2846 cpu = smp_processor_id();
2847 for (i = 0; i < dev->num_tx_queues; i++) {
2848 struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
2849
2850 __netif_tx_lock(txq, cpu);
2851 netif_tx_stop_queue(txq);
2852 __netif_tx_unlock(txq);
2853 }
2854 local_bh_enable();
2855 }
2856
2857 static inline void netif_addr_lock(struct net_device *dev)
2858 {
2859 spin_lock(&dev->addr_list_lock);
2860 }
2861
2862 static inline void netif_addr_lock_nested(struct net_device *dev)
2863 {
2864 spin_lock_nested(&dev->addr_list_lock, SINGLE_DEPTH_NESTING);
2865 }
2866
2867 static inline void netif_addr_lock_bh(struct net_device *dev)
2868 {
2869 spin_lock_bh(&dev->addr_list_lock);
2870 }
2871
2872 static inline void netif_addr_unlock(struct net_device *dev)
2873 {
2874 spin_unlock(&dev->addr_list_lock);
2875 }
2876
2877 static inline void netif_addr_unlock_bh(struct net_device *dev)
2878 {
2879 spin_unlock_bh(&dev->addr_list_lock);
2880 }
2881
2882 /*
2883 * dev_addrs walker. Should be used only for read access. Call with
2884 * rcu_read_lock held.
2885 */
2886 #define for_each_dev_addr(dev, ha) \
2887 list_for_each_entry_rcu(ha, &dev->dev_addrs.list, list)
2888
2889 /* These functions live elsewhere (drivers/net/net_init.c, but related) */
2890
2891 void ether_setup(struct net_device *dev);
2892
2893 /* Support for loadable net-drivers */
2894 struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
2895 void (*setup)(struct net_device *),
2896 unsigned int txqs, unsigned int rxqs);
2897 #define alloc_netdev(sizeof_priv, name, setup) \
2898 alloc_netdev_mqs(sizeof_priv, name, setup, 1, 1)
2899
2900 #define alloc_netdev_mq(sizeof_priv, name, setup, count) \
2901 alloc_netdev_mqs(sizeof_priv, name, setup, count, count)
2902
2903 int register_netdev(struct net_device *dev);
2904 void unregister_netdev(struct net_device *dev);
2905
2906 /* General hardware address lists handling functions */
2907 int __hw_addr_sync(struct netdev_hw_addr_list *to_list,
2908 struct netdev_hw_addr_list *from_list, int addr_len);
2909 void __hw_addr_unsync(struct netdev_hw_addr_list *to_list,
2910 struct netdev_hw_addr_list *from_list, int addr_len);
2911 void __hw_addr_init(struct netdev_hw_addr_list *list);
2912
2913 /* Functions used for device addresses handling */
2914 int dev_addr_add(struct net_device *dev, const unsigned char *addr,
2915 unsigned char addr_type);
2916 int dev_addr_del(struct net_device *dev, const unsigned char *addr,
2917 unsigned char addr_type);
2918 void dev_addr_flush(struct net_device *dev);
2919 int dev_addr_init(struct net_device *dev);
2920
2921 /* Functions used for unicast addresses handling */
2922 int dev_uc_add(struct net_device *dev, const unsigned char *addr);
2923 int dev_uc_add_excl(struct net_device *dev, const unsigned char *addr);
2924 int dev_uc_del(struct net_device *dev, const unsigned char *addr);
2925 int dev_uc_sync(struct net_device *to, struct net_device *from);
2926 int dev_uc_sync_multiple(struct net_device *to, struct net_device *from);
2927 void dev_uc_unsync(struct net_device *to, struct net_device *from);
2928 void dev_uc_flush(struct net_device *dev);
2929 void dev_uc_init(struct net_device *dev);
2930
2931 /* Functions used for multicast addresses handling */
2932 int dev_mc_add(struct net_device *dev, const unsigned char *addr);
2933 int dev_mc_add_global(struct net_device *dev, const unsigned char *addr);
2934 int dev_mc_add_excl(struct net_device *dev, const unsigned char *addr);
2935 int dev_mc_del(struct net_device *dev, const unsigned char *addr);
2936 int dev_mc_del_global(struct net_device *dev, const unsigned char *addr);
2937 int dev_mc_sync(struct net_device *to, struct net_device *from);
2938 int dev_mc_sync_multiple(struct net_device *to, struct net_device *from);
2939 void dev_mc_unsync(struct net_device *to, struct net_device *from);
2940 void dev_mc_flush(struct net_device *dev);
2941 void dev_mc_init(struct net_device *dev);
2942
2943 /* Functions used for secondary unicast and multicast support */
2944 void dev_set_rx_mode(struct net_device *dev);
2945 void __dev_set_rx_mode(struct net_device *dev);
2946 int dev_set_promiscuity(struct net_device *dev, int inc);
2947 int dev_set_allmulti(struct net_device *dev, int inc);
2948 void netdev_state_change(struct net_device *dev);
2949 void netdev_notify_peers(struct net_device *dev);
2950 void netdev_features_change(struct net_device *dev);
2951 /* Load a device via the kmod */
2952 void dev_load(struct net *net, const char *name);
2953 struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev,
2954 struct rtnl_link_stats64 *storage);
2955 void netdev_stats_to_stats64(struct rtnl_link_stats64 *stats64,
2956 const struct net_device_stats *netdev_stats);
2957
2958 extern int netdev_max_backlog;
2959 extern int netdev_tstamp_prequeue;
2960 extern int weight_p;
2961 extern int bpf_jit_enable;
2962
2963 bool netdev_has_upper_dev(struct net_device *dev, struct net_device *upper_dev);
2964 struct net_device *netdev_all_upper_get_next_dev_rcu(struct net_device *dev,
2965 struct list_head **iter);
2966
2967 /* iterate through upper list, must be called under RCU read lock */
2968 #define netdev_for_each_all_upper_dev_rcu(dev, updev, iter) \
2969 for (iter = &(dev)->all_adj_list.upper, \
2970 updev = netdev_all_upper_get_next_dev_rcu(dev, &(iter)); \
2971 updev; \
2972 updev = netdev_all_upper_get_next_dev_rcu(dev, &(iter)))
2973
2974 void *netdev_lower_get_next_private(struct net_device *dev,
2975 struct list_head **iter);
2976 void *netdev_lower_get_next_private_rcu(struct net_device *dev,
2977 struct list_head **iter);
2978
2979 #define netdev_for_each_lower_private(dev, priv, iter) \
2980 for (iter = (dev)->adj_list.lower.next, \
2981 priv = netdev_lower_get_next_private(dev, &(iter)); \
2982 priv; \
2983 priv = netdev_lower_get_next_private(dev, &(iter)))
2984
2985 #define netdev_for_each_lower_private_rcu(dev, priv, iter) \
2986 for (iter = &(dev)->adj_list.lower, \
2987 priv = netdev_lower_get_next_private_rcu(dev, &(iter)); \
2988 priv; \
2989 priv = netdev_lower_get_next_private_rcu(dev, &(iter)))
2990
2991 void *netdev_adjacent_get_private(struct list_head *adj_list);
2992 void *netdev_lower_get_first_private_rcu(struct net_device *dev);
2993 struct net_device *netdev_master_upper_dev_get(struct net_device *dev);
2994 struct net_device *netdev_master_upper_dev_get_rcu(struct net_device *dev);
2995 int netdev_upper_dev_link(struct net_device *dev, struct net_device *upper_dev);
2996 int netdev_master_upper_dev_link(struct net_device *dev,
2997 struct net_device *upper_dev);
2998 int netdev_master_upper_dev_link_private(struct net_device *dev,
2999 struct net_device *upper_dev,
3000 void *private);
3001 void netdev_upper_dev_unlink(struct net_device *dev,
3002 struct net_device *upper_dev);
3003 void netdev_adjacent_rename_links(struct net_device *dev, char *oldname);
3004 void *netdev_lower_dev_get_private(struct net_device *dev,
3005 struct net_device *lower_dev);
3006 int skb_checksum_help(struct sk_buff *skb);
3007 struct sk_buff *__skb_gso_segment(struct sk_buff *skb,
3008 netdev_features_t features, bool tx_path);
3009 struct sk_buff *skb_mac_gso_segment(struct sk_buff *skb,
3010 netdev_features_t features);
3011
3012 static inline
3013 struct sk_buff *skb_gso_segment(struct sk_buff *skb, netdev_features_t features)
3014 {
3015 return __skb_gso_segment(skb, features, true);
3016 }
3017 __be16 skb_network_protocol(struct sk_buff *skb, int *depth);
3018
3019 static inline bool can_checksum_protocol(netdev_features_t features,
3020 __be16 protocol)
3021 {
3022 return ((features & NETIF_F_GEN_CSUM) ||
3023 ((features & NETIF_F_V4_CSUM) &&
3024 protocol == htons(ETH_P_IP)) ||
3025 ((features & NETIF_F_V6_CSUM) &&
3026 protocol == htons(ETH_P_IPV6)) ||
3027 ((features & NETIF_F_FCOE_CRC) &&
3028 protocol == htons(ETH_P_FCOE)));
3029 }
3030
3031 #ifdef CONFIG_BUG
3032 void netdev_rx_csum_fault(struct net_device *dev);
3033 #else
3034 static inline void netdev_rx_csum_fault(struct net_device *dev)
3035 {
3036 }
3037 #endif
3038 /* rx skb timestamps */
3039 void net_enable_timestamp(void);
3040 void net_disable_timestamp(void);
3041
3042 #ifdef CONFIG_PROC_FS
3043 int __init dev_proc_init(void);
3044 #else
3045 #define dev_proc_init() 0
3046 #endif
3047
3048 int netdev_class_create_file_ns(struct class_attribute *class_attr,
3049 const void *ns);
3050 void netdev_class_remove_file_ns(struct class_attribute *class_attr,
3051 const void *ns);
3052
3053 static inline int netdev_class_create_file(struct class_attribute *class_attr)
3054 {
3055 return netdev_class_create_file_ns(class_attr, NULL);
3056 }
3057
3058 static inline void netdev_class_remove_file(struct class_attribute *class_attr)
3059 {
3060 netdev_class_remove_file_ns(class_attr, NULL);
3061 }
3062
3063 extern struct kobj_ns_type_operations net_ns_type_operations;
3064
3065 const char *netdev_drivername(const struct net_device *dev);
3066
3067 void linkwatch_run_queue(void);
3068
3069 static inline netdev_features_t netdev_get_wanted_features(
3070 struct net_device *dev)
3071 {
3072 return (dev->features & ~dev->hw_features) | dev->wanted_features;
3073 }
3074 netdev_features_t netdev_increment_features(netdev_features_t all,
3075 netdev_features_t one, netdev_features_t mask);
3076
3077 /* Allow TSO being used on stacked device :
3078 * Performing the GSO segmentation before last device
3079 * is a performance improvement.
3080 */
3081 static inline netdev_features_t netdev_add_tso_features(netdev_features_t features,
3082 netdev_features_t mask)
3083 {
3084 return netdev_increment_features(features, NETIF_F_ALL_TSO, mask);
3085 }
3086
3087 int __netdev_update_features(struct net_device *dev);
3088 void netdev_update_features(struct net_device *dev);
3089 void netdev_change_features(struct net_device *dev);
3090
3091 void netif_stacked_transfer_operstate(const struct net_device *rootdev,
3092 struct net_device *dev);
3093
3094 netdev_features_t netif_skb_dev_features(struct sk_buff *skb,
3095 const struct net_device *dev);
3096 static inline netdev_features_t netif_skb_features(struct sk_buff *skb)
3097 {
3098 return netif_skb_dev_features(skb, skb->dev);
3099 }
3100
3101 static inline bool net_gso_ok(netdev_features_t features, int gso_type)
3102 {
3103 netdev_features_t feature = gso_type << NETIF_F_GSO_SHIFT;
3104
3105 /* check flags correspondence */
3106 BUILD_BUG_ON(SKB_GSO_TCPV4 != (NETIF_F_TSO >> NETIF_F_GSO_SHIFT));
3107 BUILD_BUG_ON(SKB_GSO_UDP != (NETIF_F_UFO >> NETIF_F_GSO_SHIFT));
3108 BUILD_BUG_ON(SKB_GSO_DODGY != (NETIF_F_GSO_ROBUST >> NETIF_F_GSO_SHIFT));
3109 BUILD_BUG_ON(SKB_GSO_TCP_ECN != (NETIF_F_TSO_ECN >> NETIF_F_GSO_SHIFT));
3110 BUILD_BUG_ON(SKB_GSO_TCPV6 != (NETIF_F_TSO6 >> NETIF_F_GSO_SHIFT));
3111 BUILD_BUG_ON(SKB_GSO_FCOE != (NETIF_F_FSO >> NETIF_F_GSO_SHIFT));
3112
3113 return (features & feature) == feature;
3114 }
3115
3116 static inline bool skb_gso_ok(struct sk_buff *skb, netdev_features_t features)
3117 {
3118 return net_gso_ok(features, skb_shinfo(skb)->gso_type) &&
3119 (!skb_has_frag_list(skb) || (features & NETIF_F_FRAGLIST));
3120 }
3121
3122 static inline bool netif_needs_gso(struct sk_buff *skb,
3123 netdev_features_t features)
3124 {
3125 return skb_is_gso(skb) && (!skb_gso_ok(skb, features) ||
3126 unlikely((skb->ip_summed != CHECKSUM_PARTIAL) &&
3127 (skb->ip_summed != CHECKSUM_UNNECESSARY)));
3128 }
3129
3130 static inline void netif_set_gso_max_size(struct net_device *dev,
3131 unsigned int size)
3132 {
3133 dev->gso_max_size = size;
3134 }
3135
3136 static inline void skb_gso_error_unwind(struct sk_buff *skb, __be16 protocol,
3137 int pulled_hlen, u16 mac_offset,
3138 int mac_len)
3139 {
3140 skb->protocol = protocol;
3141 skb->encapsulation = 1;
3142 skb_push(skb, pulled_hlen);
3143 skb_reset_transport_header(skb);
3144 skb->mac_header = mac_offset;
3145 skb->network_header = skb->mac_header + mac_len;
3146 skb->mac_len = mac_len;
3147 }
3148
3149 static inline bool netif_is_macvlan(struct net_device *dev)
3150 {
3151 return dev->priv_flags & IFF_MACVLAN;
3152 }
3153
3154 static inline bool netif_is_bond_master(struct net_device *dev)
3155 {
3156 return dev->flags & IFF_MASTER && dev->priv_flags & IFF_BONDING;
3157 }
3158
3159 static inline bool netif_is_bond_slave(struct net_device *dev)
3160 {
3161 return dev->flags & IFF_SLAVE && dev->priv_flags & IFF_BONDING;
3162 }
3163
3164 static inline bool netif_supports_nofcs(struct net_device *dev)
3165 {
3166 return dev->priv_flags & IFF_SUPP_NOFCS;
3167 }
3168
3169 extern struct pernet_operations __net_initdata loopback_net_ops;
3170
3171 /* Logging, debugging and troubleshooting/diagnostic helpers. */
3172
3173 /* netdev_printk helpers, similar to dev_printk */
3174
3175 static inline const char *netdev_name(const struct net_device *dev)
3176 {
3177 if (dev->reg_state != NETREG_REGISTERED)
3178 return "(unregistered net_device)";
3179 return dev->name;
3180 }
3181
3182 __printf(3, 4)
3183 int netdev_printk(const char *level, const struct net_device *dev,
3184 const char *format, ...);
3185 __printf(2, 3)
3186 int netdev_emerg(const struct net_device *dev, const char *format, ...);
3187 __printf(2, 3)
3188 int netdev_alert(const struct net_device *dev, const char *format, ...);
3189 __printf(2, 3)
3190 int netdev_crit(const struct net_device *dev, const char *format, ...);
3191 __printf(2, 3)
3192 int netdev_err(const struct net_device *dev, const char *format, ...);
3193 __printf(2, 3)
3194 int netdev_warn(const struct net_device *dev, const char *format, ...);
3195 __printf(2, 3)
3196 int netdev_notice(const struct net_device *dev, const char *format, ...);
3197 __printf(2, 3)
3198 int netdev_info(const struct net_device *dev, const char *format, ...);
3199
3200 #define MODULE_ALIAS_NETDEV(device) \
3201 MODULE_ALIAS("netdev-" device)
3202
3203 #if defined(CONFIG_DYNAMIC_DEBUG)
3204 #define netdev_dbg(__dev, format, args...) \
3205 do { \
3206 dynamic_netdev_dbg(__dev, format, ##args); \
3207 } while (0)
3208 #elif defined(DEBUG)
3209 #define netdev_dbg(__dev, format, args...) \
3210 netdev_printk(KERN_DEBUG, __dev, format, ##args)
3211 #else
3212 #define netdev_dbg(__dev, format, args...) \
3213 ({ \
3214 if (0) \
3215 netdev_printk(KERN_DEBUG, __dev, format, ##args); \
3216 0; \
3217 })
3218 #endif
3219
3220 #if defined(VERBOSE_DEBUG)
3221 #define netdev_vdbg netdev_dbg
3222 #else
3223
3224 #define netdev_vdbg(dev, format, args...) \
3225 ({ \
3226 if (0) \
3227 netdev_printk(KERN_DEBUG, dev, format, ##args); \
3228 0; \
3229 })
3230 #endif
3231
3232 /*
3233 * netdev_WARN() acts like dev_printk(), but with the key difference
3234 * of using a WARN/WARN_ON to get the message out, including the
3235 * file/line information and a backtrace.
3236 */
3237 #define netdev_WARN(dev, format, args...) \
3238 WARN(1, "netdevice: %s\n" format, netdev_name(dev), ##args)
3239
3240 /* netif printk helpers, similar to netdev_printk */
3241
3242 #define netif_printk(priv, type, level, dev, fmt, args...) \
3243 do { \
3244 if (netif_msg_##type(priv)) \
3245 netdev_printk(level, (dev), fmt, ##args); \
3246 } while (0)
3247
3248 #define netif_level(level, priv, type, dev, fmt, args...) \
3249 do { \
3250 if (netif_msg_##type(priv)) \
3251 netdev_##level(dev, fmt, ##args); \
3252 } while (0)
3253
3254 #define netif_emerg(priv, type, dev, fmt, args...) \
3255 netif_level(emerg, priv, type, dev, fmt, ##args)
3256 #define netif_alert(priv, type, dev, fmt, args...) \
3257 netif_level(alert, priv, type, dev, fmt, ##args)
3258 #define netif_crit(priv, type, dev, fmt, args...) \
3259 netif_level(crit, priv, type, dev, fmt, ##args)
3260 #define netif_err(priv, type, dev, fmt, args...) \
3261 netif_level(err, priv, type, dev, fmt, ##args)
3262 #define netif_warn(priv, type, dev, fmt, args...) \
3263 netif_level(warn, priv, type, dev, fmt, ##args)
3264 #define netif_notice(priv, type, dev, fmt, args...) \
3265 netif_level(notice, priv, type, dev, fmt, ##args)
3266 #define netif_info(priv, type, dev, fmt, args...) \
3267 netif_level(info, priv, type, dev, fmt, ##args)
3268
3269 #if defined(CONFIG_DYNAMIC_DEBUG)
3270 #define netif_dbg(priv, type, netdev, format, args...) \
3271 do { \
3272 if (netif_msg_##type(priv)) \
3273 dynamic_netdev_dbg(netdev, format, ##args); \
3274 } while (0)
3275 #elif defined(DEBUG)
3276 #define netif_dbg(priv, type, dev, format, args...) \
3277 netif_printk(priv, type, KERN_DEBUG, dev, format, ##args)
3278 #else
3279 #define netif_dbg(priv, type, dev, format, args...) \
3280 ({ \
3281 if (0) \
3282 netif_printk(priv, type, KERN_DEBUG, dev, format, ##args); \
3283 0; \
3284 })
3285 #endif
3286
3287 #if defined(VERBOSE_DEBUG)
3288 #define netif_vdbg netif_dbg
3289 #else
3290 #define netif_vdbg(priv, type, dev, format, args...) \
3291 ({ \
3292 if (0) \
3293 netif_printk(priv, type, KERN_DEBUG, dev, format, ##args); \
3294 0; \
3295 })
3296 #endif
3297
3298 /*
3299 * The list of packet types we will receive (as opposed to discard)
3300 * and the routines to invoke.
3301 *
3302 * Why 16. Because with 16 the only overlap we get on a hash of the
3303 * low nibble of the protocol value is RARP/SNAP/X.25.
3304 *
3305 * NOTE: That is no longer true with the addition of VLAN tags. Not
3306 * sure which should go first, but I bet it won't make much
3307 * difference if we are running VLANs. The good news is that
3308 * this protocol won't be in the list unless compiled in, so
3309 * the average user (w/out VLANs) will not be adversely affected.
3310 * --BLG
3311 *
3312 * 0800 IP
3313 * 8100 802.1Q VLAN
3314 * 0001 802.3
3315 * 0002 AX.25
3316 * 0004 802.2
3317 * 8035 RARP
3318 * 0005 SNAP
3319 * 0805 X.25
3320 * 0806 ARP
3321 * 8137 IPX
3322 * 0009 Localtalk
3323 * 86DD IPv6
3324 */
3325 #define PTYPE_HASH_SIZE (16)
3326 #define PTYPE_HASH_MASK (PTYPE_HASH_SIZE - 1)
3327
3328 #endif /* _LINUX_NETDEVICE_H */ 1 /*
2 * pci.h
3 *
4 * PCI defines and function prototypes
5 * Copyright 1994, Drew Eckhardt
6 * Copyright 1997--1999 Martin Mares <mj@ucw.cz>
7 *
8 * For more information, please consult the following manuals (look at
9 * http://www.pcisig.com/ for how to get them):
10 *
11 * PCI BIOS Specification
12 * PCI Local Bus Specification
13 * PCI to PCI Bridge Specification
14 * PCI System Design Guide
15 */
16 #ifndef LINUX_PCI_H
17 #define LINUX_PCI_H
18
19
20 #include <linux/mod_devicetable.h>
21
22 #include <linux/types.h>
23 #include <linux/init.h>
24 #include <linux/ioport.h>
25 #include <linux/list.h>
26 #include <linux/compiler.h>
27 #include <linux/errno.h>
28 #include <linux/kobject.h>
29 #include <linux/atomic.h>
30 #include <linux/device.h>
31 #include <linux/io.h>
32 #include <linux/irqreturn.h>
33 #include <uapi/linux/pci.h>
34
35 #include <linux/pci_ids.h>
36
37 /*
38 * The PCI interface treats multi-function devices as independent
39 * devices. The slot/function address of each device is encoded
40 * in a single byte as follows:
41 *
42 * 7:3 = slot
43 * 2:0 = function
44 *
45 * PCI_DEVFN(), PCI_SLOT(), and PCI_FUNC() are defined in uapi/linux/pci.h.
46 * In the interest of not exposing interfaces to user-space unnecessarily,
47 * the following kernel-only defines are being added here.
48 */
49 #define PCI_DEVID(bus, devfn) ((((u16)bus) << 8) | devfn)
50 /* return bus from PCI devid = ((u16)bus_number) << 8) | devfn */
51 #define PCI_BUS_NUM(x) (((x) >> 8) & 0xff)
52
53 /* pci_slot represents a physical slot */
54 struct pci_slot {
55 struct pci_bus *bus; /* The bus this slot is on */
56 struct list_head list; /* node in list of slots on this bus */
57 struct hotplug_slot *hotplug; /* Hotplug info (migrate over time) */
58 unsigned char number; /* PCI_SLOT(pci_dev->devfn) */
59 struct kobject kobj;
60 };
61
62 static inline const char *pci_slot_name(const struct pci_slot *slot)
63 {
64 return kobject_name(&slot->kobj);
65 }
66
67 /* File state for mmap()s on /proc/bus/pci/X/Y */
68 enum pci_mmap_state {
69 pci_mmap_io,
70 pci_mmap_mem
71 };
72
73 /* This defines the direction arg to the DMA mapping routines. */
74 #define PCI_DMA_BIDIRECTIONAL 0
75 #define PCI_DMA_TODEVICE 1
76 #define PCI_DMA_FROMDEVICE 2
77 #define PCI_DMA_NONE 3
78
79 /*
80 * For PCI devices, the region numbers are assigned this way:
81 */
82 enum {
83 /* #0-5: standard PCI resources */
84 PCI_STD_RESOURCES,
85 PCI_STD_RESOURCE_END = 5,
86
87 /* #6: expansion ROM resource */
88 PCI_ROM_RESOURCE,
89
90 /* device specific resources */
91 #ifdef CONFIG_PCI_IOV
92 PCI_IOV_RESOURCES,
93 PCI_IOV_RESOURCE_END = PCI_IOV_RESOURCES + PCI_SRIOV_NUM_BARS - 1,
94 #endif
95
96 /* resources assigned to buses behind the bridge */
97 #define PCI_BRIDGE_RESOURCE_NUM 4
98
99 PCI_BRIDGE_RESOURCES,
100 PCI_BRIDGE_RESOURCE_END = PCI_BRIDGE_RESOURCES +
101 PCI_BRIDGE_RESOURCE_NUM - 1,
102
103 /* total resources associated with a PCI device */
104 PCI_NUM_RESOURCES,
105
106 /* preserve this for compatibility */
107 DEVICE_COUNT_RESOURCE = PCI_NUM_RESOURCES,
108 };
109
110 typedef int __bitwise pci_power_t;
111
112 #define PCI_D0 ((pci_power_t __force) 0)
113 #define PCI_D1 ((pci_power_t __force) 1)
114 #define PCI_D2 ((pci_power_t __force) 2)
115 #define PCI_D3hot ((pci_power_t __force) 3)
116 #define PCI_D3cold ((pci_power_t __force) 4)
117 #define PCI_UNKNOWN ((pci_power_t __force) 5)
118 #define PCI_POWER_ERROR ((pci_power_t __force) -1)
119
120 /* Remember to update this when the list above changes! */
121 extern const char *pci_power_names[];
122
123 static inline const char *pci_power_name(pci_power_t state)
124 {
125 return pci_power_names[1 + (int) state];
126 }
127
128 #define PCI_PM_D2_DELAY 200
129 #define PCI_PM_D3_WAIT 10
130 #define PCI_PM_D3COLD_WAIT 100
131 #define PCI_PM_BUS_WAIT 50
132
133 /** The pci_channel state describes connectivity between the CPU and
134 * the pci device. If some PCI bus between here and the pci device
135 * has crashed or locked up, this info is reflected here.
136 */
137 typedef unsigned int __bitwise pci_channel_state_t;
138
139 enum pci_channel_state {
140 /* I/O channel is in normal state */
141 pci_channel_io_normal = (__force pci_channel_state_t) 1,
142
143 /* I/O to channel is blocked */
144 pci_channel_io_frozen = (__force pci_channel_state_t) 2,
145
146 /* PCI card is dead */
147 pci_channel_io_perm_failure = (__force pci_channel_state_t) 3,
148 };
149
150 typedef unsigned int __bitwise pcie_reset_state_t;
151
152 enum pcie_reset_state {
153 /* Reset is NOT asserted (Use to deassert reset) */
154 pcie_deassert_reset = (__force pcie_reset_state_t) 1,
155
156 /* Use #PERST to reset PCIe device */
157 pcie_warm_reset = (__force pcie_reset_state_t) 2,
158
159 /* Use PCIe Hot Reset to reset device */
160 pcie_hot_reset = (__force pcie_reset_state_t) 3
161 };
162
163 typedef unsigned short __bitwise pci_dev_flags_t;
164 enum pci_dev_flags {
165 /* INTX_DISABLE in PCI_COMMAND register disables MSI
166 * generation too.
167 */
168 PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG = (__force pci_dev_flags_t) 1,
169 /* Device configuration is irrevocably lost if disabled into D3 */
170 PCI_DEV_FLAGS_NO_D3 = (__force pci_dev_flags_t) 2,
171 /* Provide indication device is assigned by a Virtual Machine Manager */
172 PCI_DEV_FLAGS_ASSIGNED = (__force pci_dev_flags_t) 4,
173 };
174
175 enum pci_irq_reroute_variant {
176 INTEL_IRQ_REROUTE_VARIANT = 1,
177 MAX_IRQ_REROUTE_VARIANTS = 3
178 };
179
180 typedef unsigned short __bitwise pci_bus_flags_t;
181 enum pci_bus_flags {
182 PCI_BUS_FLAGS_NO_MSI = (__force pci_bus_flags_t) 1,
183 PCI_BUS_FLAGS_NO_MMRBC = (__force pci_bus_flags_t) 2,
184 };
185
186 /* These values come from the PCI Express Spec */
187 enum pcie_link_width {
188 PCIE_LNK_WIDTH_RESRV = 0x00,
189 PCIE_LNK_X1 = 0x01,
190 PCIE_LNK_X2 = 0x02,
191 PCIE_LNK_X4 = 0x04,
192 PCIE_LNK_X8 = 0x08,
193 PCIE_LNK_X12 = 0x0C,
194 PCIE_LNK_X16 = 0x10,
195 PCIE_LNK_X32 = 0x20,
196 PCIE_LNK_WIDTH_UNKNOWN = 0xFF,
197 };
198
199 /* Based on the PCI Hotplug Spec, but some values are made up by us */
200 enum pci_bus_speed {
201 PCI_SPEED_33MHz = 0x00,
202 PCI_SPEED_66MHz = 0x01,
203 PCI_SPEED_66MHz_PCIX = 0x02,
204 PCI_SPEED_100MHz_PCIX = 0x03,
205 PCI_SPEED_133MHz_PCIX = 0x04,
206 PCI_SPEED_66MHz_PCIX_ECC = 0x05,
207 PCI_SPEED_100MHz_PCIX_ECC = 0x06,
208 PCI_SPEED_133MHz_PCIX_ECC = 0x07,
209 PCI_SPEED_66MHz_PCIX_266 = 0x09,
210 PCI_SPEED_100MHz_PCIX_266 = 0x0a,
211 PCI_SPEED_133MHz_PCIX_266 = 0x0b,
212 AGP_UNKNOWN = 0x0c,
213 AGP_1X = 0x0d,
214 AGP_2X = 0x0e,
215 AGP_4X = 0x0f,
216 AGP_8X = 0x10,
217 PCI_SPEED_66MHz_PCIX_533 = 0x11,
218 PCI_SPEED_100MHz_PCIX_533 = 0x12,
219 PCI_SPEED_133MHz_PCIX_533 = 0x13,
220 PCIE_SPEED_2_5GT = 0x14,
221 PCIE_SPEED_5_0GT = 0x15,
222 PCIE_SPEED_8_0GT = 0x16,
223 PCI_SPEED_UNKNOWN = 0xff,
224 };
225
226 struct pci_cap_saved_data {
227 u16 cap_nr;
228 bool cap_extended;
229 unsigned int size;
230 u32 data[0];
231 };
232
233 struct pci_cap_saved_state {
234 struct hlist_node next;
235 struct pci_cap_saved_data cap;
236 };
237
238 struct pcie_link_state;
239 struct pci_vpd;
240 struct pci_sriov;
241 struct pci_ats;
242
243 /*
244 * The pci_dev structure is used to describe PCI devices.
245 */
246 struct pci_dev {
247 struct list_head bus_list; /* node in per-bus list */
248 struct pci_bus *bus; /* bus this device is on */
249 struct pci_bus *subordinate; /* bus this device bridges to */
250
251 void *sysdata; /* hook for sys-specific extension */
252 struct proc_dir_entry *procent; /* device entry in /proc/bus/pci */
253 struct pci_slot *slot; /* Physical slot this device is in */
254
255 unsigned int devfn; /* encoded device & function index */
256 unsigned short vendor;
257 unsigned short device;
258 unsigned short subsystem_vendor;
259 unsigned short subsystem_device;
260 unsigned int class; /* 3 bytes: (base,sub,prog-if) */
261 u8 revision; /* PCI revision, low byte of class word */
262 u8 hdr_type; /* PCI header type (`multi' flag masked out) */
263 u8 pcie_cap; /* PCIe capability offset */
264 u8 msi_cap; /* MSI capability offset */
265 u8 msix_cap; /* MSI-X capability offset */
266 u8 pcie_mpss:3; /* PCIe Max Payload Size Supported */
267 u8 rom_base_reg; /* which config register controls the ROM */
268 u8 pin; /* which interrupt pin this device uses */
269 u16 pcie_flags_reg; /* cached PCIe Capabilities Register */
270
271 struct pci_driver *driver; /* which driver has allocated this device */
272 u64 dma_mask; /* Mask of the bits of bus address this
273 device implements. Normally this is
274 0xffffffff. You only need to change
275 this if your device has broken DMA
276 or supports 64-bit transfers. */
277
278 struct device_dma_parameters dma_parms;
279
280 pci_power_t current_state; /* Current operating state. In ACPI-speak,
281 this is D0-D3, D0 being fully functional,
282 and D3 being off. */
283 u8 pm_cap; /* PM capability offset */
284 unsigned int pme_support:5; /* Bitmask of states from which PME#
285 can be generated */
286 unsigned int pme_interrupt:1;
287 unsigned int pme_poll:1; /* Poll device's PME status bit */
288 unsigned int d1_support:1; /* Low power state D1 is supported */
289 unsigned int d2_support:1; /* Low power state D2 is supported */
290 unsigned int no_d1d2:1; /* D1 and D2 are forbidden */
291 unsigned int no_d3cold:1; /* D3cold is forbidden */
292 unsigned int d3cold_allowed:1; /* D3cold is allowed by user */
293 unsigned int mmio_always_on:1; /* disallow turning off io/mem
294 decoding during bar sizing */
295 unsigned int wakeup_prepared:1;
296 unsigned int runtime_d3cold:1; /* whether go through runtime
297 D3cold, not set for devices
298 powered on/off by the
299 corresponding bridge */
300 unsigned int d3_delay; /* D3->D0 transition time in ms */
301 unsigned int d3cold_delay; /* D3cold->D0 transition time in ms */
302
303 #ifdef CONFIG_PCIEASPM
304 struct pcie_link_state *link_state; /* ASPM link state */
305 #endif
306
307 pci_channel_state_t error_state; /* current connectivity state */
308 struct device dev; /* Generic device interface */
309
310 int cfg_size; /* Size of configuration space */
311
312 /*
313 * Instead of touching interrupt line and base address registers
314 * directly, use the values stored here. They might be different!
315 */
316 unsigned int irq;
317 struct resource resource[DEVICE_COUNT_RESOURCE]; /* I/O and memory regions + expansion ROMs */
318
319 bool match_driver; /* Skip attaching driver */
320 /* These fields are used by common fixups */
321 unsigned int transparent:1; /* Subtractive decode PCI bridge */
322 unsigned int multifunction:1;/* Part of multi-function device */
323 /* keep track of device state */
324 unsigned int is_added:1;
325 unsigned int is_busmaster:1; /* device is busmaster */
326 unsigned int no_msi:1; /* device may not use msi */
327 unsigned int block_cfg_access:1; /* config space access is blocked */
328 unsigned int broken_parity_status:1; /* Device generates false positive parity */
329 unsigned int irq_reroute_variant:2; /* device needs IRQ rerouting variant */
330 unsigned int msi_enabled:1;
331 unsigned int msix_enabled:1;
332 unsigned int ari_enabled:1; /* ARI forwarding */
333 unsigned int is_managed:1;
334 unsigned int needs_freset:1; /* Dev requires fundamental reset */
335 unsigned int state_saved:1;
336 unsigned int is_physfn:1;
337 unsigned int is_virtfn:1;
338 unsigned int reset_fn:1;
339 unsigned int is_hotplug_bridge:1;
340 unsigned int __aer_firmware_first_valid:1;
341 unsigned int __aer_firmware_first:1;
342 unsigned int broken_intx_masking:1;
343 unsigned int io_window_1k:1; /* Intel P2P bridge 1K I/O windows */
344 pci_dev_flags_t dev_flags;
345 atomic_t enable_cnt; /* pci_enable_device has been called */
346
347 u32 saved_config_space[16]; /* config space saved at suspend time */
348 struct hlist_head saved_cap_space;
349 struct bin_attribute *rom_attr; /* attribute descriptor for sysfs ROM entry */
350 int rom_attr_enabled; /* has display of the rom attribute been enabled? */
351 struct bin_attribute *res_attr[DEVICE_COUNT_RESOURCE]; /* sysfs file for resources */
352 struct bin_attribute *res_attr_wc[DEVICE_COUNT_RESOURCE]; /* sysfs file for WC mapping of resources */
353 #ifdef CONFIG_PCI_MSI
354 struct list_head msi_list;
355 const struct attribute_group **msi_irq_groups;
356 #endif
357 struct pci_vpd *vpd;
358 #ifdef CONFIG_PCI_ATS
359 union {
360 struct pci_sriov *sriov; /* SR-IOV capability related */
361 struct pci_dev *physfn; /* the PF this VF is associated with */
362 };
363 struct pci_ats *ats; /* Address Translation Service */
364 #endif
365 phys_addr_t rom; /* Physical address of ROM if it's not from the BAR */
366 size_t romlen; /* Length of ROM if it's not from the BAR */
367 };
368
369 static inline struct pci_dev *pci_physfn(struct pci_dev *dev)
370 {
371 #ifdef CONFIG_PCI_IOV
372 if (dev->is_virtfn)
373 dev = dev->physfn;
374 #endif
375 return dev;
376 }
377
378 struct pci_dev *pci_alloc_dev(struct pci_bus *bus);
379
380 #define to_pci_dev(n) container_of(n, struct pci_dev, dev)
381 #define for_each_pci_dev(d) while ((d = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, d)) != NULL)
382
383 static inline int pci_channel_offline(struct pci_dev *pdev)
384 {
385 return (pdev->error_state != pci_channel_io_normal);
386 }
387
388 struct pci_host_bridge_window {
389 struct list_head list;
390 struct resource *res; /* host bridge aperture (CPU address) */
391 resource_size_t offset; /* bus address + offset = CPU address */
392 };
393
394 struct pci_host_bridge {
395 struct device dev;
396 struct pci_bus *bus; /* root bus */
397 struct list_head windows; /* pci_host_bridge_windows */
398 void (*release_fn)(struct pci_host_bridge *);
399 void *release_data;
400 };
401
402 #define to_pci_host_bridge(n) container_of(n, struct pci_host_bridge, dev)
403 void pci_set_host_bridge_release(struct pci_host_bridge *bridge,
404 void (*release_fn)(struct pci_host_bridge *),
405 void *release_data);
406
407 int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge);
408
409 /*
410 * The first PCI_BRIDGE_RESOURCE_NUM PCI bus resources (those that correspond
411 * to P2P or CardBus bridge windows) go in a table. Additional ones (for
412 * buses below host bridges or subtractive decode bridges) go in the list.
413 * Use pci_bus_for_each_resource() to iterate through all the resources.
414 */
415
416 /*
417 * PCI_SUBTRACTIVE_DECODE means the bridge forwards the window implicitly
418 * and there's no way to program the bridge with the details of the window.
419 * This does not apply to ACPI _CRS windows, even with the _DEC subtractive-
420 * decode bit set, because they are explicit and can be programmed with _SRS.
421 */
422 #define PCI_SUBTRACTIVE_DECODE 0x1
423
424 struct pci_bus_resource {
425 struct list_head list;
426 struct resource *res;
427 unsigned int flags;
428 };
429
430 #define PCI_REGION_FLAG_MASK 0x0fU /* These bits of resource flags tell us the PCI region flags */
431
432 struct pci_bus {
433 struct list_head node; /* node in list of buses */
434 struct pci_bus *parent; /* parent bus this bridge is on */
435 struct list_head children; /* list of child buses */
436 struct list_head devices; /* list of devices on this bus */
437 struct pci_dev *self; /* bridge device as seen by parent */
438 struct list_head slots; /* list of slots on this bus */
439 struct resource *resource[PCI_BRIDGE_RESOURCE_NUM];
440 struct list_head resources; /* address space routed to this bus */
441 struct resource busn_res; /* bus numbers routed to this bus */
442
443 struct pci_ops *ops; /* configuration access functions */
444 struct msi_chip *msi; /* MSI controller */
445 void *sysdata; /* hook for sys-specific extension */
446 struct proc_dir_entry *procdir; /* directory entry in /proc/bus/pci */
447
448 unsigned char number; /* bus number */
449 unsigned char primary; /* number of primary bridge */
450 unsigned char max_bus_speed; /* enum pci_bus_speed */
451 unsigned char cur_bus_speed; /* enum pci_bus_speed */
452
453 char name[48];
454
455 unsigned short bridge_ctl; /* manage NO_ISA/FBB/et al behaviors */
456 pci_bus_flags_t bus_flags; /* inherited by child buses */
457 struct device *bridge;
458 struct device dev;
459 struct bin_attribute *legacy_io; /* legacy I/O for this bus */
460 struct bin_attribute *legacy_mem; /* legacy mem */
461 unsigned int is_added:1;
462 };
463
464 #define pci_bus_b(n) list_entry(n, struct pci_bus, node)
465 #define to_pci_bus(n) container_of(n, struct pci_bus, dev)
466
467 /*
468 * Returns true if the PCI bus is root (behind host-PCI bridge),
469 * false otherwise
470 *
471 * Some code assumes that "bus->self == NULL" means that bus is a root bus.
472 * This is incorrect because "virtual" buses added for SR-IOV (via
473 * virtfn_add_bus()) have "bus->self == NULL" but are not root buses.
474 */
475 static inline bool pci_is_root_bus(struct pci_bus *pbus)
476 {
477 return !(pbus->parent);
478 }
479
480 static inline struct pci_dev *pci_upstream_bridge(struct pci_dev *dev)
481 {
482 dev = pci_physfn(dev);
483 if (pci_is_root_bus(dev->bus))
484 return NULL;
485
486 return dev->bus->self;
487 }
488
489 #ifdef CONFIG_PCI_MSI
490 static inline bool pci_dev_msi_enabled(struct pci_dev *pci_dev)
491 {
492 return pci_dev->msi_enabled || pci_dev->msix_enabled;
493 }
494 #else
495 static inline bool pci_dev_msi_enabled(struct pci_dev *pci_dev) { return false; }
496 #endif
497
498 /*
499 * Error values that may be returned by PCI functions.
500 */
501 #define PCIBIOS_SUCCESSFUL 0x00
502 #define PCIBIOS_FUNC_NOT_SUPPORTED 0x81
503 #define PCIBIOS_BAD_VENDOR_ID 0x83
504 #define PCIBIOS_DEVICE_NOT_FOUND 0x86
505 #define PCIBIOS_BAD_REGISTER_NUMBER 0x87
506 #define PCIBIOS_SET_FAILED 0x88
507 #define PCIBIOS_BUFFER_TOO_SMALL 0x89
508
509 /*
510 * Translate above to generic errno for passing back through non-PCI code.
511 */
512 static inline int pcibios_err_to_errno(int err)
513 {
514 if (err <= PCIBIOS_SUCCESSFUL)
515 return err; /* Assume already errno */
516
517 switch (err) {
518 case PCIBIOS_FUNC_NOT_SUPPORTED:
519 return -ENOENT;
520 case PCIBIOS_BAD_VENDOR_ID:
521 return -EINVAL;
522 case PCIBIOS_DEVICE_NOT_FOUND:
523 return -ENODEV;
524 case PCIBIOS_BAD_REGISTER_NUMBER:
525 return -EFAULT;
526 case PCIBIOS_SET_FAILED:
527 return -EIO;
528 case PCIBIOS_BUFFER_TOO_SMALL:
529 return -ENOSPC;
530 }
531
532 return -ENOTTY;
533 }
534
535 /* Low-level architecture-dependent routines */
536
537 struct pci_ops {
538 int (*read)(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *val);
539 int (*write)(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 val);
540 };
541
542 /*
543 * ACPI needs to be able to access PCI config space before we've done a
544 * PCI bus scan and created pci_bus structures.
545 */
546 int raw_pci_read(unsigned int domain, unsigned int bus, unsigned int devfn,
547 int reg, int len, u32 *val);
548 int raw_pci_write(unsigned int domain, unsigned int bus, unsigned int devfn,
549 int reg, int len, u32 val);
550
551 struct pci_bus_region {
552 dma_addr_t start;
553 dma_addr_t end;
554 };
555
556 struct pci_dynids {
557 spinlock_t lock; /* protects list, index */
558 struct list_head list; /* for IDs added at runtime */
559 };
560
561
562 /*
563 * PCI Error Recovery System (PCI-ERS). If a PCI device driver provides
564 * a set of callbacks in struct pci_error_handlers, that device driver
565 * will be notified of PCI bus errors, and will be driven to recovery
566 * when an error occurs.
567 */
568
569 typedef unsigned int __bitwise pci_ers_result_t;
570
571 enum pci_ers_result {
572 /* no result/none/not supported in device driver */
573 PCI_ERS_RESULT_NONE = (__force pci_ers_result_t) 1,
574
575 /* Device driver can recover without slot reset */
576 PCI_ERS_RESULT_CAN_RECOVER = (__force pci_ers_result_t) 2,
577
578 /* Device driver wants slot to be reset. */
579 PCI_ERS_RESULT_NEED_RESET = (__force pci_ers_result_t) 3,
580
581 /* Device has completely failed, is unrecoverable */
582 PCI_ERS_RESULT_DISCONNECT = (__force pci_ers_result_t) 4,
583
584 /* Device driver is fully recovered and operational */
585 PCI_ERS_RESULT_RECOVERED = (__force pci_ers_result_t) 5,
586
587 /* No AER capabilities registered for the driver */
588 PCI_ERS_RESULT_NO_AER_DRIVER = (__force pci_ers_result_t) 6,
589 };
590
591 /* PCI bus error event callbacks */
592 struct pci_error_handlers {
593 /* PCI bus error detected on this device */
594 pci_ers_result_t (*error_detected)(struct pci_dev *dev,
595 enum pci_channel_state error);
596
597 /* MMIO has been re-enabled, but not DMA */
598 pci_ers_result_t (*mmio_enabled)(struct pci_dev *dev);
599
600 /* PCI Express link has been reset */
601 pci_ers_result_t (*link_reset)(struct pci_dev *dev);
602
603 /* PCI slot has been reset */
604 pci_ers_result_t (*slot_reset)(struct pci_dev *dev);
605
606 /* Device driver may resume normal operations */
607 void (*resume)(struct pci_dev *dev);
608 };
609
610
611 struct module;
612 struct pci_driver {
613 struct list_head node;
614 const char *name;
615 const struct pci_device_id *id_table; /* must be non-NULL for probe to be called */
616 int (*probe) (struct pci_dev *dev, const struct pci_device_id *id); /* New device inserted */
617 void (*remove) (struct pci_dev *dev); /* Device removed (NULL if not a hot-plug capable driver) */
618 int (*suspend) (struct pci_dev *dev, pm_message_t state); /* Device suspended */
619 int (*suspend_late) (struct pci_dev *dev, pm_message_t state);
620 int (*resume_early) (struct pci_dev *dev);
621 int (*resume) (struct pci_dev *dev); /* Device woken up */
622 void (*shutdown) (struct pci_dev *dev);
623 int (*sriov_configure) (struct pci_dev *dev, int num_vfs); /* PF pdev */
624 const struct pci_error_handlers *err_handler;
625 struct device_driver driver;
626 struct pci_dynids dynids;
627 };
628
629 #define to_pci_driver(drv) container_of(drv, struct pci_driver, driver)
630
631 /**
632 * DEFINE_PCI_DEVICE_TABLE - macro used to describe a pci device table
633 * @_table: device table name
634 *
635 * This macro is deprecated and should not be used in new code.
636 */
637 #define DEFINE_PCI_DEVICE_TABLE(_table) \
638 const struct pci_device_id _table[]
639
640 /**
641 * PCI_DEVICE - macro used to describe a specific pci device
642 * @vend: the 16 bit PCI Vendor ID
643 * @dev: the 16 bit PCI Device ID
644 *
645 * This macro is used to create a struct pci_device_id that matches a
646 * specific device. The subvendor and subdevice fields will be set to
647 * PCI_ANY_ID.
648 */
649 #define PCI_DEVICE(vend,dev) \
650 .vendor = (vend), .device = (dev), \
651 .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID
652
653 /**
654 * PCI_DEVICE_SUB - macro used to describe a specific pci device with subsystem
655 * @vend: the 16 bit PCI Vendor ID
656 * @dev: the 16 bit PCI Device ID
657 * @subvend: the 16 bit PCI Subvendor ID
658 * @subdev: the 16 bit PCI Subdevice ID
659 *
660 * This macro is used to create a struct pci_device_id that matches a
661 * specific device with subsystem information.
662 */
663 #define PCI_DEVICE_SUB(vend, dev, subvend, subdev) \
664 .vendor = (vend), .device = (dev), \
665 .subvendor = (subvend), .subdevice = (subdev)
666
667 /**
668 * PCI_DEVICE_CLASS - macro used to describe a specific pci device class
669 * @dev_class: the class, subclass, prog-if triple for this device
670 * @dev_class_mask: the class mask for this device
671 *
672 * This macro is used to create a struct pci_device_id that matches a
673 * specific PCI class. The vendor, device, subvendor, and subdevice
674 * fields will be set to PCI_ANY_ID.
675 */
676 #define PCI_DEVICE_CLASS(dev_class,dev_class_mask) \
677 .class = (dev_class), .class_mask = (dev_class_mask), \
678 .vendor = PCI_ANY_ID, .device = PCI_ANY_ID, \
679 .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID
680
681 /**
682 * PCI_VDEVICE - macro used to describe a specific pci device in short form
683 * @vendor: the vendor name
684 * @device: the 16 bit PCI Device ID
685 *
686 * This macro is used to create a struct pci_device_id that matches a
687 * specific PCI device. The subvendor, and subdevice fields will be set
688 * to PCI_ANY_ID. The macro allows the next field to follow as the device
689 * private data.
690 */
691
692 #define PCI_VDEVICE(vendor, device) \
693 PCI_VENDOR_ID_##vendor, (device), \
694 PCI_ANY_ID, PCI_ANY_ID, 0, 0
695
696 /* these external functions are only available when PCI support is enabled */
697 #ifdef CONFIG_PCI
698
699 void pcie_bus_configure_settings(struct pci_bus *bus);
700
701 enum pcie_bus_config_types {
702 PCIE_BUS_TUNE_OFF,
703 PCIE_BUS_SAFE,
704 PCIE_BUS_PERFORMANCE,
705 PCIE_BUS_PEER2PEER,
706 };
707
708 extern enum pcie_bus_config_types pcie_bus_config;
709
710 extern struct bus_type pci_bus_type;
711
712 /* Do NOT directly access these two variables, unless you are arch-specific PCI
713 * code, or PCI core code. */
714 extern struct list_head pci_root_buses; /* list of all known PCI buses */
715 /* Some device drivers need know if PCI is initiated */
716 int no_pci_devices(void);
717
718 void pcibios_resource_survey_bus(struct pci_bus *bus);
719 void pcibios_add_bus(struct pci_bus *bus);
720 void pcibios_remove_bus(struct pci_bus *bus);
721 void pcibios_fixup_bus(struct pci_bus *);
722 int __must_check pcibios_enable_device(struct pci_dev *, int mask);
723 /* Architecture-specific versions may override this (weak) */
724 char *pcibios_setup(char *str);
725
726 /* Used only when drivers/pci/setup.c is used */
727 resource_size_t pcibios_align_resource(void *, const struct resource *,
728 resource_size_t,
729 resource_size_t);
730 void pcibios_update_irq(struct pci_dev *, int irq);
731
732 /* Weak but can be overriden by arch */
733 void pci_fixup_cardbus(struct pci_bus *);
734
735 /* Generic PCI functions used internally */
736
737 void pcibios_resource_to_bus(struct pci_bus *bus, struct pci_bus_region *region,
738 struct resource *res);
739 void pcibios_bus_to_resource(struct pci_bus *bus, struct resource *res,
740 struct pci_bus_region *region);
741 void pcibios_scan_specific_bus(int busn);
742 struct pci_bus *pci_find_bus(int domain, int busnr);
743 void pci_bus_add_devices(const struct pci_bus *bus);
744 struct pci_bus *pci_scan_bus_parented(struct device *parent, int bus,
745 struct pci_ops *ops, void *sysdata);
746 struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops, void *sysdata);
747 struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
748 struct pci_ops *ops, void *sysdata,
749 struct list_head *resources);
750 int pci_bus_insert_busn_res(struct pci_bus *b, int bus, int busmax);
751 int pci_bus_update_busn_res_end(struct pci_bus *b, int busmax);
752 void pci_bus_release_busn_res(struct pci_bus *b);
753 struct pci_bus *pci_scan_root_bus(struct device *parent, int bus,
754 struct pci_ops *ops, void *sysdata,
755 struct list_head *resources);
756 struct pci_bus *pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev,
757 int busnr);
758 void pcie_update_link_speed(struct pci_bus *bus, u16 link_status);
759 struct pci_slot *pci_create_slot(struct pci_bus *parent, int slot_nr,
760 const char *name,
761 struct hotplug_slot *hotplug);
762 void pci_destroy_slot(struct pci_slot *slot);
763 int pci_scan_slot(struct pci_bus *bus, int devfn);
764 struct pci_dev *pci_scan_single_device(struct pci_bus *bus, int devfn);
765 void pci_device_add(struct pci_dev *dev, struct pci_bus *bus);
766 unsigned int pci_scan_child_bus(struct pci_bus *bus);
767 int __must_check pci_bus_add_device(struct pci_dev *dev);
768 void pci_read_bridge_bases(struct pci_bus *child);
769 struct resource *pci_find_parent_resource(const struct pci_dev *dev,
770 struct resource *res);
771 u8 pci_swizzle_interrupt_pin(const struct pci_dev *dev, u8 pin);
772 int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge);
773 u8 pci_common_swizzle(struct pci_dev *dev, u8 *pinp);
774 struct pci_dev *pci_dev_get(struct pci_dev *dev);
775 void pci_dev_put(struct pci_dev *dev);
776 void pci_remove_bus(struct pci_bus *b);
777 void pci_stop_and_remove_bus_device(struct pci_dev *dev);
778 void pci_stop_and_remove_bus_device_locked(struct pci_dev *dev);
779 void pci_stop_root_bus(struct pci_bus *bus);
780 void pci_remove_root_bus(struct pci_bus *bus);
781 void pci_setup_cardbus(struct pci_bus *bus);
782 void pci_sort_breadthfirst(void);
783 #define dev_is_pci(d) ((d)->bus == &pci_bus_type)
784 #define dev_is_pf(d) ((dev_is_pci(d) ? to_pci_dev(d)->is_physfn : false))
785 #define dev_num_vf(d) ((dev_is_pci(d) ? pci_num_vf(to_pci_dev(d)) : 0))
786
787 /* Generic PCI functions exported to card drivers */
788
789 enum pci_lost_interrupt_reason {
790 PCI_LOST_IRQ_NO_INFORMATION = 0,
791 PCI_LOST_IRQ_DISABLE_MSI,
792 PCI_LOST_IRQ_DISABLE_MSIX,
793 PCI_LOST_IRQ_DISABLE_ACPI,
794 };
795 enum pci_lost_interrupt_reason pci_lost_interrupt(struct pci_dev *dev);
796 int pci_find_capability(struct pci_dev *dev, int cap);
797 int pci_find_next_capability(struct pci_dev *dev, u8 pos, int cap);
798 int pci_find_ext_capability(struct pci_dev *dev, int cap);
799 int pci_find_next_ext_capability(struct pci_dev *dev, int pos, int cap);
800 int pci_find_ht_capability(struct pci_dev *dev, int ht_cap);
801 int pci_find_next_ht_capability(struct pci_dev *dev, int pos, int ht_cap);
802 struct pci_bus *pci_find_next_bus(const struct pci_bus *from);
803
804 struct pci_dev *pci_get_device(unsigned int vendor, unsigned int device,
805 struct pci_dev *from);
806 struct pci_dev *pci_get_subsys(unsigned int vendor, unsigned int device,
807 unsigned int ss_vendor, unsigned int ss_device,
808 struct pci_dev *from);
809 struct pci_dev *pci_get_slot(struct pci_bus *bus, unsigned int devfn);
810 struct pci_dev *pci_get_domain_bus_and_slot(int domain, unsigned int bus,
811 unsigned int devfn);
812 static inline struct pci_dev *pci_get_bus_and_slot(unsigned int bus,
813 unsigned int devfn)
814 {
815 return pci_get_domain_bus_and_slot(0, bus, devfn);
816 }
817 struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from);
818 int pci_dev_present(const struct pci_device_id *ids);
819
820 int pci_bus_read_config_byte(struct pci_bus *bus, unsigned int devfn,
821 int where, u8 *val);
822 int pci_bus_read_config_word(struct pci_bus *bus, unsigned int devfn,
823 int where, u16 *val);
824 int pci_bus_read_config_dword(struct pci_bus *bus, unsigned int devfn,
825 int where, u32 *val);
826 int pci_bus_write_config_byte(struct pci_bus *bus, unsigned int devfn,
827 int where, u8 val);
828 int pci_bus_write_config_word(struct pci_bus *bus, unsigned int devfn,
829 int where, u16 val);
830 int pci_bus_write_config_dword(struct pci_bus *bus, unsigned int devfn,
831 int where, u32 val);
832 struct pci_ops *pci_bus_set_ops(struct pci_bus *bus, struct pci_ops *ops);
833
834 static inline int pci_read_config_byte(const struct pci_dev *dev, int where, u8 *val)
835 {
836 return pci_bus_read_config_byte(dev->bus, dev->devfn, where, val);
837 }
838 static inline int pci_read_config_word(const struct pci_dev *dev, int where, u16 *val)
839 {
840 return pci_bus_read_config_word(dev->bus, dev->devfn, where, val);
841 }
842 static inline int pci_read_config_dword(const struct pci_dev *dev, int where,
843 u32 *val)
844 {
845 return pci_bus_read_config_dword(dev->bus, dev->devfn, where, val);
846 }
847 static inline int pci_write_config_byte(const struct pci_dev *dev, int where, u8 val)
848 {
849 return pci_bus_write_config_byte(dev->bus, dev->devfn, where, val);
850 }
851 static inline int pci_write_config_word(const struct pci_dev *dev, int where, u16 val)
852 {
853 return pci_bus_write_config_word(dev->bus, dev->devfn, where, val);
854 }
855 static inline int pci_write_config_dword(const struct pci_dev *dev, int where,
856 u32 val)
857 {
858 return pci_bus_write_config_dword(dev->bus, dev->devfn, where, val);
859 }
860
861 int pcie_capability_read_word(struct pci_dev *dev, int pos, u16 *val);
862 int pcie_capability_read_dword(struct pci_dev *dev, int pos, u32 *val);
863 int pcie_capability_write_word(struct pci_dev *dev, int pos, u16 val);
864 int pcie_capability_write_dword(struct pci_dev *dev, int pos, u32 val);
865 int pcie_capability_clear_and_set_word(struct pci_dev *dev, int pos,
866 u16 clear, u16 set);
867 int pcie_capability_clear_and_set_dword(struct pci_dev *dev, int pos,
868 u32 clear, u32 set);
869
870 static inline int pcie_capability_set_word(struct pci_dev *dev, int pos,
871 u16 set)
872 {
873 return pcie_capability_clear_and_set_word(dev, pos, 0, set);
874 }
875
876 static inline int pcie_capability_set_dword(struct pci_dev *dev, int pos,
877 u32 set)
878 {
879 return pcie_capability_clear_and_set_dword(dev, pos, 0, set);
880 }
881
882 static inline int pcie_capability_clear_word(struct pci_dev *dev, int pos,
883 u16 clear)
884 {
885 return pcie_capability_clear_and_set_word(dev, pos, clear, 0);
886 }
887
888 static inline int pcie_capability_clear_dword(struct pci_dev *dev, int pos,
889 u32 clear)
890 {
891 return pcie_capability_clear_and_set_dword(dev, pos, clear, 0);
892 }
893
894 /* user-space driven config access */
895 int pci_user_read_config_byte(struct pci_dev *dev, int where, u8 *val);
896 int pci_user_read_config_word(struct pci_dev *dev, int where, u16 *val);
897 int pci_user_read_config_dword(struct pci_dev *dev, int where, u32 *val);
898 int pci_user_write_config_byte(struct pci_dev *dev, int where, u8 val);
899 int pci_user_write_config_word(struct pci_dev *dev, int where, u16 val);
900 int pci_user_write_config_dword(struct pci_dev *dev, int where, u32 val);
901
902 int __must_check pci_enable_device(struct pci_dev *dev);
903 int __must_check pci_enable_device_io(struct pci_dev *dev);
904 int __must_check pci_enable_device_mem(struct pci_dev *dev);
905 int __must_check pci_reenable_device(struct pci_dev *);
906 int __must_check pcim_enable_device(struct pci_dev *pdev);
907 void pcim_pin_device(struct pci_dev *pdev);
908
909 static inline int pci_is_enabled(struct pci_dev *pdev)
910 {
911 return (atomic_read(&pdev->enable_cnt) > 0);
912 }
913
914 static inline int pci_is_managed(struct pci_dev *pdev)
915 {
916 return pdev->is_managed;
917 }
918
919 void pci_disable_device(struct pci_dev *dev);
920
921 extern unsigned int pcibios_max_latency;
922 void pci_set_master(struct pci_dev *dev);
923 void pci_clear_master(struct pci_dev *dev);
924
925 int pci_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state state);
926 int pci_set_cacheline_size(struct pci_dev *dev);
927 #define HAVE_PCI_SET_MWI
928 int __must_check pci_set_mwi(struct pci_dev *dev);
929 int pci_try_set_mwi(struct pci_dev *dev);
930 void pci_clear_mwi(struct pci_dev *dev);
931 void pci_intx(struct pci_dev *dev, int enable);
932 bool pci_intx_mask_supported(struct pci_dev *dev);
933 bool pci_check_and_mask_intx(struct pci_dev *dev);
934 bool pci_check_and_unmask_intx(struct pci_dev *dev);
935 void pci_msi_off(struct pci_dev *dev);
936 int pci_set_dma_max_seg_size(struct pci_dev *dev, unsigned int size);
937 int pci_set_dma_seg_boundary(struct pci_dev *dev, unsigned long mask);
938 int pci_wait_for_pending(struct pci_dev *dev, int pos, u16 mask);
939 int pci_wait_for_pending_transaction(struct pci_dev *dev);
940 int pcix_get_max_mmrbc(struct pci_dev *dev);
941 int pcix_get_mmrbc(struct pci_dev *dev);
942 int pcix_set_mmrbc(struct pci_dev *dev, int mmrbc);
943 int pcie_get_readrq(struct pci_dev *dev);
944 int pcie_set_readrq(struct pci_dev *dev, int rq);
945 int pcie_get_mps(struct pci_dev *dev);
946 int pcie_set_mps(struct pci_dev *dev, int mps);
947 int pcie_get_minimum_link(struct pci_dev *dev, enum pci_bus_speed *speed,
948 enum pcie_link_width *width);
949 int __pci_reset_function(struct pci_dev *dev);
950 int __pci_reset_function_locked(struct pci_dev *dev);
951 int pci_reset_function(struct pci_dev *dev);
952 int pci_try_reset_function(struct pci_dev *dev);
953 int pci_probe_reset_slot(struct pci_slot *slot);
954 int pci_reset_slot(struct pci_slot *slot);
955 int pci_try_reset_slot(struct pci_slot *slot);
956 int pci_probe_reset_bus(struct pci_bus *bus);
957 int pci_reset_bus(struct pci_bus *bus);
958 int pci_try_reset_bus(struct pci_bus *bus);
959 void pci_reset_bridge_secondary_bus(struct pci_dev *dev);
960 void pci_update_resource(struct pci_dev *dev, int resno);
961 int __must_check pci_assign_resource(struct pci_dev *dev, int i);
962 int __must_check pci_reassign_resource(struct pci_dev *dev, int i, resource_size_t add_size, resource_size_t align);
963 int pci_select_bars(struct pci_dev *dev, unsigned long flags);
964 bool pci_device_is_present(struct pci_dev *pdev);
965
966 /* ROM control related routines */
967 int pci_enable_rom(struct pci_dev *pdev);
968 void pci_disable_rom(struct pci_dev *pdev);
969 void __iomem __must_check *pci_map_rom(struct pci_dev *pdev, size_t *size);
970 void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom);
971 size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size);
972 void __iomem __must_check *pci_platform_rom(struct pci_dev *pdev, size_t *size);
973
974 /* Power management related routines */
975 int pci_save_state(struct pci_dev *dev);
976 void pci_restore_state(struct pci_dev *dev);
977 struct pci_saved_state *pci_store_saved_state(struct pci_dev *dev);
978 int pci_load_and_free_saved_state(struct pci_dev *dev,
979 struct pci_saved_state **state);
980 struct pci_cap_saved_state *pci_find_saved_cap(struct pci_dev *dev, char cap);
981 struct pci_cap_saved_state *pci_find_saved_ext_cap(struct pci_dev *dev,
982 u16 cap);
983 int pci_add_cap_save_buffer(struct pci_dev *dev, char cap, unsigned int size);
984 int pci_add_ext_cap_save_buffer(struct pci_dev *dev,
985 u16 cap, unsigned int size);
986 int __pci_complete_power_transition(struct pci_dev *dev, pci_power_t state);
987 int pci_set_power_state(struct pci_dev *dev, pci_power_t state);
988 pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t state);
989 bool pci_pme_capable(struct pci_dev *dev, pci_power_t state);
990 void pci_pme_active(struct pci_dev *dev, bool enable);
991 int __pci_enable_wake(struct pci_dev *dev, pci_power_t state,
992 bool runtime, bool enable);
993 int pci_wake_from_d3(struct pci_dev *dev, bool enable);
994 int pci_prepare_to_sleep(struct pci_dev *dev);
995 int pci_back_from_sleep(struct pci_dev *dev);
996 bool pci_dev_run_wake(struct pci_dev *dev);
997 bool pci_check_pme_status(struct pci_dev *dev);
998 void pci_pme_wakeup_bus(struct pci_bus *bus);
999
1000 static inline int pci_enable_wake(struct pci_dev *dev, pci_power_t state,
1001 bool enable)
1002 {
1003 return __pci_enable_wake(dev, state, false, enable);
1004 }
1005
1006 /* PCI Virtual Channel */
1007 int pci_save_vc_state(struct pci_dev *dev);
1008 void pci_restore_vc_state(struct pci_dev *dev);
1009 void pci_allocate_vc_save_buffers(struct pci_dev *dev);
1010
1011 /* For use by arch with custom probe code */
1012 void set_pcie_port_type(struct pci_dev *pdev);
1013 void set_pcie_hotplug_bridge(struct pci_dev *pdev);
1014
1015 /* Functions for PCI Hotplug drivers to use */
1016 int pci_bus_find_capability(struct pci_bus *bus, unsigned int devfn, int cap);
1017 unsigned int pci_rescan_bus_bridge_resize(struct pci_dev *bridge);
1018 unsigned int pci_rescan_bus(struct pci_bus *bus);
1019 void pci_lock_rescan_remove(void);
1020 void pci_unlock_rescan_remove(void);
1021
1022 /* Vital product data routines */
1023 ssize_t pci_read_vpd(struct pci_dev *dev, loff_t pos, size_t count, void *buf);
1024 ssize_t pci_write_vpd(struct pci_dev *dev, loff_t pos, size_t count, const void *buf);
1025
1026 /* Helper functions for low-level code (drivers/pci/setup-[bus,res].c) */
1027 resource_size_t pcibios_retrieve_fw_addr(struct pci_dev *dev, int idx);
1028 void pci_bus_assign_resources(const struct pci_bus *bus);
1029 void pci_bus_size_bridges(struct pci_bus *bus);
1030 int pci_claim_resource(struct pci_dev *, int);
1031 void pci_assign_unassigned_resources(void);
1032 void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge);
1033 void pci_assign_unassigned_bus_resources(struct pci_bus *bus);
1034 void pci_assign_unassigned_root_bus_resources(struct pci_bus *bus);
1035 void pdev_enable_device(struct pci_dev *);
1036 int pci_enable_resources(struct pci_dev *, int mask);
1037 void pci_fixup_irqs(u8 (*)(struct pci_dev *, u8 *),
1038 int (*)(const struct pci_dev *, u8, u8));
1039 #define HAVE_PCI_REQ_REGIONS 2
1040 int __must_check pci_request_regions(struct pci_dev *, const char *);
1041 int __must_check pci_request_regions_exclusive(struct pci_dev *, const char *);
1042 void pci_release_regions(struct pci_dev *);
1043 int __must_check pci_request_region(struct pci_dev *, int, const char *);
1044 int __must_check pci_request_region_exclusive(struct pci_dev *, int, const char *);
1045 void pci_release_region(struct pci_dev *, int);
1046 int pci_request_selected_regions(struct pci_dev *, int, const char *);
1047 int pci_request_selected_regions_exclusive(struct pci_dev *, int, const char *);
1048 void pci_release_selected_regions(struct pci_dev *, int);
1049
1050 /* drivers/pci/bus.c */
1051 struct pci_bus *pci_bus_get(struct pci_bus *bus);
1052 void pci_bus_put(struct pci_bus *bus);
1053 void pci_add_resource(struct list_head *resources, struct resource *res);
1054 void pci_add_resource_offset(struct list_head *resources, struct resource *res,
1055 resource_size_t offset);
1056 void pci_free_resource_list(struct list_head *resources);
1057 void pci_bus_add_resource(struct pci_bus *bus, struct resource *res, unsigned int flags);
1058 struct resource *pci_bus_resource_n(const struct pci_bus *bus, int n);
1059 void pci_bus_remove_resources(struct pci_bus *bus);
1060
1061 #define pci_bus_for_each_resource(bus, res, i) \
1062 for (i = 0; \
1063 (res = pci_bus_resource_n(bus, i)) || i < PCI_BRIDGE_RESOURCE_NUM; \
1064 i++)
1065
1066 int __must_check pci_bus_alloc_resource(struct pci_bus *bus,
1067 struct resource *res, resource_size_t size,
1068 resource_size_t align, resource_size_t min,
1069 unsigned int type_mask,
1070 resource_size_t (*alignf)(void *,
1071 const struct resource *,
1072 resource_size_t,
1073 resource_size_t),
1074 void *alignf_data);
1075
1076 static inline dma_addr_t pci_bus_address(struct pci_dev *pdev, int bar)
1077 {
1078 struct pci_bus_region region;
1079
1080 pcibios_resource_to_bus(pdev->bus, ®ion, &pdev->resource[bar]);
1081 return region.start;
1082 }
1083
1084 /* Proper probing supporting hot-pluggable devices */
1085 int __must_check __pci_register_driver(struct pci_driver *, struct module *,
1086 const char *mod_name);
1087
1088 /*
1089 * pci_register_driver must be a macro so that KBUILD_MODNAME can be expanded
1090 */
1091 #define pci_register_driver(driver) \
1092 __pci_register_driver(driver, THIS_MODULE, KBUILD_MODNAME)
1093
1094 void pci_unregister_driver(struct pci_driver *dev);
1095
1096 /**
1097 * module_pci_driver() - Helper macro for registering a PCI driver
1098 * @__pci_driver: pci_driver struct
1099 *
1100 * Helper macro for PCI drivers which do not do anything special in module
1101 * init/exit. This eliminates a lot of boilerplate. Each module may only
1102 * use this macro once, and calling it replaces module_init() and module_exit()
1103 */
1104 #define module_pci_driver(__pci_driver) \
1105 module_driver(__pci_driver, pci_register_driver, \
1106 pci_unregister_driver)
1107
1108 struct pci_driver *pci_dev_driver(const struct pci_dev *dev);
1109 int pci_add_dynid(struct pci_driver *drv,
1110 unsigned int vendor, unsigned int device,
1111 unsigned int subvendor, unsigned int subdevice,
1112 unsigned int class, unsigned int class_mask,
1113 unsigned long driver_data);
1114 const struct pci_device_id *pci_match_id(const struct pci_device_id *ids,
1115 struct pci_dev *dev);
1116 int pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max,
1117 int pass);
1118
1119 void pci_walk_bus(struct pci_bus *top, int (*cb)(struct pci_dev *, void *),
1120 void *userdata);
1121 int pci_cfg_space_size(struct pci_dev *dev);
1122 unsigned char pci_bus_max_busnr(struct pci_bus *bus);
1123 void pci_setup_bridge(struct pci_bus *bus);
1124 resource_size_t pcibios_window_alignment(struct pci_bus *bus,
1125 unsigned long type);
1126
1127 #define PCI_VGA_STATE_CHANGE_BRIDGE (1 << 0)
1128 #define PCI_VGA_STATE_CHANGE_DECODES (1 << 1)
1129
1130 int pci_set_vga_state(struct pci_dev *pdev, bool decode,
1131 unsigned int command_bits, u32 flags);
1132 /* kmem_cache style wrapper around pci_alloc_consistent() */
1133
1134 #include <linux/pci-dma.h>
1135 #include <linux/dmapool.h>
1136
1137 #define pci_pool dma_pool
1138 #define pci_pool_create(name, pdev, size, align, allocation) \
1139 dma_pool_create(name, &pdev->dev, size, align, allocation)
1140 #define pci_pool_destroy(pool) dma_pool_destroy(pool)
1141 #define pci_pool_alloc(pool, flags, handle) dma_pool_alloc(pool, flags, handle)
1142 #define pci_pool_free(pool, vaddr, addr) dma_pool_free(pool, vaddr, addr)
1143
1144 enum pci_dma_burst_strategy {
1145 PCI_DMA_BURST_INFINITY, /* make bursts as large as possible,
1146 strategy_parameter is N/A */
1147 PCI_DMA_BURST_BOUNDARY, /* disconnect at every strategy_parameter
1148 byte boundaries */
1149 PCI_DMA_BURST_MULTIPLE, /* disconnect at some multiple of
1150 strategy_parameter byte boundaries */
1151 };
1152
1153 struct msix_entry {
1154 u32 vector; /* kernel uses to write allocated vector */
1155 u16 entry; /* driver uses to specify entry, OS writes */
1156 };
1157
1158
1159 #ifdef CONFIG_PCI_MSI
1160 int pci_msi_vec_count(struct pci_dev *dev);
1161 int pci_enable_msi_block(struct pci_dev *dev, int nvec);
1162 void pci_msi_shutdown(struct pci_dev *dev);
1163 void pci_disable_msi(struct pci_dev *dev);
1164 int pci_msix_vec_count(struct pci_dev *dev);
1165 int pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, int nvec);
1166 void pci_msix_shutdown(struct pci_dev *dev);
1167 void pci_disable_msix(struct pci_dev *dev);
1168 void msi_remove_pci_irq_vectors(struct pci_dev *dev);
1169 void pci_restore_msi_state(struct pci_dev *dev);
1170 int pci_msi_enabled(void);
1171 int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec);
1172 static inline int pci_enable_msi_exact(struct pci_dev *dev, int nvec)
1173 {
1174 int rc = pci_enable_msi_range(dev, nvec, nvec);
1175 if (rc < 0)
1176 return rc;
1177 return 0;
1178 }
1179 int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
1180 int minvec, int maxvec);
1181 static inline int pci_enable_msix_exact(struct pci_dev *dev,
1182 struct msix_entry *entries, int nvec)
1183 {
1184 int rc = pci_enable_msix_range(dev, entries, nvec, nvec);
1185 if (rc < 0)
1186 return rc;
1187 return 0;
1188 }
1189 #else
1190 static inline int pci_msi_vec_count(struct pci_dev *dev) { return -ENOSYS; }
1191 static inline int pci_enable_msi_block(struct pci_dev *dev, int nvec)
1192 { return -ENOSYS; }
1193 static inline void pci_msi_shutdown(struct pci_dev *dev) { }
1194 static inline void pci_disable_msi(struct pci_dev *dev) { }
1195 static inline int pci_msix_vec_count(struct pci_dev *dev) { return -ENOSYS; }
1196 static inline int pci_enable_msix(struct pci_dev *dev,
1197 struct msix_entry *entries, int nvec)
1198 { return -ENOSYS; }
1199 static inline void pci_msix_shutdown(struct pci_dev *dev) { }
1200 static inline void pci_disable_msix(struct pci_dev *dev) { }
1201 static inline void msi_remove_pci_irq_vectors(struct pci_dev *dev) { }
1202 static inline void pci_restore_msi_state(struct pci_dev *dev) { }
1203 static inline int pci_msi_enabled(void) { return 0; }
1204 static inline int pci_enable_msi_range(struct pci_dev *dev, int minvec,
1205 int maxvec)
1206 { return -ENOSYS; }
1207 static inline int pci_enable_msi_exact(struct pci_dev *dev, int nvec)
1208 { return -ENOSYS; }
1209 static inline int pci_enable_msix_range(struct pci_dev *dev,
1210 struct msix_entry *entries, int minvec, int maxvec)
1211 { return -ENOSYS; }
1212 static inline int pci_enable_msix_exact(struct pci_dev *dev,
1213 struct msix_entry *entries, int nvec)
1214 { return -ENOSYS; }
1215 #endif
1216
1217 #ifdef CONFIG_PCIEPORTBUS
1218 extern bool pcie_ports_disabled;
1219 extern bool pcie_ports_auto;
1220 #else
1221 #define pcie_ports_disabled true
1222 #define pcie_ports_auto false
1223 #endif
1224
1225 #ifdef CONFIG_PCIEASPM
1226 bool pcie_aspm_support_enabled(void);
1227 #else
1228 static inline bool pcie_aspm_support_enabled(void) { return false; }
1229 #endif
1230
1231 #ifdef CONFIG_PCIEAER
1232 void pci_no_aer(void);
1233 bool pci_aer_available(void);
1234 #else
1235 static inline void pci_no_aer(void) { }
1236 static inline bool pci_aer_available(void) { return false; }
1237 #endif
1238
1239 #ifdef CONFIG_PCIE_ECRC
1240 void pcie_set_ecrc_checking(struct pci_dev *dev);
1241 void pcie_ecrc_get_policy(char *str);
1242 #else
1243 static inline void pcie_set_ecrc_checking(struct pci_dev *dev) { }
1244 static inline void pcie_ecrc_get_policy(char *str) { }
1245 #endif
1246
1247 #define pci_enable_msi(pdev) pci_enable_msi_block(pdev, 1)
1248
1249 #ifdef CONFIG_HT_IRQ
1250 /* The functions a driver should call */
1251 int ht_create_irq(struct pci_dev *dev, int idx);
1252 void ht_destroy_irq(unsigned int irq);
1253 #endif /* CONFIG_HT_IRQ */
1254
1255 void pci_cfg_access_lock(struct pci_dev *dev);
1256 bool pci_cfg_access_trylock(struct pci_dev *dev);
1257 void pci_cfg_access_unlock(struct pci_dev *dev);
1258
1259 /*
1260 * PCI domain support. Sometimes called PCI segment (eg by ACPI),
1261 * a PCI domain is defined to be a set of PCI buses which share
1262 * configuration space.
1263 */
1264 #ifdef CONFIG_PCI_DOMAINS
1265 extern int pci_domains_supported;
1266 #else
1267 enum { pci_domains_supported = 0 };
1268 static inline int pci_domain_nr(struct pci_bus *bus) { return 0; }
1269 static inline int pci_proc_domain(struct pci_bus *bus) { return 0; }
1270 #endif /* CONFIG_PCI_DOMAINS */
1271
1272 /* some architectures require additional setup to direct VGA traffic */
1273 typedef int (*arch_set_vga_state_t)(struct pci_dev *pdev, bool decode,
1274 unsigned int command_bits, u32 flags);
1275 void pci_register_set_vga_state(arch_set_vga_state_t func);
1276
1277 #else /* CONFIG_PCI is not enabled */
1278
1279 /*
1280 * If the system does not have PCI, clearly these return errors. Define
1281 * these as simple inline functions to avoid hair in drivers.
1282 */
1283
1284 #define _PCI_NOP(o, s, t) \
1285 static inline int pci_##o##_config_##s(struct pci_dev *dev, \
1286 int where, t val) \
1287 { return PCIBIOS_FUNC_NOT_SUPPORTED; }
1288
1289 #define _PCI_NOP_ALL(o, x) _PCI_NOP(o, byte, u8 x) \
1290 _PCI_NOP(o, word, u16 x) \
1291 _PCI_NOP(o, dword, u32 x)
1292 _PCI_NOP_ALL(read, *)
1293 _PCI_NOP_ALL(write,)
1294
1295 static inline struct pci_dev *pci_get_device(unsigned int vendor,
1296 unsigned int device,
1297 struct pci_dev *from)
1298 { return NULL; }
1299
1300 static inline struct pci_dev *pci_get_subsys(unsigned int vendor,
1301 unsigned int device,
1302 unsigned int ss_vendor,
1303 unsigned int ss_device,
1304 struct pci_dev *from)
1305 { return NULL; }
1306
1307 static inline struct pci_dev *pci_get_class(unsigned int class,
1308 struct pci_dev *from)
1309 { return NULL; }
1310
1311 #define pci_dev_present(ids) (0)
1312 #define no_pci_devices() (1)
1313 #define pci_dev_put(dev) do { } while (0)
1314
1315 static inline void pci_set_master(struct pci_dev *dev) { }
1316 static inline int pci_enable_device(struct pci_dev *dev) { return -EIO; }
1317 static inline void pci_disable_device(struct pci_dev *dev) { }
1318 static inline int pci_set_dma_mask(struct pci_dev *dev, u64 mask)
1319 { return -EIO; }
1320 static inline int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
1321 { return -EIO; }
1322 static inline int pci_set_dma_max_seg_size(struct pci_dev *dev,
1323 unsigned int size)
1324 { return -EIO; }
1325 static inline int pci_set_dma_seg_boundary(struct pci_dev *dev,
1326 unsigned long mask)
1327 { return -EIO; }
1328 static inline int pci_assign_resource(struct pci_dev *dev, int i)
1329 { return -EBUSY; }
1330 static inline int __pci_register_driver(struct pci_driver *drv,
1331 struct module *owner)
1332 { return 0; }
1333 static inline int pci_register_driver(struct pci_driver *drv)
1334 { return 0; }
1335 static inline void pci_unregister_driver(struct pci_driver *drv) { }
1336 static inline int pci_find_capability(struct pci_dev *dev, int cap)
1337 { return 0; }
1338 static inline int pci_find_next_capability(struct pci_dev *dev, u8 post,
1339 int cap)
1340 { return 0; }
1341 static inline int pci_find_ext_capability(struct pci_dev *dev, int cap)
1342 { return 0; }
1343
1344 /* Power management related routines */
1345 static inline int pci_save_state(struct pci_dev *dev) { return 0; }
1346 static inline void pci_restore_state(struct pci_dev *dev) { }
1347 static inline int pci_set_power_state(struct pci_dev *dev, pci_power_t state)
1348 { return 0; }
1349 static inline int pci_wake_from_d3(struct pci_dev *dev, bool enable)
1350 { return 0; }
1351 static inline pci_power_t pci_choose_state(struct pci_dev *dev,
1352 pm_message_t state)
1353 { return PCI_D0; }
1354 static inline int pci_enable_wake(struct pci_dev *dev, pci_power_t state,
1355 int enable)
1356 { return 0; }
1357
1358 static inline int pci_request_regions(struct pci_dev *dev, const char *res_name)
1359 { return -EIO; }
1360 static inline void pci_release_regions(struct pci_dev *dev) { }
1361
1362 #define pci_dma_burst_advice(pdev, strat, strategy_parameter) do { } while (0)
1363
1364 static inline void pci_block_cfg_access(struct pci_dev *dev) { }
1365 static inline int pci_block_cfg_access_in_atomic(struct pci_dev *dev)
1366 { return 0; }
1367 static inline void pci_unblock_cfg_access(struct pci_dev *dev) { }
1368
1369 static inline struct pci_bus *pci_find_next_bus(const struct pci_bus *from)
1370 { return NULL; }
1371 static inline struct pci_dev *pci_get_slot(struct pci_bus *bus,
1372 unsigned int devfn)
1373 { return NULL; }
1374 static inline struct pci_dev *pci_get_bus_and_slot(unsigned int bus,
1375 unsigned int devfn)
1376 { return NULL; }
1377
1378 static inline int pci_domain_nr(struct pci_bus *bus) { return 0; }
1379 static inline struct pci_dev *pci_dev_get(struct pci_dev *dev) { return NULL; }
1380
1381 #define dev_is_pci(d) (false)
1382 #define dev_is_pf(d) (false)
1383 #define dev_num_vf(d) (0)
1384 #endif /* CONFIG_PCI */
1385
1386 /* Include architecture-dependent settings and functions */
1387
1388 #include <asm/pci.h>
1389
1390 /* these helpers provide future and backwards compatibility
1391 * for accessing popular PCI BAR info */
1392 #define pci_resource_start(dev, bar) ((dev)->resource[(bar)].start)
1393 #define pci_resource_end(dev, bar) ((dev)->resource[(bar)].end)
1394 #define pci_resource_flags(dev, bar) ((dev)->resource[(bar)].flags)
1395 #define pci_resource_len(dev,bar) \
1396 ((pci_resource_start((dev), (bar)) == 0 && \
1397 pci_resource_end((dev), (bar)) == \
1398 pci_resource_start((dev), (bar))) ? 0 : \
1399 \
1400 (pci_resource_end((dev), (bar)) - \
1401 pci_resource_start((dev), (bar)) + 1))
1402
1403 /* Similar to the helpers above, these manipulate per-pci_dev
1404 * driver-specific data. They are really just a wrapper around
1405 * the generic device structure functions of these calls.
1406 */
1407 static inline void *pci_get_drvdata(struct pci_dev *pdev)
1408 {
1409 return dev_get_drvdata(&pdev->dev);
1410 }
1411
1412 static inline void pci_set_drvdata(struct pci_dev *pdev, void *data)
1413 {
1414 dev_set_drvdata(&pdev->dev, data);
1415 }
1416
1417 /* If you want to know what to call your pci_dev, ask this function.
1418 * Again, it's a wrapper around the generic device.
1419 */
1420 static inline const char *pci_name(const struct pci_dev *pdev)
1421 {
1422 return dev_name(&pdev->dev);
1423 }
1424
1425
1426 /* Some archs don't want to expose struct resource to userland as-is
1427 * in sysfs and /proc
1428 */
1429 #ifndef HAVE_ARCH_PCI_RESOURCE_TO_USER
1430 static inline void pci_resource_to_user(const struct pci_dev *dev, int bar,
1431 const struct resource *rsrc, resource_size_t *start,
1432 resource_size_t *end)
1433 {
1434 *start = rsrc->start;
1435 *end = rsrc->end;
1436 }
1437 #endif /* HAVE_ARCH_PCI_RESOURCE_TO_USER */
1438
1439
1440 /*
1441 * The world is not perfect and supplies us with broken PCI devices.
1442 * For at least a part of these bugs we need a work-around, so both
1443 * generic (drivers/pci/quirks.c) and per-architecture code can define
1444 * fixup hooks to be called for particular buggy devices.
1445 */
1446
1447 struct pci_fixup {
1448 u16 vendor; /* You can use PCI_ANY_ID here of course */
1449 u16 device; /* You can use PCI_ANY_ID here of course */
1450 u32 class; /* You can use PCI_ANY_ID here too */
1451 unsigned int class_shift; /* should be 0, 8, 16 */
1452 void (*hook)(struct pci_dev *dev);
1453 };
1454
1455 enum pci_fixup_pass {
1456 pci_fixup_early, /* Before probing BARs */
1457 pci_fixup_header, /* After reading configuration header */
1458 pci_fixup_final, /* Final phase of device fixups */
1459 pci_fixup_enable, /* pci_enable_device() time */
1460 pci_fixup_resume, /* pci_device_resume() */
1461 pci_fixup_suspend, /* pci_device_suspend */
1462 pci_fixup_resume_early, /* pci_device_resume_early() */
1463 };
1464
1465 /* Anonymous variables would be nice... */
1466 #define DECLARE_PCI_FIXUP_SECTION(section, name, vendor, device, class, \
1467 class_shift, hook) \
1468 static const struct pci_fixup __PASTE(__pci_fixup_##name,__LINE__) __used \
1469 __attribute__((__section__(#section), aligned((sizeof(void *))))) \
1470 = { vendor, device, class, class_shift, hook };
1471
1472 #define DECLARE_PCI_FIXUP_CLASS_EARLY(vendor, device, class, \
1473 class_shift, hook) \
1474 DECLARE_PCI_FIXUP_SECTION(.pci_fixup_early, \
1475 hook, vendor, device, class, class_shift, hook)
1476 #define DECLARE_PCI_FIXUP_CLASS_HEADER(vendor, device, class, \
1477 class_shift, hook) \
1478 DECLARE_PCI_FIXUP_SECTION(.pci_fixup_header, \
1479 hook, vendor, device, class, class_shift, hook)
1480 #define DECLARE_PCI_FIXUP_CLASS_FINAL(vendor, device, class, \
1481 class_shift, hook) \
1482 DECLARE_PCI_FIXUP_SECTION(.pci_fixup_final, \
1483 hook, vendor, device, class, class_shift, hook)
1484 #define DECLARE_PCI_FIXUP_CLASS_ENABLE(vendor, device, class, \
1485 class_shift, hook) \
1486 DECLARE_PCI_FIXUP_SECTION(.pci_fixup_enable, \
1487 hook, vendor, device, class, class_shift, hook)
1488 #define DECLARE_PCI_FIXUP_CLASS_RESUME(vendor, device, class, \
1489 class_shift, hook) \
1490 DECLARE_PCI_FIXUP_SECTION(.pci_fixup_resume, \
1491 resume##hook, vendor, device, class, \
1492 class_shift, hook)
1493 #define DECLARE_PCI_FIXUP_CLASS_RESUME_EARLY(vendor, device, class, \
1494 class_shift, hook) \
1495 DECLARE_PCI_FIXUP_SECTION(.pci_fixup_resume_early, \
1496 resume_early##hook, vendor, device, \
1497 class, class_shift, hook)
1498 #define DECLARE_PCI_FIXUP_CLASS_SUSPEND(vendor, device, class, \
1499 class_shift, hook) \
1500 DECLARE_PCI_FIXUP_SECTION(.pci_fixup_suspend, \
1501 suspend##hook, vendor, device, class, \
1502 class_shift, hook)
1503
1504 #define DECLARE_PCI_FIXUP_EARLY(vendor, device, hook) \
1505 DECLARE_PCI_FIXUP_SECTION(.pci_fixup_early, \
1506 hook, vendor, device, PCI_ANY_ID, 0, hook)
1507 #define DECLARE_PCI_FIXUP_HEADER(vendor, device, hook) \
1508 DECLARE_PCI_FIXUP_SECTION(.pci_fixup_header, \
1509 hook, vendor, device, PCI_ANY_ID, 0, hook)
1510 #define DECLARE_PCI_FIXUP_FINAL(vendor, device, hook) \
1511 DECLARE_PCI_FIXUP_SECTION(.pci_fixup_final, \
1512 hook, vendor, device, PCI_ANY_ID, 0, hook)
1513 #define DECLARE_PCI_FIXUP_ENABLE(vendor, device, hook) \
1514 DECLARE_PCI_FIXUP_SECTION(.pci_fixup_enable, \
1515 hook, vendor, device, PCI_ANY_ID, 0, hook)
1516 #define DECLARE_PCI_FIXUP_RESUME(vendor, device, hook) \
1517 DECLARE_PCI_FIXUP_SECTION(.pci_fixup_resume, \
1518 resume##hook, vendor, device, \
1519 PCI_ANY_ID, 0, hook)
1520 #define DECLARE_PCI_FIXUP_RESUME_EARLY(vendor, device, hook) \
1521 DECLARE_PCI_FIXUP_SECTION(.pci_fixup_resume_early, \
1522 resume_early##hook, vendor, device, \
1523 PCI_ANY_ID, 0, hook)
1524 #define DECLARE_PCI_FIXUP_SUSPEND(vendor, device, hook) \
1525 DECLARE_PCI_FIXUP_SECTION(.pci_fixup_suspend, \
1526 suspend##hook, vendor, device, \
1527 PCI_ANY_ID, 0, hook)
1528
1529 #ifdef CONFIG_PCI_QUIRKS
1530 void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev);
1531 struct pci_dev *pci_get_dma_source(struct pci_dev *dev);
1532 int pci_dev_specific_acs_enabled(struct pci_dev *dev, u16 acs_flags);
1533 #else
1534 static inline void pci_fixup_device(enum pci_fixup_pass pass,
1535 struct pci_dev *dev) { }
1536 static inline struct pci_dev *pci_get_dma_source(struct pci_dev *dev)
1537 {
1538 return pci_dev_get(dev);
1539 }
1540 static inline int pci_dev_specific_acs_enabled(struct pci_dev *dev,
1541 u16 acs_flags)
1542 {
1543 return -ENOTTY;
1544 }
1545 #endif
1546
1547 void __iomem *pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen);
1548 void pcim_iounmap(struct pci_dev *pdev, void __iomem *addr);
1549 void __iomem * const *pcim_iomap_table(struct pci_dev *pdev);
1550 int pcim_iomap_regions(struct pci_dev *pdev, int mask, const char *name);
1551 int pcim_iomap_regions_request_all(struct pci_dev *pdev, int mask,
1552 const char *name);
1553 void pcim_iounmap_regions(struct pci_dev *pdev, int mask);
1554
1555 extern int pci_pci_problems;
1556 #define PCIPCI_FAIL 1 /* No PCI PCI DMA */
1557 #define PCIPCI_TRITON 2
1558 #define PCIPCI_NATOMA 4
1559 #define PCIPCI_VIAETBF 8
1560 #define PCIPCI_VSFX 16
1561 #define PCIPCI_ALIMAGIK 32 /* Need low latency setting */
1562 #define PCIAGP_FAIL 64 /* No PCI to AGP DMA */
1563
1564 extern unsigned long pci_cardbus_io_size;
1565 extern unsigned long pci_cardbus_mem_size;
1566 extern u8 pci_dfl_cache_line_size;
1567 extern u8 pci_cache_line_size;
1568
1569 extern unsigned long pci_hotplug_io_size;
1570 extern unsigned long pci_hotplug_mem_size;
1571
1572 /* Architecture-specific versions may override these (weak) */
1573 int pcibios_add_platform_entries(struct pci_dev *dev);
1574 void pcibios_disable_device(struct pci_dev *dev);
1575 void pcibios_set_master(struct pci_dev *dev);
1576 int pcibios_set_pcie_reset_state(struct pci_dev *dev,
1577 enum pcie_reset_state state);
1578 int pcibios_add_device(struct pci_dev *dev);
1579 void pcibios_release_device(struct pci_dev *dev);
1580
1581 #ifdef CONFIG_HIBERNATE_CALLBACKS
1582 extern struct dev_pm_ops pcibios_pm_ops;
1583 #endif
1584
1585 #ifdef CONFIG_PCI_MMCONFIG
1586 void __init pci_mmcfg_early_init(void);
1587 void __init pci_mmcfg_late_init(void);
1588 #else
1589 static inline void pci_mmcfg_early_init(void) { }
1590 static inline void pci_mmcfg_late_init(void) { }
1591 #endif
1592
1593 int pci_ext_cfg_avail(void);
1594
1595 void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar);
1596
1597 #ifdef CONFIG_PCI_IOV
1598 int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn);
1599 void pci_disable_sriov(struct pci_dev *dev);
1600 irqreturn_t pci_sriov_migration(struct pci_dev *dev);
1601 int pci_num_vf(struct pci_dev *dev);
1602 int pci_vfs_assigned(struct pci_dev *dev);
1603 int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs);
1604 int pci_sriov_get_totalvfs(struct pci_dev *dev);
1605 #else
1606 static inline int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn)
1607 { return -ENODEV; }
1608 static inline void pci_disable_sriov(struct pci_dev *dev) { }
1609 static inline irqreturn_t pci_sriov_migration(struct pci_dev *dev)
1610 { return IRQ_NONE; }
1611 static inline int pci_num_vf(struct pci_dev *dev) { return 0; }
1612 static inline int pci_vfs_assigned(struct pci_dev *dev)
1613 { return 0; }
1614 static inline int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs)
1615 { return 0; }
1616 static inline int pci_sriov_get_totalvfs(struct pci_dev *dev)
1617 { return 0; }
1618 #endif
1619
1620 #if defined(CONFIG_HOTPLUG_PCI) || defined(CONFIG_HOTPLUG_PCI_MODULE)
1621 void pci_hp_create_module_link(struct pci_slot *pci_slot);
1622 void pci_hp_remove_module_link(struct pci_slot *pci_slot);
1623 #endif
1624
1625 /**
1626 * pci_pcie_cap - get the saved PCIe capability offset
1627 * @dev: PCI device
1628 *
1629 * PCIe capability offset is calculated at PCI device initialization
1630 * time and saved in the data structure. This function returns saved
1631 * PCIe capability offset. Using this instead of pci_find_capability()
1632 * reduces unnecessary search in the PCI configuration space. If you
1633 * need to calculate PCIe capability offset from raw device for some
1634 * reasons, please use pci_find_capability() instead.
1635 */
1636 static inline int pci_pcie_cap(struct pci_dev *dev)
1637 {
1638 return dev->pcie_cap;
1639 }
1640
1641 /**
1642 * pci_is_pcie - check if the PCI device is PCI Express capable
1643 * @dev: PCI device
1644 *
1645 * Returns: true if the PCI device is PCI Express capable, false otherwise.
1646 */
1647 static inline bool pci_is_pcie(struct pci_dev *dev)
1648 {
1649 return pci_pcie_cap(dev);
1650 }
1651
1652 /**
1653 * pcie_caps_reg - get the PCIe Capabilities Register
1654 * @dev: PCI device
1655 */
1656 static inline u16 pcie_caps_reg(const struct pci_dev *dev)
1657 {
1658 return dev->pcie_flags_reg;
1659 }
1660
1661 /**
1662 * pci_pcie_type - get the PCIe device/port type
1663 * @dev: PCI device
1664 */
1665 static inline int pci_pcie_type(const struct pci_dev *dev)
1666 {
1667 return (pcie_caps_reg(dev) & PCI_EXP_FLAGS_TYPE) >> 4;
1668 }
1669
1670 void pci_request_acs(void);
1671 bool pci_acs_enabled(struct pci_dev *pdev, u16 acs_flags);
1672 bool pci_acs_path_enabled(struct pci_dev *start,
1673 struct pci_dev *end, u16 acs_flags);
1674
1675 #define PCI_VPD_LRDT 0x80 /* Large Resource Data Type */
1676 #define PCI_VPD_LRDT_ID(x) (x | PCI_VPD_LRDT)
1677
1678 /* Large Resource Data Type Tag Item Names */
1679 #define PCI_VPD_LTIN_ID_STRING 0x02 /* Identifier String */
1680 #define PCI_VPD_LTIN_RO_DATA 0x10 /* Read-Only Data */
1681 #define PCI_VPD_LTIN_RW_DATA 0x11 /* Read-Write Data */
1682
1683 #define PCI_VPD_LRDT_ID_STRING PCI_VPD_LRDT_ID(PCI_VPD_LTIN_ID_STRING)
1684 #define PCI_VPD_LRDT_RO_DATA PCI_VPD_LRDT_ID(PCI_VPD_LTIN_RO_DATA)
1685 #define PCI_VPD_LRDT_RW_DATA PCI_VPD_LRDT_ID(PCI_VPD_LTIN_RW_DATA)
1686
1687 /* Small Resource Data Type Tag Item Names */
1688 #define PCI_VPD_STIN_END 0x78 /* End */
1689
1690 #define PCI_VPD_SRDT_END PCI_VPD_STIN_END
1691
1692 #define PCI_VPD_SRDT_TIN_MASK 0x78
1693 #define PCI_VPD_SRDT_LEN_MASK 0x07
1694
1695 #define PCI_VPD_LRDT_TAG_SIZE 3
1696 #define PCI_VPD_SRDT_TAG_SIZE 1
1697
1698 #define PCI_VPD_INFO_FLD_HDR_SIZE 3
1699
1700 #define PCI_VPD_RO_KEYWORD_PARTNO "PN"
1701 #define PCI_VPD_RO_KEYWORD_MFR_ID "MN"
1702 #define PCI_VPD_RO_KEYWORD_VENDOR0 "V0"
1703 #define PCI_VPD_RO_KEYWORD_CHKSUM "RV"
1704
1705 /**
1706 * pci_vpd_lrdt_size - Extracts the Large Resource Data Type length
1707 * @lrdt: Pointer to the beginning of the Large Resource Data Type tag
1708 *
1709 * Returns the extracted Large Resource Data Type length.
1710 */
1711 static inline u16 pci_vpd_lrdt_size(const u8 *lrdt)
1712 {
1713 return (u16)lrdt[1] + ((u16)lrdt[2] << 8);
1714 }
1715
1716 /**
1717 * pci_vpd_srdt_size - Extracts the Small Resource Data Type length
1718 * @lrdt: Pointer to the beginning of the Small Resource Data Type tag
1719 *
1720 * Returns the extracted Small Resource Data Type length.
1721 */
1722 static inline u8 pci_vpd_srdt_size(const u8 *srdt)
1723 {
1724 return (*srdt) & PCI_VPD_SRDT_LEN_MASK;
1725 }
1726
1727 /**
1728 * pci_vpd_info_field_size - Extracts the information field length
1729 * @lrdt: Pointer to the beginning of an information field header
1730 *
1731 * Returns the extracted information field length.
1732 */
1733 static inline u8 pci_vpd_info_field_size(const u8 *info_field)
1734 {
1735 return info_field[2];
1736 }
1737
1738 /**
1739 * pci_vpd_find_tag - Locates the Resource Data Type tag provided
1740 * @buf: Pointer to buffered vpd data
1741 * @off: The offset into the buffer at which to begin the search
1742 * @len: The length of the vpd buffer
1743 * @rdt: The Resource Data Type to search for
1744 *
1745 * Returns the index where the Resource Data Type was found or
1746 * -ENOENT otherwise.
1747 */
1748 int pci_vpd_find_tag(const u8 *buf, unsigned int off, unsigned int len, u8 rdt);
1749
1750 /**
1751 * pci_vpd_find_info_keyword - Locates an information field keyword in the VPD
1752 * @buf: Pointer to buffered vpd data
1753 * @off: The offset into the buffer at which to begin the search
1754 * @len: The length of the buffer area, relative to off, in which to search
1755 * @kw: The keyword to search for
1756 *
1757 * Returns the index where the information field keyword was found or
1758 * -ENOENT otherwise.
1759 */
1760 int pci_vpd_find_info_keyword(const u8 *buf, unsigned int off,
1761 unsigned int len, const char *kw);
1762
1763 /* PCI <-> OF binding helpers */
1764 #ifdef CONFIG_OF
1765 struct device_node;
1766 void pci_set_of_node(struct pci_dev *dev);
1767 void pci_release_of_node(struct pci_dev *dev);
1768 void pci_set_bus_of_node(struct pci_bus *bus);
1769 void pci_release_bus_of_node(struct pci_bus *bus);
1770
1771 /* Arch may override this (weak) */
1772 struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus);
1773
1774 static inline struct device_node *
1775 pci_device_to_OF_node(const struct pci_dev *pdev)
1776 {
1777 return pdev ? pdev->dev.of_node : NULL;
1778 }
1779
1780 static inline struct device_node *pci_bus_to_OF_node(struct pci_bus *bus)
1781 {
1782 return bus ? bus->dev.of_node : NULL;
1783 }
1784
1785 #else /* CONFIG_OF */
1786 static inline void pci_set_of_node(struct pci_dev *dev) { }
1787 static inline void pci_release_of_node(struct pci_dev *dev) { }
1788 static inline void pci_set_bus_of_node(struct pci_bus *bus) { }
1789 static inline void pci_release_bus_of_node(struct pci_bus *bus) { }
1790 #endif /* CONFIG_OF */
1791
1792 #ifdef CONFIG_EEH
1793 static inline struct eeh_dev *pci_dev_to_eeh_dev(struct pci_dev *pdev)
1794 {
1795 return pdev->dev.archdata.edev;
1796 }
1797 #endif
1798
1799 /**
1800 * pci_find_upstream_pcie_bridge - find upstream PCIe-to-PCI bridge of a device
1801 * @pdev: the PCI device
1802 *
1803 * if the device is PCIE, return NULL
1804 * if the device isn't connected to a PCIe bridge (that is its parent is a
1805 * legacy PCI bridge and the bridge is directly connected to bus 0), return its
1806 * parent
1807 */
1808 struct pci_dev *pci_find_upstream_pcie_bridge(struct pci_dev *pdev);
1809
1810 #endif /* LINUX_PCI_H */ 1 #ifndef __LINUX_SPINLOCK_H
2 #define __LINUX_SPINLOCK_H
3
4 /*
5 * include/linux/spinlock.h - generic spinlock/rwlock declarations
6 *
7 * here's the role of the various spinlock/rwlock related include files:
8 *
9 * on SMP builds:
10 *
11 * asm/spinlock_types.h: contains the arch_spinlock_t/arch_rwlock_t and the
12 * initializers
13 *
14 * linux/spinlock_types.h:
15 * defines the generic type and initializers
16 *
17 * asm/spinlock.h: contains the arch_spin_*()/etc. lowlevel
18 * implementations, mostly inline assembly code
19 *
20 * (also included on UP-debug builds:)
21 *
22 * linux/spinlock_api_smp.h:
23 * contains the prototypes for the _spin_*() APIs.
24 *
25 * linux/spinlock.h: builds the final spin_*() APIs.
26 *
27 * on UP builds:
28 *
29 * linux/spinlock_type_up.h:
30 * contains the generic, simplified UP spinlock type.
31 * (which is an empty structure on non-debug builds)
32 *
33 * linux/spinlock_types.h:
34 * defines the generic type and initializers
35 *
36 * linux/spinlock_up.h:
37 * contains the arch_spin_*()/etc. version of UP
38 * builds. (which are NOPs on non-debug, non-preempt
39 * builds)
40 *
41 * (included on UP-non-debug builds:)
42 *
43 * linux/spinlock_api_up.h:
44 * builds the _spin_*() APIs.
45 *
46 * linux/spinlock.h: builds the final spin_*() APIs.
47 */
48
49 #include <linux/typecheck.h>
50 #include <linux/preempt.h>
51 #include <linux/linkage.h>
52 #include <linux/compiler.h>
53 #include <linux/irqflags.h>
54 #include <linux/thread_info.h>
55 #include <linux/kernel.h>
56 #include <linux/stringify.h>
57 #include <linux/bottom_half.h>
58 #include <asm/barrier.h>
59
60
61 /*
62 * Must define these before including other files, inline functions need them
63 */
64 #define LOCK_SECTION_NAME ".text..lock."KBUILD_BASENAME
65
66 #define LOCK_SECTION_START(extra) \
67 ".subsection 1\n\t" \
68 extra \
69 ".ifndef " LOCK_SECTION_NAME "\n\t" \
70 LOCK_SECTION_NAME ":\n\t" \
71 ".endif\n"
72
73 #define LOCK_SECTION_END \
74 ".previous\n\t"
75
76 #define __lockfunc __attribute__((section(".spinlock.text")))
77
78 /*
79 * Pull the arch_spinlock_t and arch_rwlock_t definitions:
80 */
81 #include <linux/spinlock_types.h>
82
83 /*
84 * Pull the arch_spin*() functions/declarations (UP-nondebug doesn't need them):
85 */
86 #ifdef CONFIG_SMP
87 # include <asm/spinlock.h>
88 #else
89 # include <linux/spinlock_up.h>
90 #endif
91
92 #ifdef CONFIG_DEBUG_SPINLOCK
93 extern void __raw_spin_lock_init(raw_spinlock_t *lock, const char *name,
94 struct lock_class_key *key);
95 # define raw_spin_lock_init(lock) \
96 do { \
97 static struct lock_class_key __key; \
98 \
99 __raw_spin_lock_init((lock), #lock, &__key); \
100 } while (0)
101
102 #else
103 # define raw_spin_lock_init(lock) \
104 do { *(lock) = __RAW_SPIN_LOCK_UNLOCKED(lock); } while (0)
105 #endif
106
107 #define raw_spin_is_locked(lock) arch_spin_is_locked(&(lock)->raw_lock)
108
109 #ifdef CONFIG_GENERIC_LOCKBREAK
110 #define raw_spin_is_contended(lock) ((lock)->break_lock)
111 #else
112
113 #ifdef arch_spin_is_contended
114 #define raw_spin_is_contended(lock) arch_spin_is_contended(&(lock)->raw_lock)
115 #else
116 #define raw_spin_is_contended(lock) (((void)(lock), 0))
117 #endif /*arch_spin_is_contended*/
118 #endif
119
120 /*
121 * Despite its name it doesn't necessarily has to be a full barrier.
122 * It should only guarantee that a STORE before the critical section
123 * can not be reordered with a LOAD inside this section.
124 * spin_lock() is the one-way barrier, this LOAD can not escape out
125 * of the region. So the default implementation simply ensures that
126 * a STORE can not move into the critical section, smp_wmb() should
127 * serialize it with another STORE done by spin_lock().
128 */
129 #ifndef smp_mb__before_spinlock
130 #define smp_mb__before_spinlock() smp_wmb()
131 #endif
132
133 /*
134 * Place this after a lock-acquisition primitive to guarantee that
135 * an UNLOCK+LOCK pair act as a full barrier. This guarantee applies
136 * if the UNLOCK and LOCK are executed by the same CPU or if the
137 * UNLOCK and LOCK operate on the same lock variable.
138 */
139 #ifndef smp_mb__after_unlock_lock
140 #define smp_mb__after_unlock_lock() do { } while (0)
141 #endif
142
143 /**
144 * raw_spin_unlock_wait - wait until the spinlock gets unlocked
145 * @lock: the spinlock in question.
146 */
147 #define raw_spin_unlock_wait(lock) arch_spin_unlock_wait(&(lock)->raw_lock)
148
149 #ifdef CONFIG_DEBUG_SPINLOCK
150 extern void do_raw_spin_lock(raw_spinlock_t *lock) __acquires(lock);
151 #define do_raw_spin_lock_flags(lock, flags) do_raw_spin_lock(lock)
152 extern int do_raw_spin_trylock(raw_spinlock_t *lock);
153 extern void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock);
154 #else
155 static inline void do_raw_spin_lock(raw_spinlock_t *lock) __acquires(lock)
156 {
157 __acquire(lock);
158 arch_spin_lock(&lock->raw_lock);
159 }
160
161 static inline void
162 do_raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long *flags) __acquires(lock)
163 {
164 __acquire(lock);
165 arch_spin_lock_flags(&lock->raw_lock, *flags);
166 }
167
168 static inline int do_raw_spin_trylock(raw_spinlock_t *lock)
169 {
170 return arch_spin_trylock(&(lock)->raw_lock);
171 }
172
173 static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock)
174 {
175 arch_spin_unlock(&lock->raw_lock);
176 __release(lock);
177 }
178 #endif
179
180 /*
181 * Define the various spin_lock methods. Note we define these
182 * regardless of whether CONFIG_SMP or CONFIG_PREEMPT are set. The
183 * various methods are defined as nops in the case they are not
184 * required.
185 */
186 #define raw_spin_trylock(lock) __cond_lock(lock, _raw_spin_trylock(lock))
187
188 #define raw_spin_lock(lock) _raw_spin_lock(lock)
189
190 #ifdef CONFIG_DEBUG_LOCK_ALLOC
191 # define raw_spin_lock_nested(lock, subclass) \
192 _raw_spin_lock_nested(lock, subclass)
193
194 # define raw_spin_lock_nest_lock(lock, nest_lock) \
195 do { \
196 typecheck(struct lockdep_map *, &(nest_lock)->dep_map);\
197 _raw_spin_lock_nest_lock(lock, &(nest_lock)->dep_map); \
198 } while (0)
199 #else
200 # define raw_spin_lock_nested(lock, subclass) _raw_spin_lock(lock)
201 # define raw_spin_lock_nest_lock(lock, nest_lock) _raw_spin_lock(lock)
202 #endif
203
204 #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
205
206 #define raw_spin_lock_irqsave(lock, flags) \
207 do { \
208 typecheck(unsigned long, flags); \
209 flags = _raw_spin_lock_irqsave(lock); \
210 } while (0)
211
212 #ifdef CONFIG_DEBUG_LOCK_ALLOC
213 #define raw_spin_lock_irqsave_nested(lock, flags, subclass) \
214 do { \
215 typecheck(unsigned long, flags); \
216 flags = _raw_spin_lock_irqsave_nested(lock, subclass); \
217 } while (0)
218 #else
219 #define raw_spin_lock_irqsave_nested(lock, flags, subclass) \
220 do { \
221 typecheck(unsigned long, flags); \
222 flags = _raw_spin_lock_irqsave(lock); \
223 } while (0)
224 #endif
225
226 #else
227
228 #define raw_spin_lock_irqsave(lock, flags) \
229 do { \
230 typecheck(unsigned long, flags); \
231 _raw_spin_lock_irqsave(lock, flags); \
232 } while (0)
233
234 #define raw_spin_lock_irqsave_nested(lock, flags, subclass) \
235 raw_spin_lock_irqsave(lock, flags)
236
237 #endif
238
239 #define raw_spin_lock_irq(lock) _raw_spin_lock_irq(lock)
240 #define raw_spin_lock_bh(lock) _raw_spin_lock_bh(lock)
241 #define raw_spin_unlock(lock) _raw_spin_unlock(lock)
242 #define raw_spin_unlock_irq(lock) _raw_spin_unlock_irq(lock)
243
244 #define raw_spin_unlock_irqrestore(lock, flags) \
245 do { \
246 typecheck(unsigned long, flags); \
247 _raw_spin_unlock_irqrestore(lock, flags); \
248 } while (0)
249 #define raw_spin_unlock_bh(lock) _raw_spin_unlock_bh(lock)
250
251 #define raw_spin_trylock_bh(lock) \
252 __cond_lock(lock, _raw_spin_trylock_bh(lock))
253
254 #define raw_spin_trylock_irq(lock) \
255 ({ \
256 local_irq_disable(); \
257 raw_spin_trylock(lock) ? \
258 1 : ({ local_irq_enable(); 0; }); \
259 })
260
261 #define raw_spin_trylock_irqsave(lock, flags) \
262 ({ \
263 local_irq_save(flags); \
264 raw_spin_trylock(lock) ? \
265 1 : ({ local_irq_restore(flags); 0; }); \
266 })
267
268 /**
269 * raw_spin_can_lock - would raw_spin_trylock() succeed?
270 * @lock: the spinlock in question.
271 */
272 #define raw_spin_can_lock(lock) (!raw_spin_is_locked(lock))
273
274 /* Include rwlock functions */
275 #include <linux/rwlock.h>
276
277 /*
278 * Pull the _spin_*()/_read_*()/_write_*() functions/declarations:
279 */
280 #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
281 # include <linux/spinlock_api_smp.h>
282 #else
283 # include <linux/spinlock_api_up.h>
284 #endif
285
286 /*
287 * Map the spin_lock functions to the raw variants for PREEMPT_RT=n
288 */
289
290 static inline raw_spinlock_t *spinlock_check(spinlock_t *lock)
291 {
292 return &lock->rlock;
293 }
294
295 #define spin_lock_init(_lock) \
296 do { \
297 spinlock_check(_lock); \
298 raw_spin_lock_init(&(_lock)->rlock); \
299 } while (0)
300
301 static inline void spin_lock(spinlock_t *lock)
302 {
303 raw_spin_lock(&lock->rlock);
304 }
305
306 static inline void spin_lock_bh(spinlock_t *lock)
307 {
308 raw_spin_lock_bh(&lock->rlock);
309 }
310
311 static inline int spin_trylock(spinlock_t *lock)
312 {
313 return raw_spin_trylock(&lock->rlock);
314 }
315
316 #define spin_lock_nested(lock, subclass) \
317 do { \
318 raw_spin_lock_nested(spinlock_check(lock), subclass); \
319 } while (0)
320
321 #define spin_lock_nest_lock(lock, nest_lock) \
322 do { \
323 raw_spin_lock_nest_lock(spinlock_check(lock), nest_lock); \
324 } while (0)
325
326 static inline void spin_lock_irq(spinlock_t *lock)
327 {
328 raw_spin_lock_irq(&lock->rlock);
329 }
330
331 #define spin_lock_irqsave(lock, flags) \
332 do { \
333 raw_spin_lock_irqsave(spinlock_check(lock), flags); \
334 } while (0)
335
336 #define spin_lock_irqsave_nested(lock, flags, subclass) \
337 do { \
338 raw_spin_lock_irqsave_nested(spinlock_check(lock), flags, subclass); \
339 } while (0)
340
341 static inline void spin_unlock(spinlock_t *lock)
342 {
343 raw_spin_unlock(&lock->rlock);
344 }
345
346 static inline void spin_unlock_bh(spinlock_t *lock)
347 {
348 raw_spin_unlock_bh(&lock->rlock);
349 }
350
351 static inline void spin_unlock_irq(spinlock_t *lock)
352 {
353 raw_spin_unlock_irq(&lock->rlock);
354 }
355
356 static inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
357 {
358 raw_spin_unlock_irqrestore(&lock->rlock, flags);
359 }
360
361 static inline int spin_trylock_bh(spinlock_t *lock)
362 {
363 return raw_spin_trylock_bh(&lock->rlock);
364 }
365
366 static inline int spin_trylock_irq(spinlock_t *lock)
367 {
368 return raw_spin_trylock_irq(&lock->rlock);
369 }
370
371 #define spin_trylock_irqsave(lock, flags) \
372 ({ \
373 raw_spin_trylock_irqsave(spinlock_check(lock), flags); \
374 })
375
376 static inline void spin_unlock_wait(spinlock_t *lock)
377 {
378 raw_spin_unlock_wait(&lock->rlock);
379 }
380
381 static inline int spin_is_locked(spinlock_t *lock)
382 {
383 return raw_spin_is_locked(&lock->rlock);
384 }
385
386 static inline int spin_is_contended(spinlock_t *lock)
387 {
388 return raw_spin_is_contended(&lock->rlock);
389 }
390
391 static inline int spin_can_lock(spinlock_t *lock)
392 {
393 return raw_spin_can_lock(&lock->rlock);
394 }
395
396 #define assert_spin_locked(lock) assert_raw_spin_locked(&(lock)->rlock)
397
398 /*
399 * Pull the atomic_t declaration:
400 * (asm-mips/atomic.h needs above definitions)
401 */
402 #include <linux/atomic.h>
403 /**
404 * atomic_dec_and_lock - lock on reaching reference count zero
405 * @atomic: the atomic counter
406 * @lock: the spinlock in question
407 *
408 * Decrements @atomic by 1. If the result is 0, returns true and locks
409 * @lock. Returns false for all other cases.
410 */
411 extern int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock);
412 #define atomic_dec_and_lock(atomic, lock) \
413 __cond_lock(lock, _atomic_dec_and_lock(atomic, lock))
414
415 #endif /* __LINUX_SPINLOCK_H */ 1 #ifndef _LDV_RCV_H_
2 #define _LDV_RCV_H_
3
4 /* If expr evaluates to zero, ldv_assert() causes a program to reach the error
5 label like the standard assert(). */
6 #define ldv_assert(expr) ((expr) ? 0 : ldv_error())
7
8 /* The error label wrapper. It is used because of some static verifiers (like
9 BLAST) don't accept multiple error labels through a program. */
10 static inline void ldv_error(void)
11 {
12 LDV_ERROR: goto LDV_ERROR;
13 }
14
15 /* If expr evaluates to zero, ldv_assume() causes an infinite loop that is
16 avoided by verifiers. */
17 #define ldv_assume(expr) ((expr) ? 0 : ldv_stop())
18
19 /* Infinite loop, that causes verifiers to skip such paths. */
20 static inline void ldv_stop(void) {
21 LDV_STOP: goto LDV_STOP;
22 }
23
24 /* Special nondeterministic functions. */
25 int ldv_undef_int(void);
26 void *ldv_undef_ptr(void);
27 unsigned long ldv_undef_ulong(void);
28 long ldv_undef_long(void);
29 /* Return nondeterministic negative integer number. */
30 static inline int ldv_undef_int_negative(void)
31 {
32 int ret = ldv_undef_int();
33
34 ldv_assume(ret < 0);
35
36 return ret;
37 }
38 /* Return nondeterministic nonpositive integer number. */
39 static inline int ldv_undef_int_nonpositive(void)
40 {
41 int ret = ldv_undef_int();
42
43 ldv_assume(ret <= 0);
44
45 return ret;
46 }
47
48 /* Add explicit model for __builin_expect GCC function. Without the model a
49 return value will be treated as nondetermined by verifiers. */
50 static inline long __builtin_expect(long exp, long c)
51 {
52 return exp;
53 }
54
55 /* This function causes the program to exit abnormally. GCC implements this
56 function by using a target-dependent mechanism (such as intentionally executing
57 an illegal instruction) or by calling abort. The mechanism used may vary from
58 release to release so you should not rely on any particular implementation.
59 http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html */
60 static inline void __builtin_trap(void)
61 {
62 ldv_assert(0);
63 }
64
65 /* The constant is for simulating an error of ldv_undef_ptr() function. */
66 #define LDV_PTR_MAX 2012
67
68 #endif /* _LDV_RCV_H_ */ |
Here is an explanation of a rule violation arisen while checking your driver against a corresponding kernel.
Note that it may be false positive, i.e. there isn't a real error indeed. Please analyze a given error trace and related source code to understand whether there is an error in your driver.
Error trace column contains a path on which the given rule is violated. You can expand/collapse some entity classes by clicking on corresponding checkboxes in a main menu or in an advanced Others menu. Also you can expand/collapse each particular entity by clicking on +/-. In hovering on some entities you can see some tips. Also the error trace is bound with related source code. Line numbers may be shown as links on the left. You can click on them to open corresponding lines in source code.
Source code column contains a content of files related with the error trace. There is source code of your driver (note that there are some LDV modifications at the end), kernel headers and rule model. Tabs show a currently opened file and other available files. In hovering on them you can see full file names. On clicking a corresponding file content will be shown.
Kernel | Module | Rule | Verifier | Verdict | Status | Timestamp | Bug report |
linux-3.14.1.tar.xz | drivers/net/wireless/ipw2x00/ipw2100.ko | 331_1a | CPAchecker | Bug | Fixed | 2016-01-02 02:20:31 | L0216 |
Comment
reported: 2 Jan 2016
[Home]