Commit 55748633 authored by Richard Russon's avatar Richard Russon

Merge flatcap.org:/home/flatcap/backup/bk/linux-2.6

into flatcap.org:/home/flatcap/backup/bk/ntfs-2.6-devel
parents ecd731d4 088b4154
......@@ -1843,6 +1843,37 @@ void dump_stack(void)
EXPORT_SYMBOL(dump_stack);
static inline int is_kernel_stack(struct task_struct *task,
struct reg_window *rw)
{
unsigned long rw_addr = (unsigned long) rw;
unsigned long thread_base, thread_end;
if (rw_addr < PAGE_OFFSET) {
if (task != &init_task)
return 0;
}
thread_base = (unsigned long) task->thread_info;
thread_end = thread_base + sizeof(union thread_union);
if (rw_addr >= thread_base &&
rw_addr < thread_end &&
!(rw_addr & 0x7UL))
return 1;
return 0;
}
static inline struct reg_window *kernel_stack_up(struct reg_window *rw)
{
unsigned long fp = rw->ins[6];
if (!fp)
return NULL;
return (struct reg_window *) (fp + STACK_BIAS);
}
void die_if_kernel(char *str, struct pt_regs *regs)
{
static int die_counter;
......@@ -1868,17 +1899,14 @@ void die_if_kernel(char *str, struct pt_regs *regs)
/* Stop the back trace when we hit userland or we
* find some badly aligned kernel stack.
*/
while (rw &&
count++ < 30 &&
(((unsigned long) rw) >= PAGE_OFFSET) &&
(char *) rw < ((char *) current)
+ sizeof (union thread_union) &&
!(((unsigned long) rw) & 0x7)) {
while (rw &&
count++ < 30&&
is_kernel_stack(current, rw)) {
printk("Caller[%016lx]", rw->ins[7]);
print_symbol(": %s", rw->ins[7]);
printk("\n");
rw = (struct reg_window *)
(rw->ins[6] + STACK_BIAS);
rw = kernel_stack_up(rw);
}
instruction_dump ((unsigned int *) regs->tpc);
} else {
......
......@@ -209,7 +209,7 @@ int DRM(sg_free)( struct inode *inode, struct file *filp,
drm_scatter_gather_t request;
drm_sg_mem_t *entry;
if (drm_core_check_feature(dev, DRIVER_SG))
if (!drm_core_check_feature(dev, DRIVER_SG))
return -EINVAL;
if ( copy_from_user( &request,
......
......@@ -132,7 +132,7 @@ struct eth1394_node_info {
};
/* Our ieee1394 highlevel driver */
#define ETH1394_DRIVER_NAME "ip1394"
#define ETH1394_DRIVER_NAME "eth1394"
static const char driver_name[] = ETH1394_DRIVER_NAME;
static kmem_cache_t *packet_task_cache;
......
......@@ -200,7 +200,7 @@ source "drivers/net/arm/Kconfig"
config MACE
tristate "MACE (Power Mac ethernet) support"
depends on NET_ETHERNET && PPC32 && PPC_PMAC
depends on NET_ETHERNET && PPC_PMAC && PPC32
select CRC32
help
Power Macintoshes and clones with Ethernet built-in on the
......@@ -223,7 +223,7 @@ config MACE_AAUI_PORT
config BMAC
tristate "BMAC (G3 ethernet) support"
depends on NET_ETHERNET && PPC32 && PPC_PMAC
depends on NET_ETHERNET && PPC_PMAC && PPC32
select CRC32
help
Say Y for support of BMAC Ethernet interfaces. These are used on G3
......
......@@ -156,6 +156,7 @@ static struct pci_device_id rtl8169_pci_tbl[] = {
MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
static int rx_copybreak = 200;
static int use_dac;
enum RTL8169_registers {
MAC0 = 0, /* Ethernet hardware address. */
......@@ -358,6 +359,8 @@ MODULE_AUTHOR("Realtek");
MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver");
MODULE_PARM(media, "1-" __MODULE_STRING(MAX_UNITS) "i");
MODULE_PARM(rx_copybreak, "i");
MODULE_PARM(use_dac, "i");
MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot.");
MODULE_LICENSE("GPL");
static int rtl8169_open(struct net_device *dev);
......@@ -375,7 +378,7 @@ static int rtl8169_poll(struct net_device *dev, int *budget);
#endif
static const u16 rtl8169_intr_mask =
LinkChg | RxOverflow | RxFIFOOver | TxErr | TxOK | RxErr | RxOK;
SYSErr | LinkChg | RxOverflow | RxFIFOOver | TxErr | TxOK | RxErr | RxOK;
static const u16 rtl8169_napi_event =
RxOK | RxOverflow | RxFIFOOver | TxOK | TxErr;
static const unsigned int rtl8169_rx_config =
......@@ -984,7 +987,7 @@ rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out,
tp->cp_cmd = PCIMulRW | RxChkSum;
if ((sizeof(dma_addr_t) > 4) &&
!pci_set_dma_mask(pdev, DMA_64BIT_MASK))
!pci_set_dma_mask(pdev, DMA_64BIT_MASK) && use_dac)
tp->cp_cmd |= PCIDAC;
else {
rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
......@@ -1761,6 +1764,15 @@ rtl8169_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
if (!(status & rtl8169_intr_mask))
break;
if (unlikely(status & SYSErr)) {
printk(KERN_ERR PFX "%s: PCI error (status: 0x%04x)."
" Device disabled.\n", dev->name, status);
RTL_W8(ChipCmd, 0x00);
RTL_W16(IntrMask, 0x0000);
RTL_R16(IntrMask);
break;
}
if (status & LinkChg)
rtl8169_check_link_status(dev, tp, ioaddr);
......
......@@ -1816,7 +1816,8 @@ static int writeConfigRid(struct airo_info*ai, int lock) {
if (!test_bit (FLAG_COMMIT, &ai->flags))
return SUCCESS;
clear_bit (FLAG_COMMIT | FLAG_RESET, &ai->flags);
clear_bit (FLAG_COMMIT, &ai->flags);
clear_bit (FLAG_RESET, &ai->flags);
checkThrottle(ai);
cfgr = ai->config;
......@@ -1980,9 +1981,6 @@ static int mpi_send_packet (struct net_device *dev)
ai->txfids[0].tx_desc.eoc = 1;
ai->txfids[0].tx_desc.len =len+sizeof(WifiHdr);
memcpy((char *)ai->txfids[0].card_ram_off,
(char *)&ai->txfids[0].tx_desc, sizeof(TxFid));
/*
* Magic, the cards firmware needs a length count (2 bytes) in the host buffer
* right after TXFID_HDR.The TXFID_HDR contains the status short so payloadlen
......@@ -2012,6 +2010,7 @@ static int mpi_send_packet (struct net_device *dev)
return ERROR;
*payloadLen = cpu_to_le16(len-sizeof(etherHead)+sizeof(pMic));
ai->txfids[0].tx_desc.len += sizeof(pMic);
/* copy data into airo dma buffer */
memcpy (sendbuf, buffer, sizeof(etherHead));
buffer += sizeof(etherHead);
......@@ -2030,6 +2029,9 @@ static int mpi_send_packet (struct net_device *dev)
memcpy(sendbuf, buffer, len);
}
memcpy((char *)ai->txfids[0].card_ram_off,
(char *)&ai->txfids[0].tx_desc, sizeof(TxFid));
OUT4500(ai, EVACK, 8);
dev_kfree_skb_any(skb);
......@@ -2184,6 +2186,12 @@ static int airo_start_xmit11(struct sk_buff *skb, struct net_device *dev) {
struct airo_info *priv = dev->priv;
u32 *fids = priv->fids;
if (test_bit(FLAG_MPI, &priv->flags)) {
/* Not implemented yet for MPI350 */
netif_stop_queue(dev);
return -ENETDOWN;
}
if ( skb == NULL ) {
printk( KERN_ERR "airo: skb == NULL!!!\n" );
return 0;
......@@ -2249,12 +2257,14 @@ struct net_device_stats *airo_get_stats(struct net_device *dev)
{
struct airo_info *local = dev->priv;
/* Get stats out of the card if available */
if (down_trylock(&local->sem) != 0) {
set_bit(JOB_STATS, &local->flags);
wake_up_interruptible(&local->thr_wait);
} else
airo_read_stats(local);
if (!test_bit(JOB_STATS, &local->flags)) {
/* Get stats out of the card if available */
if (down_trylock(&local->sem) != 0) {
set_bit(JOB_STATS, &local->flags);
wake_up_interruptible(&local->thr_wait);
} else
airo_read_stats(local);
}
return &local->stats;
}
......@@ -2340,6 +2350,9 @@ static void del_airo_dev( struct net_device *dev );
void stop_airo_card( struct net_device *dev, int freeres )
{
struct airo_info *ai = dev->priv;
set_bit(FLAG_RADIO_DOWN, &ai->flags);
disable_MAC(ai, 1);
disable_interrupts(ai);
free_irq( dev->irq, dev );
takedown_proc_entry( dev, ai );
......@@ -3406,13 +3419,8 @@ static void disable_MAC( struct airo_info *ai, int lock ) {
}
static void enable_interrupts( struct airo_info *ai ) {
/* Reset the status register */
u16 status = IN4500( ai, EVSTAT );
OUT4500( ai, EVACK, status );
/* Enable the interrupts */
OUT4500( ai, EVINTEN, STATUS_INTS );
/* Note there is a race condition between the last two lines that
I don't know how to get rid of right now... */
}
static void disable_interrupts( struct airo_info *ai ) {
......@@ -3460,7 +3468,7 @@ static void mpi_receive_802_3(struct airo_info *ai)
memcpy(buffer + ETH_ALEN * 2,
ai->rxfids[0].virtual_host_addr + ETH_ALEN * 2 + off,
len - ETH_ALEN * 2 - off);
if (decapsulate (ai, &micbuf, (etherHead*)buffer, len - off)) {
if (decapsulate (ai, &micbuf, (etherHead*)buffer, len - off - ETH_ALEN * 2)) {
badmic:
dev_kfree_skb_irq (skb);
goto badrx;
......@@ -3670,18 +3678,6 @@ static u16 setup_card(struct airo_info *ai, u8 *mac, int lock)
status = readCapabilityRid(ai, &cap_rid, lock);
if ( status != SUCCESS ) return ERROR;
/*
* This driver supports MPI350 firmwares up to, and
* including 5.30.17
*/
if (test_bit(FLAG_MPI, &ai->flags) &&
strncmp (cap_rid.prodVer, "5.00.", 5) &&
strncmp (cap_rid.prodVer, "5b00.", 5) &&
strncmp (cap_rid.prodVer, "5.02.", 5) &&
strncmp (cap_rid.prodVer, "5.20.", 5) &&
strncmp (cap_rid.prodVer, "5.30.", 5))
printk(KERN_ERR "airo: Firmware version %s is not supported. Use it at your own risk!\n", cap_rid.prodVer);
status = PC4500_readrid(ai,RID_RSSI,&rssi_rid,sizeof(rssi_rid),lock);
if ( status == SUCCESS ) {
if (ai->rssi || (ai->rssi = kmalloc(512, GFP_KERNEL)) != NULL)
......@@ -3716,9 +3712,9 @@ static u16 setup_card(struct airo_info *ai, u8 *mac, int lock)
/* Check to see if there are any insmod configured
rates to add */
if ( rates ) {
if ( rates[0] ) {
int i = 0;
if ( rates[0] ) memset(ai->config.rates,0,sizeof(ai->config.rates));
memset(ai->config.rates,0,sizeof(ai->config.rates));
for( i = 0; i < 8 && rates[i]; i++ ) {
ai->config.rates[i] = rates[i];
}
......@@ -3785,7 +3781,6 @@ static u16 setup_card(struct airo_info *ai, u8 *mac, int lock)
static u16 issuecommand(struct airo_info *ai, Cmd *pCmd, Resp *pRsp) {
// Im really paranoid about letting it run forever!
int max_tries = 600000;
u16 cmd;
if (IN4500(ai, EVSTAT) & EV_CMD)
OUT4500(ai, EVACK, EV_CMD);
......@@ -3794,26 +3789,23 @@ static u16 issuecommand(struct airo_info *ai, Cmd *pCmd, Resp *pRsp) {
OUT4500(ai, PARAM1, pCmd->parm1);
OUT4500(ai, PARAM2, pCmd->parm2);
OUT4500(ai, COMMAND, pCmd->cmd);
while ( max_tries-- && (IN4500(ai, EVSTAT) & EV_CMD) == 0 &&
(cmd = IN4500(ai, COMMAND)) != 0 )
if (cmd == pCmd->cmd)
// PC4500 didn't notice command, try again
OUT4500(ai, COMMAND, pCmd->cmd);
if ( max_tries == -1 ) {
printk( KERN_ERR
"airo: Max tries exceeded when issueing command\n" );
return ERROR;
}
while (max_tries-- && (IN4500(ai, EVSTAT) & EV_CMD) == 0) {
if ((IN4500(ai, COMMAND)) == pCmd->cmd)
// PC4500 didn't notice command, try again
OUT4500(ai, COMMAND, pCmd->cmd);
if (!in_atomic() && (max_tries & 255) == 0)
schedule();
}
if ( max_tries == -1 ) {
printk( KERN_ERR
"airo: Max tries exceeded waiting for command\n" );
return ERROR;
"airo: Max tries exceeded when issueing command\n" );
if (IN4500(ai, COMMAND) & COMMAND_BUSY)
OUT4500(ai, EVACK, EV_CLEARCOMMANDBUSY);
return ERROR;
}
// command completed
pRsp->status = IN4500(ai, STATUS);
pRsp->rsp0 = IN4500(ai, RESP0);
......@@ -4509,8 +4501,6 @@ static ssize_t proc_read( struct file *file,
len = priv->readlen - pos;
if (copy_to_user(buffer, priv->rbuffer + pos, len))
return -EFAULT;
if (pos + len > priv->writelen)
priv->writelen = pos + len;
*offset = pos + len;
return len;
}
......@@ -5521,7 +5511,6 @@ static int airo_pci_resume(struct pci_dev *pdev)
mpi_init_descriptors(ai);
setup_card(ai, dev->dev_addr, 0);
clear_bit(FLAG_RADIO_OFF, &ai->flags);
clear_bit(FLAG_RADIO_DOWN, &ai->flags);
clear_bit(FLAG_PENDING_XMIT, &ai->flags);
} else {
OUT4500(ai, EVACK, EV_AWAKEN);
......@@ -5606,6 +5595,30 @@ static void __exit airo_cleanup_module( void )
* would not work at all... - Jean II
*/
static int airo_get_quality (StatusRid *status_rid, CapabilityRid *cap_rid)
{
int quality = 0;
if ((status_rid->mode & 0x3f) == 0x3f && (cap_rid->hardCap & 8)) {
if (memcmp(cap_rid->prodName, "350", 3))
if (status_rid->signalQuality > 0x20)
quality = 0;
else
quality = 0x20 - status_rid->signalQuality;
else
if (status_rid->signalQuality > 0xb0)
quality = 0;
else if (status_rid->signalQuality < 0x10)
quality = 0xa0;
else
quality = 0xb0 - status_rid->signalQuality;
}
return quality;
}
#define airo_get_max_quality(cap_rid) (memcmp((cap_rid)->prodName, "350", 3) ? 0x20 : 0xa0)
#define airo_get_avg_quality(cap_rid) (memcmp((cap_rid)->prodName, "350", 3) ? 0x10 : 0x50);
/*------------------------------------------------------------------*/
/*
* Wireless Handler : get protocol name
......@@ -6293,7 +6306,8 @@ static int airo_set_txpow(struct net_device *dev,
readCapabilityRid(local, &cap_rid, 1);
if (vwrq->disabled) {
set_bit (FLAG_RADIO_OFF | FLAG_COMMIT, &local->flags);
set_bit (FLAG_RADIO_OFF, &local->flags);
set_bit (FLAG_COMMIT, &local->flags);
return -EINPROGRESS; /* Call commit handler */
}
if (vwrq->flags != IW_TXPOW_MWATT) {
......@@ -6432,7 +6446,7 @@ static int airo_get_range(struct net_device *dev,
range->num_frequency = k;
/* Hum... Should put the right values there */
range->max_qual.qual = 10;
range->max_qual.qual = airo_get_max_quality(&cap_rid);
range->max_qual.level = 0x100 - 120; /* -120 dBm */
range->max_qual.noise = 0;
range->sensitivity = 65535;
......@@ -6499,7 +6513,7 @@ static int airo_get_range(struct net_device *dev,
/* Experimental measurements - boundary 11/5.5 Mb/s */
/* Note : with or without the (local->rssi), results
* are somewhat different. - Jean II */
range->avg_qual.qual = 6;
range->avg_qual.qual = airo_get_avg_quality(&cap_rid);
if (local->rssi)
range->avg_qual.level = 186; /* -70 dBm */
else
......@@ -7113,6 +7127,7 @@ static void airo_read_wireless_stats(struct airo_info *local)
{
StatusRid status_rid;
StatsRid stats_rid;
CapabilityRid cap_rid;
u32 *vals = stats_rid.vals;
/* Get stats out of the card */
......@@ -7121,6 +7136,7 @@ static void airo_read_wireless_stats(struct airo_info *local)
up(&local->sem);
return;
}
readCapabilityRid(local, &cap_rid, 0);
readStatusRid(local, &status_rid, 0);
readStatsRid(local, &stats_rid, RID_STATS, 0);
up(&local->sem);
......@@ -7129,7 +7145,7 @@ static void airo_read_wireless_stats(struct airo_info *local)
local->wstats.status = status_rid.mode;
/* Signal quality and co. But where is the noise level ??? */
local->wstats.qual.qual = status_rid.signalQuality;
local->wstats.qual.qual = airo_get_quality(&status_rid, &cap_rid);
if (local->rssi)
local->wstats.qual.level = 0x100 - local->rssi[status_rid.sigQuality].rssidBm;
else
......@@ -7156,12 +7172,14 @@ struct iw_statistics *airo_get_wireless_stats(struct net_device *dev)
{
struct airo_info *local = dev->priv;
/* Get stats out of the card if available */
if (down_trylock(&local->sem) != 0) {
set_bit(JOB_WSTATS, &local->flags);
wake_up_interruptible(&local->thr_wait);
} else
airo_read_wireless_stats(local);
if (!test_bit(JOB_WSTATS, &local->flags)) {
/* Get stats out of the card if available */
if (down_trylock(&local->sem) != 0) {
set_bit(JOB_WSTATS, &local->flags);
wake_up_interruptible(&local->thr_wait);
} else
airo_read_wireless_stats(local);
}
return &local->wstats;
}
......@@ -7188,9 +7206,11 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) {
{
case AIROGCAP: ridcode = RID_CAPABILITIES; break;
case AIROGCFG: ridcode = RID_CONFIG;
disable_MAC (ai, 1);
writeConfigRid (ai, 1);
enable_MAC (ai, &rsp, 1);
if (test_bit(FLAG_COMMIT, &ai->flags)) {
disable_MAC (ai, 1);
writeConfigRid (ai, 1);
enable_MAC (ai, &rsp, 1);
}
break;
case AIROGSLIST: ridcode = RID_SSID; break;
case AIROGVLIST: ridcode = RID_APLIST; break;
......@@ -7270,6 +7290,7 @@ static int writerids(struct net_device *dev, aironet_ioctl *comp) {
case AIROPCAP: ridcode = RID_CAPABILITIES; break;
case AIROPAPLIST: ridcode = RID_APLIST; break;
case AIROPCFG: ai->config.len = 0;
clear_bit(FLAG_COMMIT, &ai->flags);
ridcode = RID_CONFIG; break;
case AIROPWEPKEYNV: ridcode = RID_WEP_PERM; break;
case AIROPLEAPUSR: ridcode = RID_LEAPUSERNAME; break;
......
......@@ -1309,7 +1309,7 @@ static int __init sunsu_kbd_ms_init(struct uart_sunsu_port *up, int channel)
#ifdef CONFIG_SERIO
up->serio = serio = kmalloc(sizeof(struct serio), GFP_KERNEL);
if (serio) {
memset(serio, 0, sizeof(serio));
memset(serio, 0, sizeof(*serio));
serio->port_data = up;
......
......@@ -1556,8 +1556,7 @@ static void __init sunzilog_register_serio(struct uart_sunzilog_port *up, int ch
up->serio = serio = kmalloc(sizeof(struct serio), GFP_KERNEL);
if (serio) {
memset(serio, 0, sizeof(serio));
memset(serio, 0, sizeof(*serio));
serio->port_data = up;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment