Drivers that load firmware from their probe routine have problems with the latest versions of udev as they get timeouts while waiting for user space to start. The problem is fixed by using request_firmware_nowait() and delaying the start of mac80211 until the firmware is loaded. To prevent the possibility of the driver being unloaded while the firmware loading callback is still active, a completion queue entry is used. Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Signed-off-by: Christian Lamparter <chunkeey@googlemail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
		
			
				
	
	
		
			112 lines
		
	
	
	
		
			3.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
	
		
			3.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef P54PCI_H
 | 
						|
#define P54PCI_H
 | 
						|
#include <linux/interrupt.h>
 | 
						|
 | 
						|
/*
 | 
						|
 * Defines for PCI based mac80211 Prism54 driver
 | 
						|
 *
 | 
						|
 * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net>
 | 
						|
 *
 | 
						|
 * Based on the islsm (softmac prism54) driver, which is:
 | 
						|
 * Copyright 2004-2006 Jean-Baptiste Note <jbnote@gmail.com>, et al.
 | 
						|
 *
 | 
						|
 * This program is free software; you can redistribute it and/or modify
 | 
						|
 * it under the terms of the GNU General Public License version 2 as
 | 
						|
 * published by the Free Software Foundation.
 | 
						|
 */
 | 
						|
 | 
						|
/* Device Interrupt register bits */
 | 
						|
#define ISL38XX_DEV_INT_RESET                   0x0001
 | 
						|
#define ISL38XX_DEV_INT_UPDATE                  0x0002
 | 
						|
#define ISL38XX_DEV_INT_WAKEUP                  0x0008
 | 
						|
#define ISL38XX_DEV_INT_SLEEP                   0x0010
 | 
						|
#define ISL38XX_DEV_INT_ABORT                   0x0020
 | 
						|
/* these two only used in USB */
 | 
						|
#define ISL38XX_DEV_INT_DATA                    0x0040
 | 
						|
#define ISL38XX_DEV_INT_MGMT                    0x0080
 | 
						|
 | 
						|
#define ISL38XX_DEV_INT_PCIUART_CTS             0x4000
 | 
						|
#define ISL38XX_DEV_INT_PCIUART_DR              0x8000
 | 
						|
 | 
						|
/* Interrupt Identification/Acknowledge/Enable register bits */
 | 
						|
#define ISL38XX_INT_IDENT_UPDATE		0x0002
 | 
						|
#define ISL38XX_INT_IDENT_INIT			0x0004
 | 
						|
#define ISL38XX_INT_IDENT_WAKEUP		0x0008
 | 
						|
#define ISL38XX_INT_IDENT_SLEEP			0x0010
 | 
						|
#define ISL38XX_INT_IDENT_PCIUART_CTS		0x4000
 | 
						|
#define ISL38XX_INT_IDENT_PCIUART_DR		0x8000
 | 
						|
 | 
						|
/* Control/Status register bits */
 | 
						|
#define ISL38XX_CTRL_STAT_SLEEPMODE		0x00000200
 | 
						|
#define ISL38XX_CTRL_STAT_CLKRUN		0x00800000
 | 
						|
#define ISL38XX_CTRL_STAT_RESET			0x10000000
 | 
						|
#define ISL38XX_CTRL_STAT_RAMBOOT		0x20000000
 | 
						|
#define ISL38XX_CTRL_STAT_STARTHALTED		0x40000000
 | 
						|
#define ISL38XX_CTRL_STAT_HOST_OVERRIDE		0x80000000
 | 
						|
 | 
						|
struct p54p_csr {
 | 
						|
	__le32 dev_int;
 | 
						|
	u8 unused_1[12];
 | 
						|
	__le32 int_ident;
 | 
						|
	__le32 int_ack;
 | 
						|
	__le32 int_enable;
 | 
						|
	u8 unused_2[4];
 | 
						|
	union {
 | 
						|
		__le32 ring_control_base;
 | 
						|
		__le32 gen_purp_com[2];
 | 
						|
	};
 | 
						|
	u8 unused_3[8];
 | 
						|
	__le32 direct_mem_base;
 | 
						|
	u8 unused_4[44];
 | 
						|
	__le32 dma_addr;
 | 
						|
	__le32 dma_len;
 | 
						|
	__le32 dma_ctrl;
 | 
						|
	u8 unused_5[12];
 | 
						|
	__le32 ctrl_stat;
 | 
						|
	u8 unused_6[1924];
 | 
						|
	u8 cardbus_cis[0x800];
 | 
						|
	u8 direct_mem_win[0x1000];
 | 
						|
} __packed;
 | 
						|
 | 
						|
/* usb backend only needs the register defines above */
 | 
						|
#ifndef P54USB_H
 | 
						|
struct p54p_desc {
 | 
						|
	__le32 host_addr;
 | 
						|
	__le32 device_addr;
 | 
						|
	__le16 len;
 | 
						|
	__le16 flags;
 | 
						|
} __packed;
 | 
						|
 | 
						|
struct p54p_ring_control {
 | 
						|
	__le32 host_idx[4];
 | 
						|
	__le32 device_idx[4];
 | 
						|
	struct p54p_desc rx_data[8];
 | 
						|
	struct p54p_desc tx_data[32];
 | 
						|
	struct p54p_desc rx_mgmt[4];
 | 
						|
	struct p54p_desc tx_mgmt[4];
 | 
						|
} __packed;
 | 
						|
 | 
						|
#define P54P_READ(r) (__force __le32)__raw_readl(&priv->map->r)
 | 
						|
#define P54P_WRITE(r, val) __raw_writel((__force u32)(__le32)(val), &priv->map->r)
 | 
						|
 | 
						|
struct p54p_priv {
 | 
						|
	struct p54_common common;
 | 
						|
	struct pci_dev *pdev;
 | 
						|
	struct p54p_csr __iomem *map;
 | 
						|
	struct tasklet_struct tasklet;
 | 
						|
	const struct firmware *firmware;
 | 
						|
	spinlock_t lock;
 | 
						|
	struct p54p_ring_control *ring_control;
 | 
						|
	dma_addr_t ring_control_dma;
 | 
						|
	u32 rx_idx_data, tx_idx_data;
 | 
						|
	u32 rx_idx_mgmt, tx_idx_mgmt;
 | 
						|
	struct sk_buff *rx_buf_data[8];
 | 
						|
	struct sk_buff *rx_buf_mgmt[4];
 | 
						|
	struct sk_buff *tx_buf_data[32];
 | 
						|
	struct sk_buff *tx_buf_mgmt[4];
 | 
						|
	struct completion boot_comp;
 | 
						|
	struct completion fw_loaded;
 | 
						|
};
 | 
						|
 | 
						|
#endif /* P54USB_H */
 | 
						|
#endif /* P54PCI_H */
 |