mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
Merge tag 'v3.10.79' into linux-linaro-lsk-v3.10
This is the 3.10.79 stable release
This commit is contained in:
commit
baf41996d8
|
|
@ -38,7 +38,7 @@ dma_apbx: dma-apbx@80024000 {
|
|||
80 81 68 69
|
||||
70 71 72 73
|
||||
74 75 76 77>;
|
||||
interrupt-names = "auart4-rx", "aurat4-tx", "spdif-tx", "empty",
|
||||
interrupt-names = "auart4-rx", "auart4-tx", "spdif-tx", "empty",
|
||||
"saif0", "saif1", "i2c0", "i2c1",
|
||||
"auart0-rx", "auart0-tx", "auart1-rx", "auart1-tx",
|
||||
"auart2-rx", "auart2-tx", "auart3-rx", "auart3-tx";
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 77
|
||||
SUBLEVEL = 79
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
|
|
|
|||
|
|
@ -131,6 +131,15 @@ SYSCALL_DEFINE0(rt_sigreturn)
|
|||
/* Don't restart from sigreturn */
|
||||
syscall_wont_restart(regs);
|
||||
|
||||
/*
|
||||
* Ensure that sigreturn always returns to user mode (in case the
|
||||
* regs saved on user stack got fudged between save and sigreturn)
|
||||
* Otherwise it is easy to panic the kernel with a custom
|
||||
* signal handler and/or restorer which clobberes the status32/ret
|
||||
* to return to a bogus location in kernel mode.
|
||||
*/
|
||||
regs->status32 |= STATUS_U_MASK;
|
||||
|
||||
return regs->r0;
|
||||
|
||||
badframe:
|
||||
|
|
@ -234,8 +243,11 @@ setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
|
|||
|
||||
/*
|
||||
* handler returns using sigreturn stub provided already by userpsace
|
||||
* If not, nuke the process right away
|
||||
*/
|
||||
BUG_ON(!(ka->sa.sa_flags & SA_RESTORER));
|
||||
if(!(ka->sa.sa_flags & SA_RESTORER))
|
||||
return 1;
|
||||
|
||||
regs->blink = (unsigned long)ka->sa.sa_restorer;
|
||||
|
||||
/* User Stack for signal handler will be above the frame just carved */
|
||||
|
|
@ -302,12 +314,12 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
|
|||
struct pt_regs *regs)
|
||||
{
|
||||
sigset_t *oldset = sigmask_to_save();
|
||||
int ret;
|
||||
int failed;
|
||||
|
||||
/* Set up the stack frame */
|
||||
ret = setup_rt_frame(sig, ka, info, oldset, regs);
|
||||
failed = setup_rt_frame(sig, ka, info, oldset, regs);
|
||||
|
||||
if (ret)
|
||||
if (failed)
|
||||
force_sigsegv(sig, current);
|
||||
else
|
||||
signal_delivered(sig, info, ka, regs, 0);
|
||||
|
|
|
|||
|
|
@ -32,6 +32,10 @@ soc {
|
|||
0xf0000000 0 0xf0000000 0x8000000 /* Device Bus, NOR 128MiB */>;
|
||||
|
||||
internal-regs {
|
||||
rtc@10300 {
|
||||
/* No crystal connected to the internal RTC */
|
||||
status = "disabled";
|
||||
};
|
||||
serial@12000 {
|
||||
clock-frequency = <250000000>;
|
||||
status = "okay";
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ uart1: serial@12100 {
|
|||
|
||||
uart2: serial@12200 {
|
||||
compatible = "ns16550a";
|
||||
reg = <0x12000 0x100>;
|
||||
reg = <0x12200 0x100>;
|
||||
reg-shift = <2>;
|
||||
interrupts = <9>;
|
||||
clocks = <&core_clk 0>;
|
||||
|
|
@ -84,7 +84,7 @@ uart2: serial@12200 {
|
|||
|
||||
uart3: serial@12300 {
|
||||
compatible = "ns16550a";
|
||||
reg = <0x12100 0x100>;
|
||||
reg = <0x12300 0x100>;
|
||||
reg-shift = <2>;
|
||||
interrupts = <10>;
|
||||
clocks = <&core_clk 0>;
|
||||
|
|
|
|||
|
|
@ -89,6 +89,7 @@ usbphy0: usbphy@8007c000 {
|
|||
|
||||
ahb@80080000 {
|
||||
usb0: usb@80080000 {
|
||||
dr_mode = "host";
|
||||
vbus-supply = <®_usb0_vbus>;
|
||||
status = "okay";
|
||||
};
|
||||
|
|
|
|||
|
|
@ -393,6 +393,7 @@ slcdc@53fc0000 {
|
|||
|
||||
pwm4: pwm@53fc8000 {
|
||||
compatible = "fsl,imx25-pwm", "fsl,imx27-pwm";
|
||||
#pwm-cells = <2>;
|
||||
reg = <0x53fc8000 0x4000>;
|
||||
clocks = <&clks 108>, <&clks 52>;
|
||||
clock-names = "ipg", "per";
|
||||
|
|
|
|||
|
|
@ -691,7 +691,7 @@ dma_apbx: dma-apbx@80024000 {
|
|||
80 81 68 69
|
||||
70 71 72 73
|
||||
74 75 76 77>;
|
||||
interrupt-names = "auart4-rx", "aurat4-tx", "spdif-tx", "empty",
|
||||
interrupt-names = "auart4-rx", "auart4-tx", "spdif-tx", "empty",
|
||||
"saif0", "saif1", "i2c0", "i2c1",
|
||||
"auart0-rx", "auart0-tx", "auart1-rx", "auart1-tx",
|
||||
"auart2-rx", "auart2-tx", "auart3-rx", "auart3-tx";
|
||||
|
|
|
|||
|
|
@ -539,8 +539,7 @@ acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state,
|
|||
return_ACPI_STATUS(AE_NOT_EXIST);
|
||||
}
|
||||
|
||||
obj_desc->region.address =
|
||||
(acpi_physical_address) ACPI_TO_INTEGER(table);
|
||||
obj_desc->region.address = ACPI_PTR_TO_PHYSADDR(table);
|
||||
obj_desc->region.length = table->length;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n",
|
||||
|
|
|
|||
|
|
@ -301,8 +301,7 @@ struct acpi_table_header *acpi_tb_table_override(struct acpi_table_header
|
|||
ACPI_EXCEPTION((AE_INFO, AE_NO_MEMORY,
|
||||
"%4.4s %p Attempted physical table override failed",
|
||||
table_header->signature,
|
||||
ACPI_CAST_PTR(void,
|
||||
table_desc->address)));
|
||||
ACPI_PHYSADDR_TO_PTR(table_desc->address)));
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
|
@ -318,7 +317,7 @@ struct acpi_table_header *acpi_tb_table_override(struct acpi_table_header
|
|||
ACPI_INFO((AE_INFO,
|
||||
"%4.4s %p %s table override, new table: %p",
|
||||
table_header->signature,
|
||||
ACPI_CAST_PTR(void, table_desc->address),
|
||||
ACPI_PHYSADDR_TO_PTR(table_desc->address),
|
||||
override_type, new_table));
|
||||
|
||||
/* We can now unmap/delete the original table (if fully mapped) */
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@ static acpi_status acpi_tb_validate_rsdp(struct acpi_table_rsdp *rsdp)
|
|||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_find_root_pointer(acpi_size *table_address)
|
||||
acpi_status acpi_find_root_pointer(acpi_physical_address * table_address)
|
||||
{
|
||||
u8 *table_ptr;
|
||||
u8 *mem_rover;
|
||||
|
|
@ -176,7 +176,8 @@ acpi_status acpi_find_root_pointer(acpi_size *table_address)
|
|||
physical_address +=
|
||||
(u32) ACPI_PTR_DIFF(mem_rover, table_ptr);
|
||||
|
||||
*table_address = physical_address;
|
||||
*table_address =
|
||||
(acpi_physical_address) physical_address;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
}
|
||||
|
|
@ -209,7 +210,7 @@ acpi_status acpi_find_root_pointer(acpi_size *table_address)
|
|||
(ACPI_HI_RSDP_WINDOW_BASE +
|
||||
ACPI_PTR_DIFF(mem_rover, table_ptr));
|
||||
|
||||
*table_address = physical_address;
|
||||
*table_address = (acpi_physical_address) physical_address;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2115,6 +2115,11 @@ static bool rbd_img_obj_end_request(struct rbd_obj_request *obj_request)
|
|||
result, xferred);
|
||||
if (!img_request->result)
|
||||
img_request->result = result;
|
||||
/*
|
||||
* Need to end I/O on the entire obj_request worth of
|
||||
* bytes in case of error.
|
||||
*/
|
||||
xferred = obj_request->length;
|
||||
}
|
||||
|
||||
/* Image object requests don't own their page array */
|
||||
|
|
|
|||
|
|
@ -752,6 +752,7 @@ static struct class gpio_class = {
|
|||
*/
|
||||
static int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
|
||||
{
|
||||
struct gpio_chip *chip;
|
||||
unsigned long flags;
|
||||
int status;
|
||||
const char *ioname = NULL;
|
||||
|
|
@ -769,8 +770,16 @@ static int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
chip = desc->chip;
|
||||
|
||||
mutex_lock(&sysfs_lock);
|
||||
|
||||
/* check if chip is being removed */
|
||||
if (!chip || !chip->exported) {
|
||||
status = -ENODEV;
|
||||
goto fail_unlock;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&gpio_lock, flags);
|
||||
if (!test_bit(FLAG_REQUESTED, &desc->flags) ||
|
||||
test_bit(FLAG_EXPORT, &desc->flags)) {
|
||||
|
|
@ -1040,6 +1049,8 @@ static void gpiochip_unexport(struct gpio_chip *chip)
|
|||
{
|
||||
int status;
|
||||
struct device *dev;
|
||||
struct gpio_desc *desc;
|
||||
unsigned int i;
|
||||
|
||||
mutex_lock(&sysfs_lock);
|
||||
dev = class_find_device(&gpio_class, NULL, chip, match_export);
|
||||
|
|
@ -1047,6 +1058,7 @@ static void gpiochip_unexport(struct gpio_chip *chip)
|
|||
sysfs_remove_group(&dev->kobj, &gpiochip_attr_group);
|
||||
put_device(dev);
|
||||
device_unregister(dev);
|
||||
/* prevent further gpiod exports */
|
||||
chip->exported = 0;
|
||||
status = 0;
|
||||
} else
|
||||
|
|
@ -1056,6 +1068,13 @@ static void gpiochip_unexport(struct gpio_chip *chip)
|
|||
if (status)
|
||||
pr_debug("%s: chip %s status %d\n", __func__,
|
||||
chip->label, status);
|
||||
|
||||
/* unregister gpiod class devices owned by sysfs */
|
||||
for (i = 0; i < chip->ngpio; i++) {
|
||||
desc = &chip->desc[i];
|
||||
if (test_and_clear_bit(FLAG_SYSFS, &desc->flags))
|
||||
gpiod_free(desc);
|
||||
}
|
||||
}
|
||||
|
||||
static int __init gpiolib_sysfs_init(void)
|
||||
|
|
@ -1265,6 +1284,8 @@ int gpiochip_remove(struct gpio_chip *chip)
|
|||
int status = 0;
|
||||
unsigned id;
|
||||
|
||||
gpiochip_unexport(chip);
|
||||
|
||||
spin_lock_irqsave(&gpio_lock, flags);
|
||||
|
||||
gpiochip_remove_pin_ranges(chip);
|
||||
|
|
@ -1285,9 +1306,6 @@ int gpiochip_remove(struct gpio_chip *chip)
|
|||
|
||||
spin_unlock_irqrestore(&gpio_lock, flags);
|
||||
|
||||
if (status == 0)
|
||||
gpiochip_unexport(chip);
|
||||
|
||||
return status;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gpiochip_remove);
|
||||
|
|
|
|||
|
|
@ -1007,12 +1007,28 @@ static int intel_dual_link_lvds_callback(const struct dmi_system_id *id)
|
|||
static const struct dmi_system_id intel_dual_link_lvds[] = {
|
||||
{
|
||||
.callback = intel_dual_link_lvds_callback,
|
||||
.ident = "Apple MacBook Pro (Core i5/i7 Series)",
|
||||
.ident = "Apple MacBook Pro 15\" (2010)",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro6,2"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = intel_dual_link_lvds_callback,
|
||||
.ident = "Apple MacBook Pro 15\" (2011)",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro8,2"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = intel_dual_link_lvds_callback,
|
||||
.ident = "Apple MacBook Pro 15\" (2012)",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro9,1"),
|
||||
},
|
||||
},
|
||||
{ } /* terminating entry */
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -648,7 +648,7 @@ int vmbus_request_offers(void)
|
|||
{
|
||||
struct vmbus_channel_message_header *msg;
|
||||
struct vmbus_channel_msginfo *msginfo;
|
||||
int ret, t;
|
||||
int ret;
|
||||
|
||||
msginfo = kmalloc(sizeof(*msginfo) +
|
||||
sizeof(struct vmbus_channel_message_header),
|
||||
|
|
@ -656,8 +656,6 @@ int vmbus_request_offers(void)
|
|||
if (!msginfo)
|
||||
return -ENOMEM;
|
||||
|
||||
init_completion(&msginfo->waitevent);
|
||||
|
||||
msg = (struct vmbus_channel_message_header *)msginfo->msg;
|
||||
|
||||
msg->msgtype = CHANNELMSG_REQUESTOFFERS;
|
||||
|
|
@ -671,14 +669,6 @@ int vmbus_request_offers(void)
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
t = wait_for_completion_timeout(&msginfo->waitevent, 5*HZ);
|
||||
if (t == 0) {
|
||||
ret = -ETIMEDOUT;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
|
||||
|
||||
cleanup:
|
||||
kfree(msginfo);
|
||||
|
||||
|
|
|
|||
|
|
@ -908,6 +908,18 @@ static inline void mmc_blk_reset_success(struct mmc_blk_data *md, int type)
|
|||
md->reset_done &= ~type;
|
||||
}
|
||||
|
||||
int mmc_access_rpmb(struct mmc_queue *mq)
|
||||
{
|
||||
struct mmc_blk_data *md = mq->data;
|
||||
/*
|
||||
* If this is a RPMB partition access, return ture
|
||||
*/
|
||||
if (md && md->part_type == EXT_CSD_PART_CONFIG_ACC_RPMB)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req)
|
||||
{
|
||||
struct mmc_blk_data *md = mq->data;
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ static int mmc_prep_request(struct request_queue *q, struct request *req)
|
|||
return BLKPREP_KILL;
|
||||
}
|
||||
|
||||
if (mq && mmc_card_removed(mq->card))
|
||||
if (mq && (mmc_card_removed(mq->card) || mmc_access_rpmb(mq)))
|
||||
return BLKPREP_KILL;
|
||||
|
||||
req->cmd_flags |= REQ_DONTPREP;
|
||||
|
|
|
|||
|
|
@ -73,4 +73,6 @@ extern void mmc_queue_bounce_post(struct mmc_queue_req *);
|
|||
extern int mmc_packed_init(struct mmc_queue *, struct mmc_card *);
|
||||
extern void mmc_packed_clean(struct mmc_queue *);
|
||||
|
||||
extern int mmc_access_rpmb(struct mmc_queue *);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -74,6 +74,8 @@ int ubi_check_volume(struct ubi_device *ubi, int vol_id)
|
|||
for (i = 0; i < vol->used_ebs; i++) {
|
||||
int size;
|
||||
|
||||
cond_resched();
|
||||
|
||||
if (i == vol->used_ebs - 1)
|
||||
size = vol->last_eb_bytes;
|
||||
else
|
||||
|
|
|
|||
|
|
@ -1077,7 +1077,7 @@ void devm_pinctrl_put(struct pinctrl *p)
|
|||
EXPORT_SYMBOL_GPL(devm_pinctrl_put);
|
||||
|
||||
int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps,
|
||||
bool dup, bool locked)
|
||||
bool dup)
|
||||
{
|
||||
int i, ret;
|
||||
struct pinctrl_maps *maps_node;
|
||||
|
|
@ -1145,11 +1145,9 @@ int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps,
|
|||
maps_node->maps = maps;
|
||||
}
|
||||
|
||||
if (!locked)
|
||||
mutex_lock(&pinctrl_maps_mutex);
|
||||
mutex_lock(&pinctrl_maps_mutex);
|
||||
list_add_tail(&maps_node->node, &pinctrl_maps);
|
||||
if (!locked)
|
||||
mutex_unlock(&pinctrl_maps_mutex);
|
||||
mutex_unlock(&pinctrl_maps_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1164,7 +1162,7 @@ int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps,
|
|||
int pinctrl_register_mappings(struct pinctrl_map const *maps,
|
||||
unsigned num_maps)
|
||||
{
|
||||
return pinctrl_register_map(maps, num_maps, true, false);
|
||||
return pinctrl_register_map(maps, num_maps, true);
|
||||
}
|
||||
|
||||
void pinctrl_unregister_map(struct pinctrl_map const *map)
|
||||
|
|
|
|||
|
|
@ -183,7 +183,7 @@ static inline struct pin_desc *pin_desc_get(struct pinctrl_dev *pctldev,
|
|||
}
|
||||
|
||||
int pinctrl_register_map(struct pinctrl_map const *maps, unsigned num_maps,
|
||||
bool dup, bool locked);
|
||||
bool dup);
|
||||
void pinctrl_unregister_map(struct pinctrl_map const *map);
|
||||
|
||||
extern int pinctrl_force_sleep(struct pinctrl_dev *pctldev);
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ static int dt_remember_or_free_map(struct pinctrl *p, const char *statename,
|
|||
dt_map->num_maps = num_maps;
|
||||
list_add_tail(&dt_map->node, &p->dt_maps);
|
||||
|
||||
return pinctrl_register_map(map, num_maps, false, true);
|
||||
return pinctrl_register_map(map, num_maps, false);
|
||||
}
|
||||
|
||||
struct pinctrl_dev *of_pinctrl_get(struct device_node *np)
|
||||
|
|
|
|||
|
|
@ -149,7 +149,6 @@ static int twa_reset_sequence(TW_Device_Extension *tw_dev, int soft_reset);
|
|||
static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, char *cdb, int use_sg, TW_SG_Entry *sglistarg);
|
||||
static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int request_id);
|
||||
static char *twa_string_lookup(twa_message_type *table, unsigned int aen_code);
|
||||
static void twa_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id);
|
||||
|
||||
/* Functions */
|
||||
|
||||
|
|
@ -1352,11 +1351,11 @@ static irqreturn_t twa_interrupt(int irq, void *dev_instance)
|
|||
}
|
||||
|
||||
/* Now complete the io */
|
||||
scsi_dma_unmap(cmd);
|
||||
cmd->scsi_done(cmd);
|
||||
tw_dev->state[request_id] = TW_S_COMPLETED;
|
||||
twa_free_request_id(tw_dev, request_id);
|
||||
tw_dev->posted_request_count--;
|
||||
tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]);
|
||||
twa_unmap_scsi_data(tw_dev, request_id);
|
||||
}
|
||||
|
||||
/* Check for valid status after each drain */
|
||||
|
|
@ -1414,26 +1413,6 @@ static void twa_load_sgl(TW_Device_Extension *tw_dev, TW_Command_Full *full_comm
|
|||
}
|
||||
} /* End twa_load_sgl() */
|
||||
|
||||
/* This function will perform a pci-dma mapping for a scatter gather list */
|
||||
static int twa_map_scsi_sg_data(TW_Device_Extension *tw_dev, int request_id)
|
||||
{
|
||||
int use_sg;
|
||||
struct scsi_cmnd *cmd = tw_dev->srb[request_id];
|
||||
|
||||
use_sg = scsi_dma_map(cmd);
|
||||
if (!use_sg)
|
||||
return 0;
|
||||
else if (use_sg < 0) {
|
||||
TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1c, "Failed to map scatter gather list");
|
||||
return 0;
|
||||
}
|
||||
|
||||
cmd->SCp.phase = TW_PHASE_SGLIST;
|
||||
cmd->SCp.have_data_in = use_sg;
|
||||
|
||||
return use_sg;
|
||||
} /* End twa_map_scsi_sg_data() */
|
||||
|
||||
/* This function will poll for a response interrupt of a request */
|
||||
static int twa_poll_response(TW_Device_Extension *tw_dev, int request_id, int seconds)
|
||||
{
|
||||
|
|
@ -1612,9 +1591,11 @@ static int twa_reset_device_extension(TW_Device_Extension *tw_dev)
|
|||
(tw_dev->state[i] != TW_S_INITIAL) &&
|
||||
(tw_dev->state[i] != TW_S_COMPLETED)) {
|
||||
if (tw_dev->srb[i]) {
|
||||
tw_dev->srb[i]->result = (DID_RESET << 16);
|
||||
tw_dev->srb[i]->scsi_done(tw_dev->srb[i]);
|
||||
twa_unmap_scsi_data(tw_dev, i);
|
||||
struct scsi_cmnd *cmd = tw_dev->srb[i];
|
||||
|
||||
cmd->result = (DID_RESET << 16);
|
||||
scsi_dma_unmap(cmd);
|
||||
cmd->scsi_done(cmd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1793,21 +1774,18 @@ static int twa_scsi_queue_lck(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_
|
|||
/* Save the scsi command for use by the ISR */
|
||||
tw_dev->srb[request_id] = SCpnt;
|
||||
|
||||
/* Initialize phase to zero */
|
||||
SCpnt->SCp.phase = TW_PHASE_INITIAL;
|
||||
|
||||
retval = twa_scsiop_execute_scsi(tw_dev, request_id, NULL, 0, NULL);
|
||||
switch (retval) {
|
||||
case SCSI_MLQUEUE_HOST_BUSY:
|
||||
scsi_dma_unmap(SCpnt);
|
||||
twa_free_request_id(tw_dev, request_id);
|
||||
twa_unmap_scsi_data(tw_dev, request_id);
|
||||
break;
|
||||
case 1:
|
||||
SCpnt->result = (DID_ERROR << 16);
|
||||
scsi_dma_unmap(SCpnt);
|
||||
done(SCpnt);
|
||||
tw_dev->state[request_id] = TW_S_COMPLETED;
|
||||
twa_free_request_id(tw_dev, request_id);
|
||||
twa_unmap_scsi_data(tw_dev, request_id);
|
||||
SCpnt->result = (DID_ERROR << 16);
|
||||
done(SCpnt);
|
||||
retval = 0;
|
||||
}
|
||||
out:
|
||||
|
|
@ -1875,8 +1853,8 @@ static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id,
|
|||
command_packet->sg_list[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
|
||||
command_packet->sg_list[0].length = cpu_to_le32(TW_MIN_SGL_LENGTH);
|
||||
} else {
|
||||
sg_count = twa_map_scsi_sg_data(tw_dev, request_id);
|
||||
if (sg_count == 0)
|
||||
sg_count = scsi_dma_map(srb);
|
||||
if (sg_count < 0)
|
||||
goto out;
|
||||
|
||||
scsi_for_each_sg(srb, sg, sg_count, i) {
|
||||
|
|
@ -1991,15 +1969,6 @@ static char *twa_string_lookup(twa_message_type *table, unsigned int code)
|
|||
return(table[index].text);
|
||||
} /* End twa_string_lookup() */
|
||||
|
||||
/* This function will perform a pci-dma unmap */
|
||||
static void twa_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id)
|
||||
{
|
||||
struct scsi_cmnd *cmd = tw_dev->srb[request_id];
|
||||
|
||||
if (cmd->SCp.phase == TW_PHASE_SGLIST)
|
||||
scsi_dma_unmap(cmd);
|
||||
} /* End twa_unmap_scsi_data() */
|
||||
|
||||
/* This function gets called when a disk is coming on-line */
|
||||
static int twa_slave_configure(struct scsi_device *sdev)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -324,11 +324,6 @@ static twa_message_type twa_error_table[] = {
|
|||
#define TW_CURRENT_DRIVER_BUILD 0
|
||||
#define TW_CURRENT_DRIVER_BRANCH 0
|
||||
|
||||
/* Phase defines */
|
||||
#define TW_PHASE_INITIAL 0
|
||||
#define TW_PHASE_SINGLE 1
|
||||
#define TW_PHASE_SGLIST 2
|
||||
|
||||
/* Misc defines */
|
||||
#define TW_9550SX_DRAIN_COMPLETED 0xFFFF
|
||||
#define TW_SECTOR_SIZE 512
|
||||
|
|
|
|||
|
|
@ -303,26 +303,6 @@ static int twl_post_command_packet(TW_Device_Extension *tw_dev, int request_id)
|
|||
return 0;
|
||||
} /* End twl_post_command_packet() */
|
||||
|
||||
/* This function will perform a pci-dma mapping for a scatter gather list */
|
||||
static int twl_map_scsi_sg_data(TW_Device_Extension *tw_dev, int request_id)
|
||||
{
|
||||
int use_sg;
|
||||
struct scsi_cmnd *cmd = tw_dev->srb[request_id];
|
||||
|
||||
use_sg = scsi_dma_map(cmd);
|
||||
if (!use_sg)
|
||||
return 0;
|
||||
else if (use_sg < 0) {
|
||||
TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1, "Failed to map scatter gather list");
|
||||
return 0;
|
||||
}
|
||||
|
||||
cmd->SCp.phase = TW_PHASE_SGLIST;
|
||||
cmd->SCp.have_data_in = use_sg;
|
||||
|
||||
return use_sg;
|
||||
} /* End twl_map_scsi_sg_data() */
|
||||
|
||||
/* This function hands scsi cdb's to the firmware */
|
||||
static int twl_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, char *cdb, int use_sg, TW_SG_Entry_ISO *sglistarg)
|
||||
{
|
||||
|
|
@ -370,8 +350,8 @@ static int twl_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id,
|
|||
if (!sglistarg) {
|
||||
/* Map sglist from scsi layer to cmd packet */
|
||||
if (scsi_sg_count(srb)) {
|
||||
sg_count = twl_map_scsi_sg_data(tw_dev, request_id);
|
||||
if (sg_count == 0)
|
||||
sg_count = scsi_dma_map(srb);
|
||||
if (sg_count <= 0)
|
||||
goto out;
|
||||
|
||||
scsi_for_each_sg(srb, sg, sg_count, i) {
|
||||
|
|
@ -1116,15 +1096,6 @@ static int twl_initialize_device_extension(TW_Device_Extension *tw_dev)
|
|||
return retval;
|
||||
} /* End twl_initialize_device_extension() */
|
||||
|
||||
/* This function will perform a pci-dma unmap */
|
||||
static void twl_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id)
|
||||
{
|
||||
struct scsi_cmnd *cmd = tw_dev->srb[request_id];
|
||||
|
||||
if (cmd->SCp.phase == TW_PHASE_SGLIST)
|
||||
scsi_dma_unmap(cmd);
|
||||
} /* End twl_unmap_scsi_data() */
|
||||
|
||||
/* This function will handle attention interrupts */
|
||||
static int twl_handle_attention_interrupt(TW_Device_Extension *tw_dev)
|
||||
{
|
||||
|
|
@ -1265,11 +1236,11 @@ static irqreturn_t twl_interrupt(int irq, void *dev_instance)
|
|||
}
|
||||
|
||||
/* Now complete the io */
|
||||
scsi_dma_unmap(cmd);
|
||||
cmd->scsi_done(cmd);
|
||||
tw_dev->state[request_id] = TW_S_COMPLETED;
|
||||
twl_free_request_id(tw_dev, request_id);
|
||||
tw_dev->posted_request_count--;
|
||||
tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]);
|
||||
twl_unmap_scsi_data(tw_dev, request_id);
|
||||
}
|
||||
|
||||
/* Check for another response interrupt */
|
||||
|
|
@ -1414,10 +1385,12 @@ static int twl_reset_device_extension(TW_Device_Extension *tw_dev, int ioctl_res
|
|||
if ((tw_dev->state[i] != TW_S_FINISHED) &&
|
||||
(tw_dev->state[i] != TW_S_INITIAL) &&
|
||||
(tw_dev->state[i] != TW_S_COMPLETED)) {
|
||||
if (tw_dev->srb[i]) {
|
||||
tw_dev->srb[i]->result = (DID_RESET << 16);
|
||||
tw_dev->srb[i]->scsi_done(tw_dev->srb[i]);
|
||||
twl_unmap_scsi_data(tw_dev, i);
|
||||
struct scsi_cmnd *cmd = tw_dev->srb[i];
|
||||
|
||||
if (cmd) {
|
||||
cmd->result = (DID_RESET << 16);
|
||||
scsi_dma_unmap(cmd);
|
||||
cmd->scsi_done(cmd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1521,9 +1494,6 @@ static int twl_scsi_queue_lck(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_
|
|||
/* Save the scsi command for use by the ISR */
|
||||
tw_dev->srb[request_id] = SCpnt;
|
||||
|
||||
/* Initialize phase to zero */
|
||||
SCpnt->SCp.phase = TW_PHASE_INITIAL;
|
||||
|
||||
retval = twl_scsiop_execute_scsi(tw_dev, request_id, NULL, 0, NULL);
|
||||
if (retval) {
|
||||
tw_dev->state[request_id] = TW_S_COMPLETED;
|
||||
|
|
|
|||
|
|
@ -103,10 +103,6 @@ static char *twl_aen_severity_table[] =
|
|||
#define TW_CURRENT_DRIVER_BUILD 0
|
||||
#define TW_CURRENT_DRIVER_BRANCH 0
|
||||
|
||||
/* Phase defines */
|
||||
#define TW_PHASE_INITIAL 0
|
||||
#define TW_PHASE_SGLIST 2
|
||||
|
||||
/* Misc defines */
|
||||
#define TW_SECTOR_SIZE 512
|
||||
#define TW_MAX_UNITS 32
|
||||
|
|
|
|||
|
|
@ -1283,32 +1283,6 @@ static int tw_initialize_device_extension(TW_Device_Extension *tw_dev)
|
|||
return 0;
|
||||
} /* End tw_initialize_device_extension() */
|
||||
|
||||
static int tw_map_scsi_sg_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
|
||||
{
|
||||
int use_sg;
|
||||
|
||||
dprintk(KERN_WARNING "3w-xxxx: tw_map_scsi_sg_data()\n");
|
||||
|
||||
use_sg = scsi_dma_map(cmd);
|
||||
if (use_sg < 0) {
|
||||
printk(KERN_WARNING "3w-xxxx: tw_map_scsi_sg_data(): pci_map_sg() failed.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
cmd->SCp.phase = TW_PHASE_SGLIST;
|
||||
cmd->SCp.have_data_in = use_sg;
|
||||
|
||||
return use_sg;
|
||||
} /* End tw_map_scsi_sg_data() */
|
||||
|
||||
static void tw_unmap_scsi_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
|
||||
{
|
||||
dprintk(KERN_WARNING "3w-xxxx: tw_unmap_scsi_data()\n");
|
||||
|
||||
if (cmd->SCp.phase == TW_PHASE_SGLIST)
|
||||
scsi_dma_unmap(cmd);
|
||||
} /* End tw_unmap_scsi_data() */
|
||||
|
||||
/* This function will reset a device extension */
|
||||
static int tw_reset_device_extension(TW_Device_Extension *tw_dev)
|
||||
{
|
||||
|
|
@ -1331,8 +1305,8 @@ static int tw_reset_device_extension(TW_Device_Extension *tw_dev)
|
|||
srb = tw_dev->srb[i];
|
||||
if (srb != NULL) {
|
||||
srb->result = (DID_RESET << 16);
|
||||
tw_dev->srb[i]->scsi_done(tw_dev->srb[i]);
|
||||
tw_unmap_scsi_data(tw_dev->tw_pci_dev, tw_dev->srb[i]);
|
||||
scsi_dma_unmap(srb);
|
||||
srb->scsi_done(srb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1779,8 +1753,8 @@ static int tw_scsiop_read_write(TW_Device_Extension *tw_dev, int request_id)
|
|||
command_packet->byte8.io.lba = lba;
|
||||
command_packet->byte6.block_count = num_sectors;
|
||||
|
||||
use_sg = tw_map_scsi_sg_data(tw_dev->tw_pci_dev, tw_dev->srb[request_id]);
|
||||
if (!use_sg)
|
||||
use_sg = scsi_dma_map(srb);
|
||||
if (use_sg <= 0)
|
||||
return 1;
|
||||
|
||||
scsi_for_each_sg(tw_dev->srb[request_id], sg, use_sg, i) {
|
||||
|
|
@ -1967,9 +1941,6 @@ static int tw_scsi_queue_lck(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_c
|
|||
/* Save the scsi command for use by the ISR */
|
||||
tw_dev->srb[request_id] = SCpnt;
|
||||
|
||||
/* Initialize phase to zero */
|
||||
SCpnt->SCp.phase = TW_PHASE_INITIAL;
|
||||
|
||||
switch (*command) {
|
||||
case READ_10:
|
||||
case READ_6:
|
||||
|
|
@ -2196,12 +2167,11 @@ static irqreturn_t tw_interrupt(int irq, void *dev_instance)
|
|||
|
||||
/* Now complete the io */
|
||||
if ((error != TW_ISR_DONT_COMPLETE)) {
|
||||
scsi_dma_unmap(tw_dev->srb[request_id]);
|
||||
tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]);
|
||||
tw_dev->state[request_id] = TW_S_COMPLETED;
|
||||
tw_state_request_finish(tw_dev, request_id);
|
||||
tw_dev->posted_request_count--;
|
||||
tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]);
|
||||
|
||||
tw_unmap_scsi_data(tw_dev->tw_pci_dev, tw_dev->srb[request_id]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -195,11 +195,6 @@ static unsigned char tw_sense_table[][4] =
|
|||
#define TW_AEN_SMART_FAIL 0x000F
|
||||
#define TW_AEN_SBUF_FAIL 0x0024
|
||||
|
||||
/* Phase defines */
|
||||
#define TW_PHASE_INITIAL 0
|
||||
#define TW_PHASE_SINGLE 1
|
||||
#define TW_PHASE_SGLIST 2
|
||||
|
||||
/* Misc defines */
|
||||
#define TW_ALIGNMENT_6000 64 /* 64 bytes */
|
||||
#define TW_ALIGNMENT_7000 4 /* 4 bytes */
|
||||
|
|
|
|||
|
|
@ -275,11 +275,11 @@ static unsigned char lcd_bits[LCD_PORTS][LCD_BITS][BIT_STATES];
|
|||
* LCD types
|
||||
*/
|
||||
#define LCD_TYPE_NONE 0
|
||||
#define LCD_TYPE_OLD 1
|
||||
#define LCD_TYPE_KS0074 2
|
||||
#define LCD_TYPE_HANTRONIX 3
|
||||
#define LCD_TYPE_NEXCOM 4
|
||||
#define LCD_TYPE_CUSTOM 5
|
||||
#define LCD_TYPE_CUSTOM 1
|
||||
#define LCD_TYPE_OLD 2
|
||||
#define LCD_TYPE_KS0074 3
|
||||
#define LCD_TYPE_HANTRONIX 4
|
||||
#define LCD_TYPE_NEXCOM 5
|
||||
|
||||
/*
|
||||
* keypad types
|
||||
|
|
@ -457,8 +457,7 @@ MODULE_PARM_DESC(keypad_enabled, "Deprecated option, use keypad_type instead");
|
|||
static int lcd_type = -1;
|
||||
module_param(lcd_type, int, 0000);
|
||||
MODULE_PARM_DESC(lcd_type,
|
||||
"LCD type: 0=none, 1=old //, 2=serial ks0074, "
|
||||
"3=hantronix //, 4=nexcom //, 5=compiled-in");
|
||||
"LCD type: 0=none, 1=compiled-in, 2=old, 3=serial ks0074, 4=hantronix, 5=nexcom");
|
||||
|
||||
static int lcd_proto = -1;
|
||||
module_param(lcd_proto, int, 0000);
|
||||
|
|
|
|||
|
|
@ -299,11 +299,27 @@ static int xen_initial_domain_console_init(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void xen_console_update_evtchn(struct xencons_info *info)
|
||||
{
|
||||
if (xen_hvm_domain()) {
|
||||
uint64_t v;
|
||||
int err;
|
||||
|
||||
err = hvm_get_parameter(HVM_PARAM_CONSOLE_EVTCHN, &v);
|
||||
if (!err && v)
|
||||
info->evtchn = v;
|
||||
} else
|
||||
info->evtchn = xen_start_info->console.domU.evtchn;
|
||||
}
|
||||
|
||||
void xen_console_resume(void)
|
||||
{
|
||||
struct xencons_info *info = vtermno_to_xencons(HVC_COOKIE);
|
||||
if (info != NULL && info->irq)
|
||||
if (info != NULL && info->irq) {
|
||||
if (!xen_initial_domain())
|
||||
xen_console_update_evtchn(info);
|
||||
rebind_evtchn_irq(info->evtchn, info->irq);
|
||||
}
|
||||
}
|
||||
|
||||
static void xencons_disconnect_backend(struct xencons_info *info)
|
||||
|
|
|
|||
|
|
@ -262,7 +262,6 @@ static struct of_device_id of_platform_serial_table[] = {
|
|||
{ .compatible = "ibm,qpace-nwp-serial",
|
||||
.data = (void *)PORT_NWPSERIAL, },
|
||||
#endif
|
||||
{ .type = "serial", .data = (void *)PORT_UNKNOWN, },
|
||||
{ /* end of list */ },
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -975,6 +975,15 @@ static int printer_func_setup(struct usb_function *f,
|
|||
break;
|
||||
}
|
||||
/* host either stalls (value < 0) or reports success */
|
||||
if (value >= 0) {
|
||||
req->length = value;
|
||||
req->zero = value < wLength;
|
||||
value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
|
||||
if (value < 0) {
|
||||
ERROR(dev, "%s:%d Error!\n", __func__, __LINE__);
|
||||
req->status = 0;
|
||||
}
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2497,11 +2497,12 @@ static irqreturn_t oxu210_hcd_irq(struct usb_hcd *hcd)
|
|||
|| oxu->reset_done[i] != 0)
|
||||
continue;
|
||||
|
||||
/* start 20 msec resume signaling from this port,
|
||||
* and make khubd collect PORT_STAT_C_SUSPEND to
|
||||
/* start USB_RESUME_TIMEOUT resume signaling from this
|
||||
* port, and make hub_wq collect PORT_STAT_C_SUSPEND to
|
||||
* stop that signaling.
|
||||
*/
|
||||
oxu->reset_done[i] = jiffies + msecs_to_jiffies(20);
|
||||
oxu->reset_done[i] = jiffies +
|
||||
msecs_to_jiffies(USB_RESUME_TIMEOUT);
|
||||
oxu_dbg(oxu, "port %d remote wakeup\n", i + 1);
|
||||
mod_timer(&hcd->rh_timer, oxu->reset_done[i]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -655,6 +655,14 @@ int ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk,
|
|||
|
||||
BUG_ON(end < lblk);
|
||||
|
||||
if ((status & EXTENT_STATUS_DELAYED) &&
|
||||
(status & EXTENT_STATUS_WRITTEN)) {
|
||||
ext4_warning(inode->i_sb, "Inserting extent [%u/%u] as "
|
||||
" delayed and written which can potentially "
|
||||
" cause data loss.\n", lblk, len);
|
||||
WARN_ON(1);
|
||||
}
|
||||
|
||||
newes.es_lblk = lblk;
|
||||
newes.es_len = len;
|
||||
ext4_es_store_pblock(&newes, pblk);
|
||||
|
|
|
|||
|
|
@ -626,6 +626,7 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode,
|
|||
status = map->m_flags & EXT4_MAP_UNWRITTEN ?
|
||||
EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN;
|
||||
if (!(flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE) &&
|
||||
!(status & EXTENT_STATUS_WRITTEN) &&
|
||||
ext4_find_delalloc_range(inode, map->m_lblk,
|
||||
map->m_lblk + map->m_len - 1))
|
||||
status |= EXTENT_STATUS_DELAYED;
|
||||
|
|
@ -736,6 +737,7 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode,
|
|||
status = map->m_flags & EXT4_MAP_UNWRITTEN ?
|
||||
EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN;
|
||||
if (!(flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE) &&
|
||||
!(status & EXTENT_STATUS_WRITTEN) &&
|
||||
ext4_find_delalloc_range(inode, map->m_lblk,
|
||||
map->m_lblk + map->m_len - 1))
|
||||
status |= EXTENT_STATUS_DELAYED;
|
||||
|
|
|
|||
|
|
@ -388,7 +388,7 @@ static int nilfs_btree_root_broken(const struct nilfs_btree_node *node,
|
|||
nchildren = nilfs_btree_node_get_nchildren(node);
|
||||
|
||||
if (unlikely(level < NILFS_BTREE_LEVEL_NODE_MIN ||
|
||||
level > NILFS_BTREE_LEVEL_MAX ||
|
||||
level >= NILFS_BTREE_LEVEL_MAX ||
|
||||
nchildren < 0 ||
|
||||
nchildren > NILFS_BTREE_ROOT_NCHILDREN_MAX)) {
|
||||
pr_crit("NILFS: bad btree root (inode number=%lu): level = %d, flags = 0x%x, nchildren = %d\n",
|
||||
|
|
|
|||
|
|
@ -729,6 +729,19 @@ struct dlm_lock_resource * dlm_get_lock_resource(struct dlm_ctxt *dlm,
|
|||
if (tmpres) {
|
||||
spin_unlock(&dlm->spinlock);
|
||||
spin_lock(&tmpres->spinlock);
|
||||
|
||||
/*
|
||||
* Right after dlm spinlock was released, dlm_thread could have
|
||||
* purged the lockres. Check if lockres got unhashed. If so
|
||||
* start over.
|
||||
*/
|
||||
if (hlist_unhashed(&tmpres->hash_node)) {
|
||||
spin_unlock(&tmpres->spinlock);
|
||||
dlm_lockres_put(tmpres);
|
||||
tmpres = NULL;
|
||||
goto lookup;
|
||||
}
|
||||
|
||||
/* Wait on the thread that is mastering the resource */
|
||||
if (tmpres->owner == DLM_LOCK_RES_OWNER_UNKNOWN) {
|
||||
__dlm_wait_on_lockres(tmpres);
|
||||
|
|
|
|||
|
|
@ -177,7 +177,7 @@ acpi_status acpi_load_tables(void);
|
|||
*/
|
||||
acpi_status acpi_reallocate_root_table(void);
|
||||
|
||||
acpi_status acpi_find_root_pointer(acpi_size *rsdp_address);
|
||||
acpi_status acpi_find_root_pointer(acpi_physical_address *rsdp_address);
|
||||
|
||||
acpi_status acpi_unload_table_id(acpi_owner_id id);
|
||||
|
||||
|
|
|
|||
|
|
@ -11,8 +11,6 @@
|
|||
#include <linux/irqnr.h>
|
||||
#include <linux/hardirq.h>
|
||||
#include <linux/irqflags.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/hrtimer.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
|
@ -488,15 +486,6 @@ extern void __raise_softirq_irqoff(unsigned int nr);
|
|||
extern void raise_softirq_irqoff(unsigned int nr);
|
||||
extern void raise_softirq(unsigned int nr);
|
||||
|
||||
/* This is the worklist that queues up per-cpu softirq work.
|
||||
*
|
||||
* send_remote_sendirq() adds work to these lists, and
|
||||
* the softirq handler itself dequeues from them. The queues
|
||||
* are protected by disabling local cpu interrupts and they must
|
||||
* only be accessed by the local cpu that they are for.
|
||||
*/
|
||||
DECLARE_PER_CPU(struct list_head [NR_SOFTIRQS], softirq_work_list);
|
||||
|
||||
DECLARE_PER_CPU(struct task_struct *, ksoftirqd);
|
||||
|
||||
static inline struct task_struct *this_cpu_ksoftirqd(void)
|
||||
|
|
@ -504,17 +493,6 @@ static inline struct task_struct *this_cpu_ksoftirqd(void)
|
|||
return this_cpu_read(ksoftirqd);
|
||||
}
|
||||
|
||||
/* Try to send a softirq to a remote cpu. If this cannot be done, the
|
||||
* work will be queued to the local cpu.
|
||||
*/
|
||||
extern void send_remote_softirq(struct call_single_data *cp, int cpu, int softirq);
|
||||
|
||||
/* Like send_remote_softirq(), but the caller must disable local cpu interrupts
|
||||
* and compute the current cpu, passed in as 'this_cpu'.
|
||||
*/
|
||||
extern void __send_remote_softirq(struct call_single_data *cp, int cpu,
|
||||
int this_cpu, int softirq);
|
||||
|
||||
/* Tasklets --- multithreaded analogue of BHs.
|
||||
|
||||
Main feature differing them of generic softirqs: tasklet
|
||||
|
|
|
|||
|
|
@ -458,7 +458,7 @@ struct nilfs_btree_node {
|
|||
/* level */
|
||||
#define NILFS_BTREE_LEVEL_DATA 0
|
||||
#define NILFS_BTREE_LEVEL_NODE_MIN (NILFS_BTREE_LEVEL_DATA + 1)
|
||||
#define NILFS_BTREE_LEVEL_MAX 14
|
||||
#define NILFS_BTREE_LEVEL_MAX 14 /* Max level (exclusive) */
|
||||
|
||||
/**
|
||||
* struct nilfs_palloc_group_desc - block group descriptor
|
||||
|
|
|
|||
|
|
@ -41,7 +41,8 @@
|
|||
|
||||
#define EMUPAGESIZE 4096
|
||||
#define MAXREQVOICES 8
|
||||
#define MAXPAGES 8192
|
||||
#define MAXPAGES0 4096 /* 32 bit mode */
|
||||
#define MAXPAGES1 8192 /* 31 bit mode */
|
||||
#define RESERVED 0
|
||||
#define NUM_MIDI 16
|
||||
#define NUM_G 64 /* use all channels */
|
||||
|
|
@ -50,8 +51,7 @@
|
|||
|
||||
/* FIXME? - according to the OSS driver the EMU10K1 needs a 29 bit DMA mask */
|
||||
#define EMU10K1_DMA_MASK 0x7fffffffUL /* 31bit */
|
||||
#define AUDIGY_DMA_MASK 0x7fffffffUL /* 31bit FIXME - 32 should work? */
|
||||
/* See ALSA bug #1276 - rlrevell */
|
||||
#define AUDIGY_DMA_MASK 0xffffffffUL /* 32bit mode */
|
||||
|
||||
#define TMEMSIZE 256*1024
|
||||
#define TMEMSIZEREG 4
|
||||
|
|
@ -468,8 +468,11 @@
|
|||
|
||||
#define MAPB 0x0d /* Cache map B */
|
||||
|
||||
#define MAP_PTE_MASK 0xffffe000 /* The 19 MSBs of the PTE indexed by the PTI */
|
||||
#define MAP_PTI_MASK 0x00001fff /* The 13 bit index to one of the 8192 PTE dwords */
|
||||
#define MAP_PTE_MASK0 0xfffff000 /* The 20 MSBs of the PTE indexed by the PTI */
|
||||
#define MAP_PTI_MASK0 0x00000fff /* The 12 bit index to one of the 4096 PTE dwords */
|
||||
|
||||
#define MAP_PTE_MASK1 0xffffe000 /* The 19 MSBs of the PTE indexed by the PTI */
|
||||
#define MAP_PTI_MASK1 0x00001fff /* The 13 bit index to one of the 8192 PTE dwords */
|
||||
|
||||
/* 0x0e, 0x0f: Not used */
|
||||
|
||||
|
|
@ -1706,6 +1709,7 @@ struct snd_emu10k1 {
|
|||
unsigned short model; /* subsystem id */
|
||||
unsigned int card_type; /* EMU10K1_CARD_* */
|
||||
unsigned int ecard_ctrl; /* ecard control bits */
|
||||
unsigned int address_mode; /* address mode */
|
||||
unsigned long dma_mask; /* PCI DMA mask */
|
||||
unsigned int delay_pcm_irq; /* in samples */
|
||||
int max_cache_pages; /* max memory size / PAGE_SIZE */
|
||||
|
|
|
|||
131
kernel/softirq.c
131
kernel/softirq.c
|
|
@ -6,8 +6,6 @@
|
|||
* Distribute under GPLv2.
|
||||
*
|
||||
* Rewritten. Old one was good in 2.2, but in 2.3 it was immoral. --ANK (990903)
|
||||
*
|
||||
* Remote softirq infrastructure is by Jens Axboe.
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
|
|
@ -620,146 +618,17 @@ void tasklet_hrtimer_init(struct tasklet_hrtimer *ttimer,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(tasklet_hrtimer_init);
|
||||
|
||||
/*
|
||||
* Remote softirq bits
|
||||
*/
|
||||
|
||||
DEFINE_PER_CPU(struct list_head [NR_SOFTIRQS], softirq_work_list);
|
||||
EXPORT_PER_CPU_SYMBOL(softirq_work_list);
|
||||
|
||||
static void __local_trigger(struct call_single_data *cp, int softirq)
|
||||
{
|
||||
struct list_head *head = &__get_cpu_var(softirq_work_list[softirq]);
|
||||
|
||||
list_add_tail(&cp->list, head);
|
||||
|
||||
/* Trigger the softirq only if the list was previously empty. */
|
||||
if (head->next == &cp->list)
|
||||
raise_softirq_irqoff(softirq);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USE_GENERIC_SMP_HELPERS
|
||||
static void remote_softirq_receive(void *data)
|
||||
{
|
||||
struct call_single_data *cp = data;
|
||||
unsigned long flags;
|
||||
int softirq;
|
||||
|
||||
softirq = *(int *)cp->info;
|
||||
local_irq_save(flags);
|
||||
__local_trigger(cp, softirq);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static int __try_remote_softirq(struct call_single_data *cp, int cpu, int softirq)
|
||||
{
|
||||
if (cpu_online(cpu)) {
|
||||
cp->func = remote_softirq_receive;
|
||||
cp->info = &softirq;
|
||||
cp->flags = 0;
|
||||
|
||||
__smp_call_function_single(cpu, cp, 0);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
#else /* CONFIG_USE_GENERIC_SMP_HELPERS */
|
||||
static int __try_remote_softirq(struct call_single_data *cp, int cpu, int softirq)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* __send_remote_softirq - try to schedule softirq work on a remote cpu
|
||||
* @cp: private SMP call function data area
|
||||
* @cpu: the remote cpu
|
||||
* @this_cpu: the currently executing cpu
|
||||
* @softirq: the softirq for the work
|
||||
*
|
||||
* Attempt to schedule softirq work on a remote cpu. If this cannot be
|
||||
* done, the work is instead queued up on the local cpu.
|
||||
*
|
||||
* Interrupts must be disabled.
|
||||
*/
|
||||
void __send_remote_softirq(struct call_single_data *cp, int cpu, int this_cpu, int softirq)
|
||||
{
|
||||
if (cpu == this_cpu || __try_remote_softirq(cp, cpu, softirq))
|
||||
__local_trigger(cp, softirq);
|
||||
}
|
||||
EXPORT_SYMBOL(__send_remote_softirq);
|
||||
|
||||
/**
|
||||
* send_remote_softirq - try to schedule softirq work on a remote cpu
|
||||
* @cp: private SMP call function data area
|
||||
* @cpu: the remote cpu
|
||||
* @softirq: the softirq for the work
|
||||
*
|
||||
* Like __send_remote_softirq except that disabling interrupts and
|
||||
* computing the current cpu is done for the caller.
|
||||
*/
|
||||
void send_remote_softirq(struct call_single_data *cp, int cpu, int softirq)
|
||||
{
|
||||
unsigned long flags;
|
||||
int this_cpu;
|
||||
|
||||
local_irq_save(flags);
|
||||
this_cpu = smp_processor_id();
|
||||
__send_remote_softirq(cp, cpu, this_cpu, softirq);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
EXPORT_SYMBOL(send_remote_softirq);
|
||||
|
||||
static int __cpuinit remote_softirq_cpu_notify(struct notifier_block *self,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
/*
|
||||
* If a CPU goes away, splice its entries to the current CPU
|
||||
* and trigger a run of the softirq
|
||||
*/
|
||||
if (action == CPU_DEAD || action == CPU_DEAD_FROZEN) {
|
||||
int cpu = (unsigned long) hcpu;
|
||||
int i;
|
||||
|
||||
local_irq_disable();
|
||||
for (i = 0; i < NR_SOFTIRQS; i++) {
|
||||
struct list_head *head = &per_cpu(softirq_work_list[i], cpu);
|
||||
struct list_head *local_head;
|
||||
|
||||
if (list_empty(head))
|
||||
continue;
|
||||
|
||||
local_head = &__get_cpu_var(softirq_work_list[i]);
|
||||
list_splice_init(head, local_head);
|
||||
raise_softirq_irqoff(i);
|
||||
}
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block __cpuinitdata remote_softirq_cpu_notifier = {
|
||||
.notifier_call = remote_softirq_cpu_notify,
|
||||
};
|
||||
|
||||
void __init softirq_init(void)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
int i;
|
||||
|
||||
per_cpu(tasklet_vec, cpu).tail =
|
||||
&per_cpu(tasklet_vec, cpu).head;
|
||||
per_cpu(tasklet_hi_vec, cpu).tail =
|
||||
&per_cpu(tasklet_hi_vec, cpu).head;
|
||||
for (i = 0; i < NR_SOFTIRQS; i++)
|
||||
INIT_LIST_HEAD(&per_cpu(softirq_work_list[i], cpu));
|
||||
}
|
||||
|
||||
register_hotcpu_notifier(&remote_softirq_cpu_notifier);
|
||||
|
||||
open_softirq(TASKLET_SOFTIRQ, tasklet_action);
|
||||
open_softirq(HI_SOFTIRQ, tasklet_hi_action);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1117,10 +1117,10 @@ int memory_failure(unsigned long pfn, int trapno, int flags)
|
|||
* The check (unnecessarily) ignores LRU pages being isolated and
|
||||
* walked by the page reclaim code, however that's not a big loss.
|
||||
*/
|
||||
if (!PageHuge(p) && !PageTransTail(p)) {
|
||||
if (!PageLRU(p))
|
||||
shake_page(p, 0);
|
||||
if (!PageLRU(p)) {
|
||||
if (!PageHuge(p)) {
|
||||
if (!PageLRU(hpage))
|
||||
shake_page(hpage, 0);
|
||||
if (!PageLRU(hpage)) {
|
||||
/*
|
||||
* shake_page could have turned it free.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -139,6 +139,7 @@ static void ping_v4_unhash(struct sock *sk)
|
|||
if (sk_hashed(sk)) {
|
||||
write_lock_bh(&ping_table.lock);
|
||||
hlist_nulls_del(&sk->sk_nulls_node);
|
||||
sk_nulls_node_init(&sk->sk_nulls_node);
|
||||
sock_put(sk);
|
||||
isk->inet_num = 0;
|
||||
isk->inet_sport = 0;
|
||||
|
|
|
|||
|
|
@ -683,13 +683,8 @@ static int seq_timing_event(unsigned char *event_rec)
|
|||
break;
|
||||
|
||||
case TMR_ECHO:
|
||||
if (seq_mode == SEQ_2)
|
||||
seq_copy_to_input(event_rec, 8);
|
||||
else
|
||||
{
|
||||
parm = (parm << 8 | SEQ_ECHO);
|
||||
seq_copy_to_input((unsigned char *) &parm, 4);
|
||||
}
|
||||
parm = (parm << 8 | SEQ_ECHO);
|
||||
seq_copy_to_input((unsigned char *) &parm, 4);
|
||||
break;
|
||||
|
||||
default:;
|
||||
|
|
@ -1332,7 +1327,6 @@ int sequencer_ioctl(int dev, struct file *file, unsigned int cmd, void __user *a
|
|||
int mode = translate_mode(file);
|
||||
struct synth_info inf;
|
||||
struct seq_event_rec event_rec;
|
||||
unsigned long flags;
|
||||
int __user *p = arg;
|
||||
|
||||
orig_dev = dev = dev >> 4;
|
||||
|
|
@ -1487,9 +1481,7 @@ int sequencer_ioctl(int dev, struct file *file, unsigned int cmd, void __user *a
|
|||
case SNDCTL_SEQ_OUTOFBAND:
|
||||
if (copy_from_user(&event_rec, arg, sizeof(event_rec)))
|
||||
return -EFAULT;
|
||||
spin_lock_irqsave(&lock,flags);
|
||||
play_event(event_rec.arr);
|
||||
spin_unlock_irqrestore(&lock,flags);
|
||||
return 0;
|
||||
|
||||
case SNDCTL_MIDI_INFO:
|
||||
|
|
|
|||
|
|
@ -181,8 +181,10 @@ static int snd_card_emu10k1_probe(struct pci_dev *pci,
|
|||
}
|
||||
#endif
|
||||
|
||||
strcpy(card->driver, emu->card_capabilities->driver);
|
||||
strcpy(card->shortname, emu->card_capabilities->name);
|
||||
strlcpy(card->driver, emu->card_capabilities->driver,
|
||||
sizeof(card->driver));
|
||||
strlcpy(card->shortname, emu->card_capabilities->name,
|
||||
sizeof(card->shortname));
|
||||
snprintf(card->longname, sizeof(card->longname),
|
||||
"%s (rev.%d, serial:0x%x) at 0x%lx, irq %i",
|
||||
card->shortname, emu->revision, emu->serial, emu->port, emu->irq);
|
||||
|
|
|
|||
|
|
@ -415,7 +415,7 @@ start_voice(struct snd_emux_voice *vp)
|
|||
snd_emu10k1_ptr_write(hw, Z2, ch, 0);
|
||||
|
||||
/* invalidate maps */
|
||||
temp = (hw->silent_page.addr << 1) | MAP_PTI_MASK;
|
||||
temp = (hw->silent_page.addr << hw->address_mode) | (hw->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0);
|
||||
snd_emu10k1_ptr_write(hw, MAPA, ch, temp);
|
||||
snd_emu10k1_ptr_write(hw, MAPB, ch, temp);
|
||||
#if 0
|
||||
|
|
@ -436,7 +436,7 @@ start_voice(struct snd_emux_voice *vp)
|
|||
snd_emu10k1_ptr_write(hw, CDF, ch, sample);
|
||||
|
||||
/* invalidate maps */
|
||||
temp = ((unsigned int)hw->silent_page.addr << 1) | MAP_PTI_MASK;
|
||||
temp = ((unsigned int)hw->silent_page.addr << hw_address_mode) | (hw->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0);
|
||||
snd_emu10k1_ptr_write(hw, MAPA, ch, temp);
|
||||
snd_emu10k1_ptr_write(hw, MAPB, ch, temp);
|
||||
|
||||
|
|
|
|||
|
|
@ -282,7 +282,7 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume)
|
|||
snd_emu10k1_ptr_write(emu, TCB, 0, 0); /* taken from original driver */
|
||||
snd_emu10k1_ptr_write(emu, TCBS, 0, 4); /* taken from original driver */
|
||||
|
||||
silent_page = (emu->silent_page.addr << 1) | MAP_PTI_MASK;
|
||||
silent_page = (emu->silent_page.addr << emu->address_mode) | (emu->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0);
|
||||
for (ch = 0; ch < NUM_G; ch++) {
|
||||
snd_emu10k1_ptr_write(emu, MAPA, ch, silent_page);
|
||||
snd_emu10k1_ptr_write(emu, MAPB, ch, silent_page);
|
||||
|
|
@ -348,6 +348,11 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume)
|
|||
outl(reg | A_IOCFG_GPOUT0, emu->port + A_IOCFG);
|
||||
}
|
||||
|
||||
if (emu->address_mode == 0) {
|
||||
/* use 16M in 4G */
|
||||
outl(inl(emu->port + HCFG) | HCFG_EXPANDED_MEM, emu->port + HCFG);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1411,7 +1416,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
|
|||
*
|
||||
*/
|
||||
{.vendor = 0x1102, .device = 0x0008, .subsystem = 0x20011102,
|
||||
.driver = "Audigy2", .name = "SB Audigy 2 ZS Notebook [SB0530]",
|
||||
.driver = "Audigy2", .name = "Audigy 2 ZS Notebook [SB0530]",
|
||||
.id = "Audigy2",
|
||||
.emu10k2_chip = 1,
|
||||
.ca0108_chip = 1,
|
||||
|
|
@ -1561,7 +1566,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
|
|||
.adc_1361t = 1, /* 24 bit capture instead of 16bit */
|
||||
.ac97_chip = 1} ,
|
||||
{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10051102,
|
||||
.driver = "Audigy2", .name = "SB Audigy 2 Platinum EX [SB0280]",
|
||||
.driver = "Audigy2", .name = "Audigy 2 Platinum EX [SB0280]",
|
||||
.id = "Audigy2",
|
||||
.emu10k2_chip = 1,
|
||||
.ca0102_chip = 1,
|
||||
|
|
@ -1865,8 +1870,10 @@ int snd_emu10k1_create(struct snd_card *card,
|
|||
|
||||
is_audigy = emu->audigy = c->emu10k2_chip;
|
||||
|
||||
/* set addressing mode */
|
||||
emu->address_mode = is_audigy ? 0 : 1;
|
||||
/* set the DMA transfer mask */
|
||||
emu->dma_mask = is_audigy ? AUDIGY_DMA_MASK : EMU10K1_DMA_MASK;
|
||||
emu->dma_mask = emu->address_mode ? EMU10K1_DMA_MASK : AUDIGY_DMA_MASK;
|
||||
if (pci_set_dma_mask(pci, emu->dma_mask) < 0 ||
|
||||
pci_set_consistent_dma_mask(pci, emu->dma_mask) < 0) {
|
||||
snd_printk(KERN_ERR "architecture does not support PCI busmaster DMA with mask 0x%lx\n", emu->dma_mask);
|
||||
|
|
@ -1889,7 +1896,7 @@ int snd_emu10k1_create(struct snd_card *card,
|
|||
|
||||
emu->max_cache_pages = max_cache_bytes >> PAGE_SHIFT;
|
||||
if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci),
|
||||
32 * 1024, &emu->ptb_pages) < 0) {
|
||||
(emu->address_mode ? 32 : 16) * 1024, &emu->ptb_pages) < 0) {
|
||||
err = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
|
|
@ -1988,8 +1995,8 @@ int snd_emu10k1_create(struct snd_card *card,
|
|||
|
||||
/* Clear silent pages and set up pointers */
|
||||
memset(emu->silent_page.area, 0, PAGE_SIZE);
|
||||
silent_page = emu->silent_page.addr << 1;
|
||||
for (idx = 0; idx < MAXPAGES; idx++)
|
||||
silent_page = emu->silent_page.addr << emu->address_mode;
|
||||
for (idx = 0; idx < (emu->address_mode ? MAXPAGES1 : MAXPAGES0); idx++)
|
||||
((u32 *)emu->ptb_pages.area)[idx] = cpu_to_le32(silent_page | idx);
|
||||
|
||||
/* set up voice indices */
|
||||
|
|
|
|||
|
|
@ -379,7 +379,7 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu,
|
|||
snd_emu10k1_ptr_write(emu, Z1, voice, 0);
|
||||
snd_emu10k1_ptr_write(emu, Z2, voice, 0);
|
||||
/* invalidate maps */
|
||||
silent_page = ((unsigned int)emu->silent_page.addr << 1) | MAP_PTI_MASK;
|
||||
silent_page = ((unsigned int)emu->silent_page.addr << emu->address_mode) | (emu->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0);
|
||||
snd_emu10k1_ptr_write(emu, MAPA, voice, silent_page);
|
||||
snd_emu10k1_ptr_write(emu, MAPB, voice, silent_page);
|
||||
/* modulation envelope */
|
||||
|
|
|
|||
|
|
@ -34,10 +34,11 @@
|
|||
* aligned pages in others
|
||||
*/
|
||||
#define __set_ptb_entry(emu,page,addr) \
|
||||
(((u32 *)(emu)->ptb_pages.area)[page] = cpu_to_le32(((addr) << 1) | (page)))
|
||||
(((u32 *)(emu)->ptb_pages.area)[page] = cpu_to_le32(((addr) << (emu->address_mode)) | (page)))
|
||||
|
||||
#define UNIT_PAGES (PAGE_SIZE / EMUPAGESIZE)
|
||||
#define MAX_ALIGN_PAGES (MAXPAGES / UNIT_PAGES)
|
||||
#define MAX_ALIGN_PAGES0 (MAXPAGES0 / UNIT_PAGES)
|
||||
#define MAX_ALIGN_PAGES1 (MAXPAGES1 / UNIT_PAGES)
|
||||
/* get aligned page from offset address */
|
||||
#define get_aligned_page(offset) ((offset) >> PAGE_SHIFT)
|
||||
/* get offset address from aligned page */
|
||||
|
|
@ -124,7 +125,7 @@ static int search_empty_map_area(struct snd_emu10k1 *emu, int npages, struct lis
|
|||
}
|
||||
page = blk->mapped_page + blk->pages;
|
||||
}
|
||||
size = MAX_ALIGN_PAGES - page;
|
||||
size = (emu->address_mode ? MAX_ALIGN_PAGES1 : MAX_ALIGN_PAGES0) - page;
|
||||
if (size >= max_size) {
|
||||
*nextp = pos;
|
||||
return page;
|
||||
|
|
@ -181,7 +182,7 @@ static int unmap_memblk(struct snd_emu10k1 *emu, struct snd_emu10k1_memblk *blk)
|
|||
q = get_emu10k1_memblk(p, mapped_link);
|
||||
end_page = q->mapped_page;
|
||||
} else
|
||||
end_page = MAX_ALIGN_PAGES;
|
||||
end_page = (emu->address_mode ? MAX_ALIGN_PAGES1 : MAX_ALIGN_PAGES0);
|
||||
|
||||
/* remove links */
|
||||
list_del(&blk->mapped_link);
|
||||
|
|
@ -305,7 +306,7 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *subst
|
|||
if (snd_BUG_ON(!emu))
|
||||
return NULL;
|
||||
if (snd_BUG_ON(runtime->dma_bytes <= 0 ||
|
||||
runtime->dma_bytes >= MAXPAGES * EMUPAGESIZE))
|
||||
runtime->dma_bytes >= (emu->address_mode ? MAXPAGES1 : MAXPAGES0) * EMUPAGESIZE))
|
||||
return NULL;
|
||||
hdr = emu->memhdr;
|
||||
if (snd_BUG_ON(!hdr))
|
||||
|
|
|
|||
|
|
@ -2078,6 +2078,16 @@ int snd_hda_codec_amp_init_stereo(struct hda_codec *codec, hda_nid_t nid,
|
|||
}
|
||||
EXPORT_SYMBOL_HDA(snd_hda_codec_amp_init_stereo);
|
||||
|
||||
/* meta hook to call each driver's vmaster hook */
|
||||
static void vmaster_hook(void *private_data, int enabled)
|
||||
{
|
||||
struct hda_vmaster_mute_hook *hook = private_data;
|
||||
|
||||
if (hook->mute_mode != HDA_VMUTE_FOLLOW_MASTER)
|
||||
enabled = hook->mute_mode;
|
||||
hook->hook(hook->codec, enabled);
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_hda_codec_resume_amp - Resume all AMP commands from the cache
|
||||
* @codec: HD-audio codec
|
||||
|
|
@ -2772,9 +2782,9 @@ int snd_hda_add_vmaster_hook(struct hda_codec *codec,
|
|||
|
||||
if (!hook->hook || !hook->sw_kctl)
|
||||
return 0;
|
||||
snd_ctl_add_vmaster_hook(hook->sw_kctl, hook->hook, codec);
|
||||
hook->codec = codec;
|
||||
hook->mute_mode = HDA_VMUTE_FOLLOW_MASTER;
|
||||
snd_ctl_add_vmaster_hook(hook->sw_kctl, vmaster_hook, hook);
|
||||
if (!expose_enum_ctl)
|
||||
return 0;
|
||||
kctl = snd_ctl_new1(&vmaster_mute_mode, hook);
|
||||
|
|
@ -2797,14 +2807,7 @@ void snd_hda_sync_vmaster_hook(struct hda_vmaster_mute_hook *hook)
|
|||
*/
|
||||
if (hook->codec->bus->shutdown)
|
||||
return;
|
||||
switch (hook->mute_mode) {
|
||||
case HDA_VMUTE_FOLLOW_MASTER:
|
||||
snd_ctl_sync_vmaster_hook(hook->sw_kctl);
|
||||
break;
|
||||
default:
|
||||
hook->hook(hook->codec, hook->mute_mode);
|
||||
break;
|
||||
}
|
||||
snd_ctl_sync_vmaster_hook(hook->sw_kctl);
|
||||
}
|
||||
EXPORT_SYMBOL_HDA(snd_hda_sync_vmaster_hook);
|
||||
|
||||
|
|
|
|||
|
|
@ -118,12 +118,8 @@ snd_emux_open_seq_oss(struct snd_seq_oss_arg *arg, void *closure)
|
|||
if (snd_BUG_ON(!arg || !emu))
|
||||
return -ENXIO;
|
||||
|
||||
mutex_lock(&emu->register_mutex);
|
||||
|
||||
if (!snd_emux_inc_count(emu)) {
|
||||
mutex_unlock(&emu->register_mutex);
|
||||
if (!snd_emux_inc_count(emu))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
memset(&callback, 0, sizeof(callback));
|
||||
callback.owner = THIS_MODULE;
|
||||
|
|
@ -135,7 +131,6 @@ snd_emux_open_seq_oss(struct snd_seq_oss_arg *arg, void *closure)
|
|||
if (p == NULL) {
|
||||
snd_printk(KERN_ERR "can't create port\n");
|
||||
snd_emux_dec_count(emu);
|
||||
mutex_unlock(&emu->register_mutex);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
|
@ -148,8 +143,6 @@ snd_emux_open_seq_oss(struct snd_seq_oss_arg *arg, void *closure)
|
|||
reset_port_mode(p, arg->seq_mode);
|
||||
|
||||
snd_emux_reset_port(p);
|
||||
|
||||
mutex_unlock(&emu->register_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -195,13 +188,11 @@ snd_emux_close_seq_oss(struct snd_seq_oss_arg *arg)
|
|||
if (snd_BUG_ON(!emu))
|
||||
return -ENXIO;
|
||||
|
||||
mutex_lock(&emu->register_mutex);
|
||||
snd_emux_sounds_off_all(p);
|
||||
snd_soundfont_close_check(emu->sflist, SF_CLIENT_NO(p->chset.port));
|
||||
snd_seq_event_port_detach(p->chset.client, p->chset.port);
|
||||
snd_emux_dec_count(emu);
|
||||
|
||||
mutex_unlock(&emu->register_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -124,12 +124,10 @@ snd_emux_detach_seq(struct snd_emux *emu)
|
|||
if (emu->voices)
|
||||
snd_emux_terminate_all(emu);
|
||||
|
||||
mutex_lock(&emu->register_mutex);
|
||||
if (emu->client >= 0) {
|
||||
snd_seq_delete_kernel_client(emu->client);
|
||||
emu->client = -1;
|
||||
}
|
||||
mutex_unlock(&emu->register_mutex);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -269,8 +267,8 @@ snd_emux_event_input(struct snd_seq_event *ev, int direct, void *private_data,
|
|||
/*
|
||||
* increment usage count
|
||||
*/
|
||||
int
|
||||
snd_emux_inc_count(struct snd_emux *emu)
|
||||
static int
|
||||
__snd_emux_inc_count(struct snd_emux *emu)
|
||||
{
|
||||
emu->used++;
|
||||
if (!try_module_get(emu->ops.owner))
|
||||
|
|
@ -284,12 +282,21 @@ snd_emux_inc_count(struct snd_emux *emu)
|
|||
return 1;
|
||||
}
|
||||
|
||||
int snd_emux_inc_count(struct snd_emux *emu)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&emu->register_mutex);
|
||||
ret = __snd_emux_inc_count(emu);
|
||||
mutex_unlock(&emu->register_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* decrease usage count
|
||||
*/
|
||||
void
|
||||
snd_emux_dec_count(struct snd_emux *emu)
|
||||
static void
|
||||
__snd_emux_dec_count(struct snd_emux *emu)
|
||||
{
|
||||
module_put(emu->card->module);
|
||||
emu->used--;
|
||||
|
|
@ -298,6 +305,12 @@ snd_emux_dec_count(struct snd_emux *emu)
|
|||
module_put(emu->ops.owner);
|
||||
}
|
||||
|
||||
void snd_emux_dec_count(struct snd_emux *emu)
|
||||
{
|
||||
mutex_lock(&emu->register_mutex);
|
||||
__snd_emux_dec_count(emu);
|
||||
mutex_unlock(&emu->register_mutex);
|
||||
}
|
||||
|
||||
/*
|
||||
* Routine that is called upon a first use of a particular port
|
||||
|
|
@ -317,7 +330,7 @@ snd_emux_use(void *private_data, struct snd_seq_port_subscribe *info)
|
|||
|
||||
mutex_lock(&emu->register_mutex);
|
||||
snd_emux_init_port(p);
|
||||
snd_emux_inc_count(emu);
|
||||
__snd_emux_inc_count(emu);
|
||||
mutex_unlock(&emu->register_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -340,7 +353,7 @@ snd_emux_unuse(void *private_data, struct snd_seq_port_subscribe *info)
|
|||
|
||||
mutex_lock(&emu->register_mutex);
|
||||
snd_emux_sounds_off_all(p);
|
||||
snd_emux_dec_count(emu);
|
||||
__snd_emux_dec_count(emu);
|
||||
mutex_unlock(&emu->register_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user