Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6bcd6d7784 | |||
| 6505670551 | |||
| 0018d3e671 | |||
| f558a0f3f2 | |||
| e87898fdba | |||
| d344a53f2e | |||
| 432283d2c4 | |||
| a273874b53 | |||
| 95a3690291 | |||
| 92fa67e926 | |||
| 074555fe0e | |||
| 769b0455c1 | |||
| 60b216fffd | |||
| 7ae3a769f9 | |||
| d49d50a98a | |||
| bc5b8bb64a | |||
| d23d433863 |
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 27
|
||||
EXTRAVERSION =
|
||||
EXTRAVERSION = .2
|
||||
NAME = Rotary Wombat
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
@ -444,7 +444,7 @@ void __init alternative_instructions(void)
|
||||
_text, _etext);
|
||||
|
||||
/* Only switch to UP mode if we don't immediately boot others */
|
||||
if (num_possible_cpus() == 1 || setup_max_cpus <= 1)
|
||||
if (num_present_cpus() == 1 || setup_max_cpus <= 1)
|
||||
alternatives_smp_switch(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -95,6 +95,52 @@ static void __init nvidia_bugs(int num, int slot, int func)
|
||||
|
||||
}
|
||||
|
||||
static u32 ati_ixp4x0_rev(int num, int slot, int func)
|
||||
{
|
||||
u32 d;
|
||||
u8 b;
|
||||
|
||||
b = read_pci_config_byte(num, slot, func, 0xac);
|
||||
b &= ~(1<<5);
|
||||
write_pci_config_byte(num, slot, func, 0xac, b);
|
||||
|
||||
d = read_pci_config(num, slot, func, 0x70);
|
||||
d |= 1<<8;
|
||||
write_pci_config(num, slot, func, 0x70, d);
|
||||
|
||||
d = read_pci_config(num, slot, func, 0x8);
|
||||
d &= 0xff;
|
||||
return d;
|
||||
}
|
||||
|
||||
static void __init ati_bugs(int num, int slot, int func)
|
||||
{
|
||||
#if defined(CONFIG_ACPI) && defined (CONFIG_X86_IO_APIC)
|
||||
u32 d;
|
||||
u8 b;
|
||||
|
||||
if (acpi_use_timer_override)
|
||||
return;
|
||||
|
||||
d = ati_ixp4x0_rev(num, slot, func);
|
||||
if (d < 0x82)
|
||||
acpi_skip_timer_override = 1;
|
||||
else {
|
||||
/* check for IRQ0 interrupt swap */
|
||||
outb(0x72, 0xcd6); b = inb(0xcd7);
|
||||
if (!(b & 0x2))
|
||||
acpi_skip_timer_override = 1;
|
||||
}
|
||||
|
||||
if (acpi_skip_timer_override) {
|
||||
printk(KERN_INFO "SB4X0 revision 0x%x\n", d);
|
||||
printk(KERN_INFO "Ignoring ACPI timer override.\n");
|
||||
printk(KERN_INFO "If you got timer trouble "
|
||||
"try acpi_use_timer_override\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#define QFLAG_APPLY_ONCE 0x1
|
||||
#define QFLAG_APPLIED 0x2
|
||||
#define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED)
|
||||
@ -114,6 +160,8 @@ static struct chipset early_qrk[] __initdata = {
|
||||
PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, via_bugs },
|
||||
{ PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_K8_NB,
|
||||
PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, fix_hypertransport_config },
|
||||
{ PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_SMBUS,
|
||||
PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs },
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
@ -2314,6 +2314,9 @@ void __init setup_IO_APIC(void)
|
||||
for (i = first_system_vector; i < NR_VECTORS; i++)
|
||||
set_bit(i, used_vectors);
|
||||
|
||||
/* Mark FIRST_DEVICE_VECTOR which is assigned to IRQ0 as used. */
|
||||
set_bit(FIRST_DEVICE_VECTOR, used_vectors);
|
||||
|
||||
enable_IO_APIC();
|
||||
|
||||
io_apic_irqs = ~PIC_IRQS;
|
||||
|
||||
@ -595,7 +595,7 @@ void __init *early_ioremap(unsigned long phys_addr, unsigned long size)
|
||||
*/
|
||||
offset = phys_addr & ~PAGE_MASK;
|
||||
phys_addr &= PAGE_MASK;
|
||||
size = PAGE_ALIGN(last_addr) - phys_addr;
|
||||
size = PAGE_ALIGN(last_addr + 1) - phys_addr;
|
||||
|
||||
/*
|
||||
* Mappings have to fit in the FIX_BTMAP area.
|
||||
|
||||
@ -2996,7 +2996,7 @@ long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
case TIOCSTI:
|
||||
return tiocsti(tty, p);
|
||||
case TIOCGWINSZ:
|
||||
return tiocgwinsz(tty, p);
|
||||
return tiocgwinsz(real_tty, p);
|
||||
case TIOCSWINSZ:
|
||||
return tiocswinsz(tty, real_tty, p);
|
||||
case TIOCCONS:
|
||||
|
||||
@ -2390,9 +2390,7 @@ static int __devinit atl1e_probe(struct pci_dev *pdev,
|
||||
}
|
||||
|
||||
/* Init GPHY as early as possible due to power saving issue */
|
||||
spin_lock(&adapter->mdio_lock);
|
||||
atl1e_phy_init(&adapter->hw);
|
||||
spin_unlock(&adapter->mdio_lock);
|
||||
/* reset the controller to
|
||||
* put the device in a known good starting state */
|
||||
err = atl1e_reset_hw(&adapter->hw);
|
||||
|
||||
@ -3034,7 +3034,8 @@ static int sky2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
||||
struct sky2_port *sky2 = netdev_priv(dev);
|
||||
struct sky2_hw *hw = sky2->hw;
|
||||
|
||||
if (wol->wolopts & ~sky2_wol_supported(sky2->hw))
|
||||
if ((wol->wolopts & ~sky2_wol_supported(sky2->hw))
|
||||
|| !device_can_wakeup(&hw->pdev->dev))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
sky2->wol = wol->wolopts;
|
||||
@ -3045,6 +3046,8 @@ static int sky2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
||||
sky2_write32(hw, B0_CTST, sky2->wol
|
||||
? Y2_HW_WOL_ON : Y2_HW_WOL_OFF);
|
||||
|
||||
device_set_wakeup_enable(&hw->pdev->dev, sky2->wol);
|
||||
|
||||
if (!netif_running(dev))
|
||||
sky2_wol_init(sky2);
|
||||
return 0;
|
||||
@ -4166,18 +4169,6 @@ static int __devinit sky2_test_msi(struct sky2_hw *hw)
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devinit pci_wake_enabled(struct pci_dev *dev)
|
||||
{
|
||||
int pm = pci_find_capability(dev, PCI_CAP_ID_PM);
|
||||
u16 value;
|
||||
|
||||
if (!pm)
|
||||
return 0;
|
||||
if (pci_read_config_word(dev, pm + PCI_PM_CTRL, &value))
|
||||
return 0;
|
||||
return value & PCI_PM_CTRL_PME_ENABLE;
|
||||
}
|
||||
|
||||
/* This driver supports yukon2 chipset only */
|
||||
static const char *sky2_name(u8 chipid, char *buf, int sz)
|
||||
{
|
||||
@ -4238,7 +4229,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
|
||||
}
|
||||
}
|
||||
|
||||
wol_default = pci_wake_enabled(pdev) ? WAKE_MAGIC : 0;
|
||||
wol_default = device_may_wakeup(&pdev->dev) ? WAKE_MAGIC : 0;
|
||||
|
||||
err = -ENOMEM;
|
||||
hw = kzalloc(sizeof(*hw), GFP_KERNEL);
|
||||
|
||||
@ -626,7 +626,7 @@ void b43legacy_handle_hwtxstatus(struct b43legacy_wldev *dev,
|
||||
tmp = hw->count;
|
||||
status.frame_count = (tmp >> 4);
|
||||
status.rts_count = (tmp & 0x0F);
|
||||
tmp = hw->flags;
|
||||
tmp = hw->flags << 1;
|
||||
status.supp_reason = ((tmp & 0x1C) >> 2);
|
||||
status.pm_indicated = !!(tmp & 0x80);
|
||||
status.intermediate = !!(tmp & 0x40);
|
||||
|
||||
@ -1196,7 +1196,13 @@ void lbs_remove_card(struct lbs_private *priv)
|
||||
cancel_delayed_work_sync(&priv->scan_work);
|
||||
cancel_delayed_work_sync(&priv->assoc_work);
|
||||
cancel_work_sync(&priv->mcast_work);
|
||||
|
||||
/* worker thread destruction blocks on the in-flight command which
|
||||
* should have been cleared already in lbs_stop_card().
|
||||
*/
|
||||
lbs_deb_main("destroying worker thread\n");
|
||||
destroy_workqueue(priv->work_thread);
|
||||
lbs_deb_main("done destroying worker thread\n");
|
||||
|
||||
if (priv->psmode == LBS802_11POWERMODEMAX_PSP) {
|
||||
priv->psmode = LBS802_11POWERMODECAM;
|
||||
@ -1314,14 +1320,26 @@ void lbs_stop_card(struct lbs_private *priv)
|
||||
device_remove_file(&dev->dev, &dev_attr_lbs_rtap);
|
||||
}
|
||||
|
||||
/* Flush pending command nodes */
|
||||
/* Delete the timeout of the currently processing command */
|
||||
del_timer_sync(&priv->command_timer);
|
||||
|
||||
/* Flush pending command nodes */
|
||||
spin_lock_irqsave(&priv->driver_lock, flags);
|
||||
lbs_deb_main("clearing pending commands\n");
|
||||
list_for_each_entry(cmdnode, &priv->cmdpendingq, list) {
|
||||
cmdnode->result = -ENOENT;
|
||||
cmdnode->cmdwaitqwoken = 1;
|
||||
wake_up_interruptible(&cmdnode->cmdwait_q);
|
||||
}
|
||||
|
||||
/* Flush the command the card is currently processing */
|
||||
if (priv->cur_cmd) {
|
||||
lbs_deb_main("clearing current command\n");
|
||||
priv->cur_cmd->result = -ENOENT;
|
||||
priv->cur_cmd->cmdwaitqwoken = 1;
|
||||
wake_up_interruptible(&priv->cur_cmd->cmdwait_q);
|
||||
}
|
||||
lbs_deb_main("done clearing commands\n");
|
||||
spin_unlock_irqrestore(&priv->driver_lock, flags);
|
||||
|
||||
unregister_netdev(dev);
|
||||
|
||||
@ -309,6 +309,7 @@ struct cifs_search_info {
|
||||
__u32 resume_key;
|
||||
char *ntwrk_buf_start;
|
||||
char *srch_entries_start;
|
||||
char *last_entry;
|
||||
char *presume_name;
|
||||
unsigned int resume_name_len;
|
||||
bool endOfSearch:1;
|
||||
|
||||
@ -3636,6 +3636,8 @@ findFirstRetry:
|
||||
le16_to_cpu(parms->SearchCount);
|
||||
psrch_inf->index_of_last_entry = 2 /* skip . and .. */ +
|
||||
psrch_inf->entries_in_buffer;
|
||||
psrch_inf->last_entry = psrch_inf->srch_entries_start +
|
||||
le16_to_cpu(parms->LastNameOffset);
|
||||
*pnetfid = parms->SearchHandle;
|
||||
} else {
|
||||
cifs_buf_release(pSMB);
|
||||
@ -3751,6 +3753,8 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon,
|
||||
le16_to_cpu(parms->SearchCount);
|
||||
psrch_inf->index_of_last_entry +=
|
||||
psrch_inf->entries_in_buffer;
|
||||
psrch_inf->last_entry = psrch_inf->srch_entries_start +
|
||||
le16_to_cpu(parms->LastNameOffset);
|
||||
/* cFYI(1,("fnxt2 entries in buf %d index_of_last %d",
|
||||
psrch_inf->entries_in_buffer, psrch_inf->index_of_last_entry)); */
|
||||
|
||||
|
||||
@ -640,6 +640,70 @@ static int is_dir_changed(struct file *file)
|
||||
|
||||
}
|
||||
|
||||
static int cifs_save_resume_key(const char *current_entry,
|
||||
struct cifsFileInfo *cifsFile)
|
||||
{
|
||||
int rc = 0;
|
||||
unsigned int len = 0;
|
||||
__u16 level;
|
||||
char *filename;
|
||||
|
||||
if ((cifsFile == NULL) || (current_entry == NULL))
|
||||
return -EINVAL;
|
||||
|
||||
level = cifsFile->srch_inf.info_level;
|
||||
|
||||
if (level == SMB_FIND_FILE_UNIX) {
|
||||
FILE_UNIX_INFO *pFindData = (FILE_UNIX_INFO *)current_entry;
|
||||
|
||||
filename = &pFindData->FileName[0];
|
||||
if (cifsFile->srch_inf.unicode) {
|
||||
len = cifs_unicode_bytelen(filename);
|
||||
} else {
|
||||
/* BB should we make this strnlen of PATH_MAX? */
|
||||
len = strnlen(filename, PATH_MAX);
|
||||
}
|
||||
cifsFile->srch_inf.resume_key = pFindData->ResumeKey;
|
||||
} else if (level == SMB_FIND_FILE_DIRECTORY_INFO) {
|
||||
FILE_DIRECTORY_INFO *pFindData =
|
||||
(FILE_DIRECTORY_INFO *)current_entry;
|
||||
filename = &pFindData->FileName[0];
|
||||
len = le32_to_cpu(pFindData->FileNameLength);
|
||||
cifsFile->srch_inf.resume_key = pFindData->FileIndex;
|
||||
} else if (level == SMB_FIND_FILE_FULL_DIRECTORY_INFO) {
|
||||
FILE_FULL_DIRECTORY_INFO *pFindData =
|
||||
(FILE_FULL_DIRECTORY_INFO *)current_entry;
|
||||
filename = &pFindData->FileName[0];
|
||||
len = le32_to_cpu(pFindData->FileNameLength);
|
||||
cifsFile->srch_inf.resume_key = pFindData->FileIndex;
|
||||
} else if (level == SMB_FIND_FILE_ID_FULL_DIR_INFO) {
|
||||
SEARCH_ID_FULL_DIR_INFO *pFindData =
|
||||
(SEARCH_ID_FULL_DIR_INFO *)current_entry;
|
||||
filename = &pFindData->FileName[0];
|
||||
len = le32_to_cpu(pFindData->FileNameLength);
|
||||
cifsFile->srch_inf.resume_key = pFindData->FileIndex;
|
||||
} else if (level == SMB_FIND_FILE_BOTH_DIRECTORY_INFO) {
|
||||
FILE_BOTH_DIRECTORY_INFO *pFindData =
|
||||
(FILE_BOTH_DIRECTORY_INFO *)current_entry;
|
||||
filename = &pFindData->FileName[0];
|
||||
len = le32_to_cpu(pFindData->FileNameLength);
|
||||
cifsFile->srch_inf.resume_key = pFindData->FileIndex;
|
||||
} else if (level == SMB_FIND_FILE_INFO_STANDARD) {
|
||||
FIND_FILE_STANDARD_INFO *pFindData =
|
||||
(FIND_FILE_STANDARD_INFO *)current_entry;
|
||||
filename = &pFindData->FileName[0];
|
||||
/* one byte length, no name conversion */
|
||||
len = (unsigned int)pFindData->FileNameLength;
|
||||
cifsFile->srch_inf.resume_key = pFindData->ResumeKey;
|
||||
} else {
|
||||
cFYI(1, ("Unknown findfirst level %d", level));
|
||||
return -EINVAL;
|
||||
}
|
||||
cifsFile->srch_inf.resume_name_len = len;
|
||||
cifsFile->srch_inf.presume_name = filename;
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* find the corresponding entry in the search */
|
||||
/* Note that the SMB server returns search entries for . and .. which
|
||||
complicates logic here if we choose to parse for them and we do not
|
||||
@ -703,6 +767,7 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon,
|
||||
while ((index_to_find >= cifsFile->srch_inf.index_of_last_entry) &&
|
||||
(rc == 0) && !cifsFile->srch_inf.endOfSearch) {
|
||||
cFYI(1, ("calling findnext2"));
|
||||
cifs_save_resume_key(cifsFile->srch_inf.last_entry, cifsFile);
|
||||
rc = CIFSFindNext(xid, pTcon, cifsFile->netfid,
|
||||
&cifsFile->srch_inf);
|
||||
if (rc)
|
||||
@ -919,69 +984,6 @@ static int cifs_filldir(char *pfindEntry, struct file *file,
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int cifs_save_resume_key(const char *current_entry,
|
||||
struct cifsFileInfo *cifsFile)
|
||||
{
|
||||
int rc = 0;
|
||||
unsigned int len = 0;
|
||||
__u16 level;
|
||||
char *filename;
|
||||
|
||||
if ((cifsFile == NULL) || (current_entry == NULL))
|
||||
return -EINVAL;
|
||||
|
||||
level = cifsFile->srch_inf.info_level;
|
||||
|
||||
if (level == SMB_FIND_FILE_UNIX) {
|
||||
FILE_UNIX_INFO *pFindData = (FILE_UNIX_INFO *)current_entry;
|
||||
|
||||
filename = &pFindData->FileName[0];
|
||||
if (cifsFile->srch_inf.unicode) {
|
||||
len = cifs_unicode_bytelen(filename);
|
||||
} else {
|
||||
/* BB should we make this strnlen of PATH_MAX? */
|
||||
len = strnlen(filename, PATH_MAX);
|
||||
}
|
||||
cifsFile->srch_inf.resume_key = pFindData->ResumeKey;
|
||||
} else if (level == SMB_FIND_FILE_DIRECTORY_INFO) {
|
||||
FILE_DIRECTORY_INFO *pFindData =
|
||||
(FILE_DIRECTORY_INFO *)current_entry;
|
||||
filename = &pFindData->FileName[0];
|
||||
len = le32_to_cpu(pFindData->FileNameLength);
|
||||
cifsFile->srch_inf.resume_key = pFindData->FileIndex;
|
||||
} else if (level == SMB_FIND_FILE_FULL_DIRECTORY_INFO) {
|
||||
FILE_FULL_DIRECTORY_INFO *pFindData =
|
||||
(FILE_FULL_DIRECTORY_INFO *)current_entry;
|
||||
filename = &pFindData->FileName[0];
|
||||
len = le32_to_cpu(pFindData->FileNameLength);
|
||||
cifsFile->srch_inf.resume_key = pFindData->FileIndex;
|
||||
} else if (level == SMB_FIND_FILE_ID_FULL_DIR_INFO) {
|
||||
SEARCH_ID_FULL_DIR_INFO *pFindData =
|
||||
(SEARCH_ID_FULL_DIR_INFO *)current_entry;
|
||||
filename = &pFindData->FileName[0];
|
||||
len = le32_to_cpu(pFindData->FileNameLength);
|
||||
cifsFile->srch_inf.resume_key = pFindData->FileIndex;
|
||||
} else if (level == SMB_FIND_FILE_BOTH_DIRECTORY_INFO) {
|
||||
FILE_BOTH_DIRECTORY_INFO *pFindData =
|
||||
(FILE_BOTH_DIRECTORY_INFO *)current_entry;
|
||||
filename = &pFindData->FileName[0];
|
||||
len = le32_to_cpu(pFindData->FileNameLength);
|
||||
cifsFile->srch_inf.resume_key = pFindData->FileIndex;
|
||||
} else if (level == SMB_FIND_FILE_INFO_STANDARD) {
|
||||
FIND_FILE_STANDARD_INFO *pFindData =
|
||||
(FIND_FILE_STANDARD_INFO *)current_entry;
|
||||
filename = &pFindData->FileName[0];
|
||||
/* one byte length, no name conversion */
|
||||
len = (unsigned int)pFindData->FileNameLength;
|
||||
cifsFile->srch_inf.resume_key = pFindData->ResumeKey;
|
||||
} else {
|
||||
cFYI(1, ("Unknown findfirst level %d", level));
|
||||
return -EINVAL;
|
||||
}
|
||||
cifsFile->srch_inf.resume_name_len = len;
|
||||
cifsFile->srch_inf.presume_name = filename;
|
||||
return rc;
|
||||
}
|
||||
|
||||
int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
|
||||
{
|
||||
|
||||
@ -1001,12 +1001,13 @@ xfs_buf_iodone_work(
|
||||
* We can get an EOPNOTSUPP to ordered writes. Here we clear the
|
||||
* ordered flag and reissue them. Because we can't tell the higher
|
||||
* layers directly that they should not issue ordered I/O anymore, they
|
||||
* need to check if the ordered flag was cleared during I/O completion.
|
||||
* need to check if the _XFS_BARRIER_FAILED flag was set during I/O completion.
|
||||
*/
|
||||
if ((bp->b_error == EOPNOTSUPP) &&
|
||||
(bp->b_flags & (XBF_ORDERED|XBF_ASYNC)) == (XBF_ORDERED|XBF_ASYNC)) {
|
||||
XB_TRACE(bp, "ordered_retry", bp->b_iodone);
|
||||
bp->b_flags &= ~XBF_ORDERED;
|
||||
bp->b_flags |= _XFS_BARRIER_FAILED;
|
||||
xfs_buf_iorequest(bp);
|
||||
} else if (bp->b_iodone)
|
||||
(*(bp->b_iodone))(bp);
|
||||
|
||||
@ -85,6 +85,14 @@ typedef enum {
|
||||
* modifications being lost.
|
||||
*/
|
||||
_XBF_PAGE_LOCKED = (1 << 22),
|
||||
|
||||
/*
|
||||
* If we try a barrier write, but it fails we have to communicate
|
||||
* this to the upper layers. Unfortunately b_error gets overwritten
|
||||
* when the buffer is re-issued so we have to add another flag to
|
||||
* keep this information.
|
||||
*/
|
||||
_XFS_BARRIER_FAILED = (1 << 23),
|
||||
} xfs_buf_flags_t;
|
||||
|
||||
typedef enum {
|
||||
|
||||
@ -1033,11 +1033,12 @@ xlog_iodone(xfs_buf_t *bp)
|
||||
l = iclog->ic_log;
|
||||
|
||||
/*
|
||||
* If the ordered flag has been removed by a lower
|
||||
* layer, it means the underlyin device no longer supports
|
||||
* If the _XFS_BARRIER_FAILED flag was set by a lower
|
||||
* layer, it means the underlying device no longer supports
|
||||
* barrier I/O. Warn loudly and turn off barriers.
|
||||
*/
|
||||
if ((l->l_mp->m_flags & XFS_MOUNT_BARRIER) && !XFS_BUF_ISORDERED(bp)) {
|
||||
if (bp->b_flags & _XFS_BARRIER_FAILED) {
|
||||
bp->b_flags &= ~_XFS_BARRIER_FAILED;
|
||||
l->l_mp->m_flags &= ~XFS_MOUNT_BARRIER;
|
||||
xfs_fs_cmn_err(CE_WARN, l->l_mp,
|
||||
"xlog_iodone: Barriers are no longer supported"
|
||||
|
||||
@ -102,12 +102,12 @@ static void dequeue_rt_entity(struct sched_rt_entity *rt_se);
|
||||
|
||||
static void sched_rt_rq_enqueue(struct rt_rq *rt_rq)
|
||||
{
|
||||
struct task_struct *curr = rq_of_rt_rq(rt_rq)->curr;
|
||||
struct sched_rt_entity *rt_se = rt_rq->rt_se;
|
||||
|
||||
if (rt_se && !on_rt_rq(rt_se) && rt_rq->rt_nr_running) {
|
||||
struct task_struct *curr = rq_of_rt_rq(rt_rq)->curr;
|
||||
|
||||
enqueue_rt_entity(rt_se);
|
||||
if (rt_rq->rt_nr_running) {
|
||||
if (rt_se && !on_rt_rq(rt_se))
|
||||
enqueue_rt_entity(rt_se);
|
||||
if (rt_rq->highest_prio < curr->prio)
|
||||
resched_task(curr);
|
||||
}
|
||||
|
||||
@ -103,7 +103,8 @@ config CONTEXT_SWITCH_TRACER
|
||||
all switching of tasks.
|
||||
|
||||
config DYNAMIC_FTRACE
|
||||
bool "enable/disable ftrace tracepoints dynamically"
|
||||
bool "enable/disable ftrace tracepoints dynamically (BROKEN)"
|
||||
depends on BROKEN
|
||||
depends on FTRACE
|
||||
depends on HAVE_DYNAMIC_FTRACE
|
||||
default y
|
||||
|
||||
@ -537,6 +537,7 @@ static int netdev_notify(struct notifier_block *nb,
|
||||
{
|
||||
struct net_device *dev = ndev;
|
||||
struct dentry *dir;
|
||||
struct ieee80211_local *local;
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
char buf[10+IFNAMSIZ];
|
||||
|
||||
@ -549,10 +550,19 @@ static int netdev_notify(struct notifier_block *nb,
|
||||
if (dev->ieee80211_ptr->wiphy->privid != mac80211_wiphy_privid)
|
||||
return 0;
|
||||
|
||||
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
/*
|
||||
* Do not use IEEE80211_DEV_TO_SUB_IF because that
|
||||
* BUG_ONs for the master netdev which we need to
|
||||
* handle here.
|
||||
*/
|
||||
sdata = netdev_priv(dev);
|
||||
|
||||
dir = sdata->debugfsdir;
|
||||
|
||||
if (!dir)
|
||||
return 0;
|
||||
|
||||
sprintf(buf, "netdev:%s", dev->name);
|
||||
dir = sdata->debugfsdir;
|
||||
if (!debugfs_rename(dir->d_parent, dir, dir->d_parent, buf))
|
||||
printk(KERN_ERR "mac80211: debugfs: failed to rename debugfs "
|
||||
"dir to %s\n", buf);
|
||||
|
||||
@ -117,6 +117,7 @@ static void rfkill_led_trigger_activate(struct led_classdev *led)
|
||||
|
||||
static void notify_rfkill_state_change(struct rfkill *rfkill)
|
||||
{
|
||||
rfkill_led_trigger(rfkill, rfkill->state);
|
||||
blocking_notifier_call_chain(&rfkill_notifier_list,
|
||||
RFKILL_STATE_CHANGED,
|
||||
rfkill);
|
||||
@ -204,10 +205,8 @@ static int rfkill_toggle_radio(struct rfkill *rfkill,
|
||||
rfkill->state = state;
|
||||
}
|
||||
|
||||
if (force || rfkill->state != oldstate) {
|
||||
rfkill_led_trigger(rfkill, rfkill->state);
|
||||
if (force || rfkill->state != oldstate)
|
||||
notify_rfkill_state_change(rfkill);
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user