mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-11 05:17:10 +09:00
Merge tag 'v4.9.237' of git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable into odroidg12-4.9.y
This is the 4.9.237 stable release Change-Id: Id5bec581493205faec0772bd0fc7c2581f9fb0b4
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,6 +1,6 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 236
|
||||
SUBLEVEL = 237
|
||||
EXTRAVERSION =
|
||||
NAME = Roaring Lionus
|
||||
|
||||
|
||||
@@ -42,7 +42,6 @@
|
||||
#define CTOP_AUX_HW_COMPLY (CTOP_AUX_BASE + 0x024)
|
||||
#define CTOP_AUX_LPC (CTOP_AUX_BASE + 0x030)
|
||||
#define CTOP_AUX_EFLAGS (CTOP_AUX_BASE + 0x080)
|
||||
#define CTOP_AUX_IACK (CTOP_AUX_BASE + 0x088)
|
||||
#define CTOP_AUX_GPA1 (CTOP_AUX_BASE + 0x08C)
|
||||
#define CTOP_AUX_UDMC (CTOP_AUX_BASE + 0x300)
|
||||
|
||||
|
||||
@@ -710,7 +710,7 @@
|
||||
timer3: timer3@ffd00100 {
|
||||
compatible = "snps,dw-apb-timer";
|
||||
interrupts = <0 118 IRQ_TYPE_LEVEL_HIGH>;
|
||||
reg = <0xffd01000 0x100>;
|
||||
reg = <0xffd00100 0x100>;
|
||||
clocks = <&l4_sys_free_clk>;
|
||||
clock-names = "timer";
|
||||
};
|
||||
|
||||
@@ -848,6 +848,7 @@ config SNI_RM
|
||||
select I8253
|
||||
select I8259
|
||||
select ISA
|
||||
select MIPS_L1_CACHE_SHIFT_6
|
||||
select SWAP_IO_SPACE if CPU_BIG_ENDIAN
|
||||
select SYS_HAS_CPU_R4X00
|
||||
select SYS_HAS_CPU_R5000
|
||||
|
||||
@@ -143,7 +143,10 @@ static struct platform_device sc26xx_pdev = {
|
||||
},
|
||||
};
|
||||
|
||||
static u32 a20r_ack_hwint(void)
|
||||
/*
|
||||
* Trigger chipset to update CPU's CAUSE IP field
|
||||
*/
|
||||
static u32 a20r_update_cause_ip(void)
|
||||
{
|
||||
u32 status = read_c0_status();
|
||||
|
||||
@@ -205,12 +208,14 @@ static void a20r_hwint(void)
|
||||
int irq;
|
||||
|
||||
clear_c0_status(IE_IRQ0);
|
||||
status = a20r_ack_hwint();
|
||||
status = a20r_update_cause_ip();
|
||||
cause = read_c0_cause();
|
||||
|
||||
irq = ffs(((cause & status) >> 8) & 0xf8);
|
||||
if (likely(irq > 0))
|
||||
do_IRQ(SNI_A20R_IRQ_BASE + irq - 1);
|
||||
|
||||
a20r_update_cause_ip();
|
||||
set_c0_status(IE_IRQ0);
|
||||
}
|
||||
|
||||
|
||||
@@ -115,7 +115,6 @@ CONFIG_FB_NVIDIA=y
|
||||
CONFIG_FB_NVIDIA_I2C=y
|
||||
CONFIG_FB_RADEON=y
|
||||
# CONFIG_LCD_CLASS_DEVICE is not set
|
||||
CONFIG_VGACON_SOFT_SCROLLBACK=y
|
||||
CONFIG_LOGO=y
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SND=y
|
||||
|
||||
@@ -796,7 +796,6 @@ CONFIG_FB_TRIDENT=m
|
||||
CONFIG_FB_SM501=m
|
||||
CONFIG_FB_IBM_GXT4500=y
|
||||
CONFIG_LCD_PLATFORM=m
|
||||
CONFIG_VGACON_SOFT_SCROLLBACK=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
|
||||
CONFIG_LOGO=y
|
||||
|
||||
@@ -99,7 +99,8 @@ static u64 dma_iommu_get_required_mask(struct device *dev)
|
||||
if (!tbl)
|
||||
return 0;
|
||||
|
||||
mask = 1ULL < (fls_long(tbl->it_offset + tbl->it_size) - 1);
|
||||
mask = 1ULL << (fls_long(tbl->it_offset + tbl->it_size) +
|
||||
tbl->it_page_shift - 1);
|
||||
mask += mask - 1;
|
||||
|
||||
return mask;
|
||||
|
||||
@@ -217,7 +217,6 @@ CONFIG_FB_MODE_HELPERS=y
|
||||
CONFIG_FB_TILEBLITTING=y
|
||||
CONFIG_FB_EFI=y
|
||||
# CONFIG_LCD_CLASS_DEVICE is not set
|
||||
CONFIG_VGACON_SOFT_SCROLLBACK=y
|
||||
CONFIG_LOGO=y
|
||||
# CONFIG_LOGO_LINUX_MONO is not set
|
||||
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||
@@ -247,6 +246,7 @@ CONFIG_USB_HIDDEV=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||
CONFIG_USB_MON=y
|
||||
CONFIG_USB_XHCI_HCD=y
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
CONFIG_USB_EHCI_TT_NEWSCHED=y
|
||||
CONFIG_USB_OHCI_HCD=y
|
||||
|
||||
@@ -212,7 +212,6 @@ CONFIG_FB_MODE_HELPERS=y
|
||||
CONFIG_FB_TILEBLITTING=y
|
||||
CONFIG_FB_EFI=y
|
||||
# CONFIG_LCD_CLASS_DEVICE is not set
|
||||
CONFIG_VGACON_SOFT_SCROLLBACK=y
|
||||
CONFIG_LOGO=y
|
||||
# CONFIG_LOGO_LINUX_MONO is not set
|
||||
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||
@@ -242,6 +241,7 @@ CONFIG_USB_HIDDEV=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||
CONFIG_USB_MON=y
|
||||
CONFIG_USB_XHCI_HCD=y
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
CONFIG_USB_EHCI_TT_NEWSCHED=y
|
||||
CONFIG_USB_OHCI_HCD=y
|
||||
|
||||
@@ -8606,6 +8606,7 @@ static int vmx_handle_exit(struct kvm_vcpu *vcpu)
|
||||
(exit_reason != EXIT_REASON_EXCEPTION_NMI &&
|
||||
exit_reason != EXIT_REASON_EPT_VIOLATION &&
|
||||
exit_reason != EXIT_REASON_PML_FULL &&
|
||||
exit_reason != EXIT_REASON_APIC_ACCESS &&
|
||||
exit_reason != EXIT_REASON_TASK_SWITCH)) {
|
||||
vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
|
||||
vcpu->run->internal.suberror = KVM_INTERNAL_ERROR_DELIVERY_EV;
|
||||
|
||||
@@ -1013,6 +1013,7 @@ static int fs_open(struct atm_vcc *atm_vcc)
|
||||
error = make_rate (pcr, r, &tmc0, NULL);
|
||||
if (error) {
|
||||
kfree(tc);
|
||||
kfree(vcc);
|
||||
return error;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4614,6 +4614,9 @@ static ssize_t rbd_config_info_show(struct device *dev,
|
||||
{
|
||||
struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
return sprintf(buf, "%s\n", rbd_dev->config_info);
|
||||
}
|
||||
|
||||
@@ -4715,6 +4718,9 @@ static ssize_t rbd_image_refresh(struct device *dev,
|
||||
struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
|
||||
int ret;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
ret = rbd_dev_refresh(rbd_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
@@ -6192,6 +6198,9 @@ static ssize_t do_rbd_add(struct bus_type *bus,
|
||||
bool read_only;
|
||||
int rc;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
if (!try_module_get(THIS_MODULE))
|
||||
return -ENODEV;
|
||||
|
||||
@@ -6340,6 +6349,9 @@ static ssize_t do_rbd_remove(struct bus_type *bus,
|
||||
bool force = false;
|
||||
int ret;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
dev_id = -1;
|
||||
opt_buf[0] = '\0';
|
||||
sscanf(buf, "%d %5s", &dev_id, opt_buf);
|
||||
|
||||
@@ -126,7 +126,7 @@ PNAME(mux_usb480m_p) = { "usb480m_phy", "xin24m" };
|
||||
PNAME(mux_hdmiphy_p) = { "hdmiphy_phy", "xin24m" };
|
||||
PNAME(mux_aclk_cpu_src_p) = { "cpll_aclk_cpu", "gpll_aclk_cpu", "hdmiphy_aclk_cpu" };
|
||||
|
||||
PNAME(mux_pll_src_4plls_p) = { "cpll", "gpll", "hdmiphy" "usb480m" };
|
||||
PNAME(mux_pll_src_4plls_p) = { "cpll", "gpll", "hdmiphy", "usb480m" };
|
||||
PNAME(mux_pll_src_3plls_p) = { "cpll", "gpll", "hdmiphy" };
|
||||
PNAME(mux_pll_src_2plls_p) = { "cpll", "gpll" };
|
||||
PNAME(mux_sclk_hdmi_cec_p) = { "cpll", "gpll", "xin24m" };
|
||||
|
||||
@@ -457,8 +457,13 @@ err_pm:
|
||||
pm_runtime_disable(dev);
|
||||
err_node:
|
||||
of_node_put(private->mutex_node);
|
||||
for (i = 0; i < DDP_COMPONENT_ID_MAX; i++)
|
||||
for (i = 0; i < DDP_COMPONENT_ID_MAX; i++) {
|
||||
of_node_put(private->comp_node[i]);
|
||||
if (private->ddp_comp[i]) {
|
||||
put_device(private->ddp_comp[i]->larb_dev);
|
||||
private->ddp_comp[i] = NULL;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -681,7 +681,7 @@ static void vmbus_wait_for_unload(void)
|
||||
void *page_addr;
|
||||
struct hv_message *msg;
|
||||
struct vmbus_channel_message_header *hdr;
|
||||
u32 message_type;
|
||||
u32 message_type, i;
|
||||
|
||||
/*
|
||||
* CHANNELMSG_UNLOAD_RESPONSE is always delivered to the CPU which was
|
||||
@@ -691,8 +691,11 @@ static void vmbus_wait_for_unload(void)
|
||||
* functional and vmbus_unload_response() will complete
|
||||
* vmbus_connection.unload_event. If not, the last thing we can do is
|
||||
* read message pages for all CPUs directly.
|
||||
*
|
||||
* Wait no more than 10 seconds so that the panic path can't get
|
||||
* hung forever in case the response message isn't seen.
|
||||
*/
|
||||
while (1) {
|
||||
for (i = 0; i < 1000; i++) {
|
||||
if (completion_done(&vmbus_connection.unload_event))
|
||||
break;
|
||||
|
||||
|
||||
@@ -50,8 +50,22 @@ static void pca_reset(struct i2c_algo_pca_data *adap)
|
||||
pca_outw(adap, I2C_PCA_INDPTR, I2C_PCA_IPRESET);
|
||||
pca_outw(adap, I2C_PCA_IND, 0xA5);
|
||||
pca_outw(adap, I2C_PCA_IND, 0x5A);
|
||||
|
||||
/*
|
||||
* After a reset we need to re-apply any configuration
|
||||
* (calculated in pca_init) to get the bus in a working state.
|
||||
*/
|
||||
pca_outw(adap, I2C_PCA_INDPTR, I2C_PCA_IMODE);
|
||||
pca_outw(adap, I2C_PCA_IND, adap->bus_settings.mode);
|
||||
pca_outw(adap, I2C_PCA_INDPTR, I2C_PCA_ISCLL);
|
||||
pca_outw(adap, I2C_PCA_IND, adap->bus_settings.tlow);
|
||||
pca_outw(adap, I2C_PCA_INDPTR, I2C_PCA_ISCLH);
|
||||
pca_outw(adap, I2C_PCA_IND, adap->bus_settings.thi);
|
||||
|
||||
pca_set_con(adap, I2C_PCA_CON_ENSIO);
|
||||
} else {
|
||||
adap->reset_chip(adap->data);
|
||||
pca_set_con(adap, I2C_PCA_CON_ENSIO | adap->bus_settings.clock_freq);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -435,13 +449,14 @@ static int pca_init(struct i2c_adapter *adap)
|
||||
" Use the nominal frequency.\n", adap->name);
|
||||
}
|
||||
|
||||
pca_reset(pca_data);
|
||||
|
||||
clock = pca_clock(pca_data);
|
||||
printk(KERN_INFO "%s: Clock frequency is %dkHz\n",
|
||||
adap->name, freqs[clock]);
|
||||
|
||||
pca_set_con(pca_data, I2C_PCA_CON_ENSIO | clock);
|
||||
/* Store settings as these will be needed when the PCA chip is reset */
|
||||
pca_data->bus_settings.clock_freq = clock;
|
||||
|
||||
pca_reset(pca_data);
|
||||
} else {
|
||||
int clock;
|
||||
int mode;
|
||||
@@ -508,19 +523,15 @@ static int pca_init(struct i2c_adapter *adap)
|
||||
thi = tlow * min_thi / min_tlow;
|
||||
}
|
||||
|
||||
/* Store settings as these will be needed when the PCA chip is reset */
|
||||
pca_data->bus_settings.mode = mode;
|
||||
pca_data->bus_settings.tlow = tlow;
|
||||
pca_data->bus_settings.thi = thi;
|
||||
|
||||
pca_reset(pca_data);
|
||||
|
||||
printk(KERN_INFO
|
||||
"%s: Clock frequency is %dHz\n", adap->name, clock * 100);
|
||||
|
||||
pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_IMODE);
|
||||
pca_outw(pca_data, I2C_PCA_IND, mode);
|
||||
pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_ISCLL);
|
||||
pca_outw(pca_data, I2C_PCA_IND, tlow);
|
||||
pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_ISCLH);
|
||||
pca_outw(pca_data, I2C_PCA_IND, thi);
|
||||
|
||||
pca_set_con(pca_data, I2C_PCA_CON_ENSIO);
|
||||
}
|
||||
udelay(500); /* 500 us for oscillator to stabilise */
|
||||
|
||||
|
||||
@@ -197,6 +197,14 @@ struct bmc150_accel_data {
|
||||
struct mutex mutex;
|
||||
u8 fifo_mode, watermark;
|
||||
s16 buffer[8];
|
||||
/*
|
||||
* Ensure there is sufficient space and correct alignment for
|
||||
* the timestamp if enabled
|
||||
*/
|
||||
struct {
|
||||
__le16 channels[3];
|
||||
s64 ts __aligned(8);
|
||||
} scan;
|
||||
u8 bw_bits;
|
||||
u32 slope_dur;
|
||||
u32 slope_thres;
|
||||
@@ -933,15 +941,16 @@ static int __bmc150_accel_fifo_flush(struct iio_dev *indio_dev,
|
||||
* now.
|
||||
*/
|
||||
for (i = 0; i < count; i++) {
|
||||
u16 sample[8];
|
||||
int j, bit;
|
||||
|
||||
j = 0;
|
||||
for_each_set_bit(bit, indio_dev->active_scan_mask,
|
||||
indio_dev->masklength)
|
||||
memcpy(&sample[j++], &buffer[i * 3 + bit], 2);
|
||||
memcpy(&data->scan.channels[j++], &buffer[i * 3 + bit],
|
||||
sizeof(data->scan.channels[0]));
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, sample, tstamp);
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
||||
tstamp);
|
||||
|
||||
tstamp += sample_period;
|
||||
}
|
||||
|
||||
@@ -212,14 +212,20 @@ static irqreturn_t kxsd9_trigger_handler(int irq, void *p)
|
||||
const struct iio_poll_func *pf = p;
|
||||
struct iio_dev *indio_dev = pf->indio_dev;
|
||||
struct kxsd9_state *st = iio_priv(indio_dev);
|
||||
/*
|
||||
* Ensure correct positioning and alignment of timestamp.
|
||||
* No need to zero initialize as all elements written.
|
||||
*/
|
||||
struct {
|
||||
__be16 chan[4];
|
||||
s64 ts __aligned(8);
|
||||
} hw_values;
|
||||
int ret;
|
||||
/* 4 * 16bit values AND timestamp */
|
||||
__be16 hw_values[8];
|
||||
|
||||
ret = regmap_bulk_read(st->map,
|
||||
KXSD9_REG_X,
|
||||
&hw_values,
|
||||
8);
|
||||
hw_values.chan,
|
||||
sizeof(hw_values.chan));
|
||||
if (ret) {
|
||||
dev_err(st->dev,
|
||||
"error reading data\n");
|
||||
@@ -227,7 +233,7 @@ static irqreturn_t kxsd9_trigger_handler(int irq, void *p)
|
||||
}
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev,
|
||||
hw_values,
|
||||
&hw_values,
|
||||
iio_get_time_ns(indio_dev));
|
||||
iio_trigger_notify_done(indio_dev->trig);
|
||||
|
||||
|
||||
@@ -55,6 +55,14 @@
|
||||
|
||||
struct mma7455_data {
|
||||
struct regmap *regmap;
|
||||
/*
|
||||
* Used to reorganize data. Will ensure correct alignment of
|
||||
* the timestamp if present
|
||||
*/
|
||||
struct {
|
||||
__le16 channels[3];
|
||||
s64 ts __aligned(8);
|
||||
} scan;
|
||||
};
|
||||
|
||||
static int mma7455_drdy(struct mma7455_data *mma7455)
|
||||
@@ -85,19 +93,19 @@ static irqreturn_t mma7455_trigger_handler(int irq, void *p)
|
||||
struct iio_poll_func *pf = p;
|
||||
struct iio_dev *indio_dev = pf->indio_dev;
|
||||
struct mma7455_data *mma7455 = iio_priv(indio_dev);
|
||||
u8 buf[16]; /* 3 x 16-bit channels + padding + ts */
|
||||
int ret;
|
||||
|
||||
ret = mma7455_drdy(mma7455);
|
||||
if (ret)
|
||||
goto done;
|
||||
|
||||
ret = regmap_bulk_read(mma7455->regmap, MMA7455_REG_XOUTL, buf,
|
||||
sizeof(__le16) * 3);
|
||||
ret = regmap_bulk_read(mma7455->regmap, MMA7455_REG_XOUTL,
|
||||
mma7455->scan.channels,
|
||||
sizeof(mma7455->scan.channels));
|
||||
if (ret)
|
||||
goto done;
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, buf,
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, &mma7455->scan,
|
||||
iio_get_time_ns(indio_dev));
|
||||
|
||||
done:
|
||||
|
||||
@@ -105,6 +105,12 @@ struct mma8452_data {
|
||||
u8 ctrl_reg1;
|
||||
u8 data_cfg;
|
||||
const struct mma_chip_info *chip_info;
|
||||
|
||||
/* Ensure correct alignment of time stamp when present */
|
||||
struct {
|
||||
__be16 channels[3];
|
||||
s64 ts __aligned(8);
|
||||
} buffer;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -985,14 +991,13 @@ static irqreturn_t mma8452_trigger_handler(int irq, void *p)
|
||||
struct iio_poll_func *pf = p;
|
||||
struct iio_dev *indio_dev = pf->indio_dev;
|
||||
struct mma8452_data *data = iio_priv(indio_dev);
|
||||
u8 buffer[16]; /* 3 16-bit channels + padding + ts */
|
||||
int ret;
|
||||
|
||||
ret = mma8452_read(data, (__be16 *)buffer);
|
||||
ret = mma8452_read(data, data->buffer.channels);
|
||||
if (ret < 0)
|
||||
goto done;
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, buffer,
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer,
|
||||
iio_get_time_ns(indio_dev));
|
||||
|
||||
done:
|
||||
|
||||
@@ -117,6 +117,11 @@ struct ina2xx_chip_info {
|
||||
int int_time_vbus; /* Bus voltage integration time uS */
|
||||
int int_time_vshunt; /* Shunt voltage integration time uS */
|
||||
bool allow_async_readout;
|
||||
/* data buffer needs space for channel data and timestamp */
|
||||
struct {
|
||||
u16 chan[4];
|
||||
u64 ts __aligned(8);
|
||||
} scan;
|
||||
};
|
||||
|
||||
static const struct ina2xx_config ina2xx_config[] = {
|
||||
@@ -459,7 +464,6 @@ static const struct iio_chan_spec ina2xx_channels[] = {
|
||||
static int ina2xx_work_buffer(struct iio_dev *indio_dev)
|
||||
{
|
||||
struct ina2xx_chip_info *chip = iio_priv(indio_dev);
|
||||
unsigned short data[8];
|
||||
int bit, ret, i = 0;
|
||||
s64 time_a, time_b;
|
||||
unsigned int alert;
|
||||
@@ -500,13 +504,12 @@ static int ina2xx_work_buffer(struct iio_dev *indio_dev)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
data[i++] = val;
|
||||
chip->scan.chan[i++] = val;
|
||||
}
|
||||
|
||||
time_b = iio_get_time_ns(indio_dev);
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev,
|
||||
(unsigned int *)data, time_a);
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, &chip->scan, time_a);
|
||||
|
||||
return (unsigned long)(time_b - time_a) / 1000;
|
||||
};
|
||||
|
||||
@@ -99,16 +99,12 @@ static int mcp3422_update_config(struct mcp3422 *adc, u8 newconfig)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&adc->lock);
|
||||
|
||||
ret = i2c_master_send(adc->i2c, &newconfig, 1);
|
||||
if (ret > 0) {
|
||||
adc->config = newconfig;
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
mutex_unlock(&adc->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -141,6 +137,8 @@ static int mcp3422_read_channel(struct mcp3422 *adc,
|
||||
u8 config;
|
||||
u8 req_channel = channel->channel;
|
||||
|
||||
mutex_lock(&adc->lock);
|
||||
|
||||
if (req_channel != MCP3422_CHANNEL(adc->config)) {
|
||||
config = adc->config;
|
||||
config &= ~MCP3422_CHANNEL_MASK;
|
||||
@@ -148,12 +146,18 @@ static int mcp3422_read_channel(struct mcp3422 *adc,
|
||||
config &= ~MCP3422_PGA_MASK;
|
||||
config |= MCP3422_PGA_VALUE(adc->pga[req_channel]);
|
||||
ret = mcp3422_update_config(adc, config);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
mutex_unlock(&adc->lock);
|
||||
return ret;
|
||||
}
|
||||
msleep(mcp3422_read_times[MCP3422_SAMPLE_RATE(adc->config)]);
|
||||
}
|
||||
|
||||
return mcp3422_read(adc, value, &config);
|
||||
ret = mcp3422_read(adc, value, &config);
|
||||
|
||||
mutex_unlock(&adc->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mcp3422_read_raw(struct iio_dev *iio,
|
||||
|
||||
@@ -36,6 +36,12 @@ struct adc081c {
|
||||
|
||||
/* 8, 10 or 12 */
|
||||
int bits;
|
||||
|
||||
/* Ensure natural alignment of buffer elements */
|
||||
struct {
|
||||
u16 channel;
|
||||
s64 ts __aligned(8);
|
||||
} scan;
|
||||
};
|
||||
|
||||
#define REG_CONV_RES 0x00
|
||||
@@ -132,14 +138,13 @@ static irqreturn_t adc081c_trigger_handler(int irq, void *p)
|
||||
struct iio_poll_func *pf = p;
|
||||
struct iio_dev *indio_dev = pf->indio_dev;
|
||||
struct adc081c *data = iio_priv(indio_dev);
|
||||
u16 buf[8]; /* 2 bytes data + 6 bytes padding + 8 bytes timestamp */
|
||||
int ret;
|
||||
|
||||
ret = i2c_smbus_read_word_swapped(data->i2c, REG_CONV_RES);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
buf[0] = ret;
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, buf,
|
||||
data->scan.channel = ret;
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
||||
iio_get_time_ns(indio_dev));
|
||||
out:
|
||||
iio_trigger_notify_done(indio_dev->trig);
|
||||
|
||||
@@ -220,6 +220,7 @@ static const struct iio_chan_spec ads1115_channels[] = {
|
||||
IIO_CHAN_SOFT_TIMESTAMP(ADS1015_TIMESTAMP),
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int ads1015_set_power_state(struct ads1015_data *data, bool on)
|
||||
{
|
||||
int ret;
|
||||
@@ -237,6 +238,15 @@ static int ads1015_set_power_state(struct ads1015_data *data, bool on)
|
||||
return ret < 0 ? ret : 0;
|
||||
}
|
||||
|
||||
#else /* !CONFIG_PM */
|
||||
|
||||
static int ads1015_set_power_state(struct ads1015_data *data, bool on)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* !CONFIG_PM */
|
||||
|
||||
static
|
||||
int ads1015_get_adc_result(struct ads1015_data *data, int chan, int *val)
|
||||
{
|
||||
|
||||
@@ -1218,13 +1218,16 @@ static irqreturn_t ltr501_trigger_handler(int irq, void *p)
|
||||
struct iio_poll_func *pf = p;
|
||||
struct iio_dev *indio_dev = pf->indio_dev;
|
||||
struct ltr501_data *data = iio_priv(indio_dev);
|
||||
u16 buf[8];
|
||||
struct {
|
||||
u16 channels[3];
|
||||
s64 ts __aligned(8);
|
||||
} scan;
|
||||
__le16 als_buf[2];
|
||||
u8 mask = 0;
|
||||
int j = 0;
|
||||
int ret, psdata;
|
||||
|
||||
memset(buf, 0, sizeof(buf));
|
||||
memset(&scan, 0, sizeof(scan));
|
||||
|
||||
/* figure out which data needs to be ready */
|
||||
if (test_bit(0, indio_dev->active_scan_mask) ||
|
||||
@@ -1243,9 +1246,9 @@ static irqreturn_t ltr501_trigger_handler(int irq, void *p)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (test_bit(0, indio_dev->active_scan_mask))
|
||||
buf[j++] = le16_to_cpu(als_buf[1]);
|
||||
scan.channels[j++] = le16_to_cpu(als_buf[1]);
|
||||
if (test_bit(1, indio_dev->active_scan_mask))
|
||||
buf[j++] = le16_to_cpu(als_buf[0]);
|
||||
scan.channels[j++] = le16_to_cpu(als_buf[0]);
|
||||
}
|
||||
|
||||
if (mask & LTR501_STATUS_PS_RDY) {
|
||||
@@ -1253,10 +1256,10 @@ static irqreturn_t ltr501_trigger_handler(int irq, void *p)
|
||||
&psdata, 2);
|
||||
if (ret < 0)
|
||||
goto done;
|
||||
buf[j++] = psdata & LTR501_PS_DATA_MASK;
|
||||
scan.channels[j++] = psdata & LTR501_PS_DATA_MASK;
|
||||
}
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, buf,
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, &scan,
|
||||
iio_get_time_ns(indio_dev));
|
||||
|
||||
done:
|
||||
|
||||
@@ -78,6 +78,11 @@
|
||||
struct max44000_data {
|
||||
struct mutex lock;
|
||||
struct regmap *regmap;
|
||||
/* Ensure naturally aligned timestamp */
|
||||
struct {
|
||||
u16 channels[2];
|
||||
s64 ts __aligned(8);
|
||||
} scan;
|
||||
};
|
||||
|
||||
/* Default scale is set to the minimum of 0.03125 or 1 / (1 << 5) lux */
|
||||
@@ -491,7 +496,6 @@ static irqreturn_t max44000_trigger_handler(int irq, void *p)
|
||||
struct iio_poll_func *pf = p;
|
||||
struct iio_dev *indio_dev = pf->indio_dev;
|
||||
struct max44000_data *data = iio_priv(indio_dev);
|
||||
u16 buf[8]; /* 2x u16 + padding + 8 bytes timestamp */
|
||||
int index = 0;
|
||||
unsigned int regval;
|
||||
int ret;
|
||||
@@ -501,17 +505,17 @@ static irqreturn_t max44000_trigger_handler(int irq, void *p)
|
||||
ret = max44000_read_alsval(data);
|
||||
if (ret < 0)
|
||||
goto out_unlock;
|
||||
buf[index++] = ret;
|
||||
data->scan.channels[index++] = ret;
|
||||
}
|
||||
if (test_bit(MAX44000_SCAN_INDEX_PRX, indio_dev->active_scan_mask)) {
|
||||
ret = regmap_read(data->regmap, MAX44000_REG_PRX_DATA, ®val);
|
||||
if (ret < 0)
|
||||
goto out_unlock;
|
||||
buf[index] = regval;
|
||||
data->scan.channels[index] = regval;
|
||||
}
|
||||
mutex_unlock(&data->lock);
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, buf,
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
||||
iio_get_time_ns(indio_dev));
|
||||
iio_trigger_notify_done(indio_dev->trig);
|
||||
return IRQ_HANDLED;
|
||||
|
||||
@@ -381,6 +381,12 @@ struct ak8975_data {
|
||||
struct iio_mount_matrix orientation;
|
||||
struct regulator *vdd;
|
||||
struct regulator *vid;
|
||||
|
||||
/* Ensure natural alignment of timestamp */
|
||||
struct {
|
||||
s16 channels[3];
|
||||
s64 ts __aligned(8);
|
||||
} scan;
|
||||
};
|
||||
|
||||
/* Enable attached power regulator if any. */
|
||||
@@ -690,6 +696,7 @@ static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val)
|
||||
struct ak8975_data *data = iio_priv(indio_dev);
|
||||
const struct i2c_client *client = data->client;
|
||||
const struct ak_def *def = data->def;
|
||||
__le16 rval;
|
||||
u16 buff;
|
||||
int ret;
|
||||
|
||||
@@ -703,7 +710,7 @@ static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val)
|
||||
|
||||
ret = i2c_smbus_read_i2c_block_data_or_emulated(
|
||||
client, def->data_regs[index],
|
||||
sizeof(buff), (u8*)&buff);
|
||||
sizeof(rval), (u8*)&rval);
|
||||
if (ret < 0)
|
||||
goto exit;
|
||||
|
||||
@@ -713,7 +720,7 @@ static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val)
|
||||
pm_runtime_put_autosuspend(&data->client->dev);
|
||||
|
||||
/* Swap bytes and convert to valid range. */
|
||||
buff = le16_to_cpu(buff);
|
||||
buff = le16_to_cpu(rval);
|
||||
*val = clamp_t(s16, buff, -def->range, def->range);
|
||||
return IIO_VAL_INT;
|
||||
|
||||
@@ -812,7 +819,7 @@ static void ak8975_fill_buffer(struct iio_dev *indio_dev)
|
||||
const struct i2c_client *client = data->client;
|
||||
const struct ak_def *def = data->def;
|
||||
int ret;
|
||||
s16 buff[8]; /* 3 x 16 bits axis values + 1 aligned 64 bits timestamp */
|
||||
__le16 fval[3];
|
||||
|
||||
mutex_lock(&data->lock);
|
||||
|
||||
@@ -826,20 +833,21 @@ static void ak8975_fill_buffer(struct iio_dev *indio_dev)
|
||||
*/
|
||||
ret = i2c_smbus_read_i2c_block_data_or_emulated(client,
|
||||
def->data_regs[0],
|
||||
3 * sizeof(buff[0]),
|
||||
(u8 *)buff);
|
||||
3 * sizeof(fval[0]),
|
||||
(u8 *)fval);
|
||||
if (ret < 0)
|
||||
goto unlock;
|
||||
|
||||
mutex_unlock(&data->lock);
|
||||
|
||||
/* Clamp to valid range. */
|
||||
buff[0] = clamp_t(s16, le16_to_cpu(buff[0]), -def->range, def->range);
|
||||
buff[1] = clamp_t(s16, le16_to_cpu(buff[1]), -def->range, def->range);
|
||||
buff[2] = clamp_t(s16, le16_to_cpu(buff[2]), -def->range, def->range);
|
||||
data->scan.channels[0] = clamp_t(s16, le16_to_cpu(fval[0]), -def->range, def->range);
|
||||
data->scan.channels[1] = clamp_t(s16, le16_to_cpu(fval[1]), -def->range, def->range);
|
||||
data->scan.channels[2] = clamp_t(s16, le16_to_cpu(fval[2]), -def->range, def->range);
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, buff,
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
||||
iio_get_time_ns(indio_dev));
|
||||
|
||||
return;
|
||||
|
||||
unlock:
|
||||
|
||||
@@ -168,9 +168,6 @@ static int rxe_init_ports(struct rxe_dev *rxe)
|
||||
|
||||
rxe_init_port_param(port);
|
||||
|
||||
if (!port->attr.pkey_tbl_len || !port->attr.gid_tbl_len)
|
||||
return -EINVAL;
|
||||
|
||||
port->pkey_tbl = kcalloc(port->attr.pkey_tbl_len,
|
||||
sizeof(*port->pkey_tbl), GFP_KERNEL);
|
||||
|
||||
@@ -178,7 +175,7 @@ static int rxe_init_ports(struct rxe_dev *rxe)
|
||||
return -ENOMEM;
|
||||
|
||||
port->pkey_tbl[0] = 0xffff;
|
||||
port->port_guid = rxe->ifc_ops->port_guid(rxe);
|
||||
port->port_guid = rxe_port_guid(rxe);
|
||||
|
||||
spin_lock_init(&port->port_lock);
|
||||
|
||||
|
||||
@@ -141,6 +141,22 @@ void rxe_mem_cleanup(void *arg);
|
||||
|
||||
int advance_dma_data(struct rxe_dma_info *dma, unsigned int length);
|
||||
|
||||
/* rxe_net.c */
|
||||
int rxe_loopback(struct sk_buff *skb);
|
||||
int rxe_send(struct rxe_dev *rxe, struct rxe_pkt_info *pkt,
|
||||
struct sk_buff *skb);
|
||||
__be64 rxe_port_guid(struct rxe_dev *rxe);
|
||||
struct sk_buff *rxe_init_packet(struct rxe_dev *rxe, struct rxe_av *av,
|
||||
int paylen, struct rxe_pkt_info *pkt);
|
||||
int rxe_prepare(struct rxe_dev *rxe, struct rxe_pkt_info *pkt,
|
||||
struct sk_buff *skb, u32 *crc);
|
||||
enum rdma_link_layer rxe_link_layer(struct rxe_dev *rxe, unsigned int port_num);
|
||||
const char *rxe_parent_name(struct rxe_dev *rxe, unsigned int port_num);
|
||||
struct device *rxe_dma_device(struct rxe_dev *rxe);
|
||||
__be64 rxe_node_guid(struct rxe_dev *rxe);
|
||||
int rxe_mcast_add(struct rxe_dev *rxe, union ib_gid *mgid);
|
||||
int rxe_mcast_delete(struct rxe_dev *rxe, union ib_gid *mgid);
|
||||
|
||||
/* rxe_qp.c */
|
||||
int rxe_qp_chk_init(struct rxe_dev *rxe, struct ib_qp_init_attr *init);
|
||||
|
||||
@@ -256,9 +272,9 @@ static inline int rxe_xmit_packet(struct rxe_dev *rxe, struct rxe_qp *qp,
|
||||
|
||||
if (pkt->mask & RXE_LOOPBACK_MASK) {
|
||||
memcpy(SKB_TO_PKT(skb), pkt, sizeof(*pkt));
|
||||
err = rxe->ifc_ops->loopback(skb);
|
||||
err = rxe_loopback(skb);
|
||||
} else {
|
||||
err = rxe->ifc_ops->send(rxe, pkt, skb);
|
||||
err = rxe_send(rxe, pkt, skb);
|
||||
}
|
||||
|
||||
if (err) {
|
||||
|
||||
@@ -61,7 +61,7 @@ int rxe_mcast_get_grp(struct rxe_dev *rxe, union ib_gid *mgid,
|
||||
|
||||
rxe_add_key(grp, mgid);
|
||||
|
||||
err = rxe->ifc_ops->mcast_add(rxe, mgid);
|
||||
err = rxe_mcast_add(rxe, mgid);
|
||||
if (err)
|
||||
goto err2;
|
||||
|
||||
@@ -186,5 +186,5 @@ void rxe_mc_cleanup(void *arg)
|
||||
struct rxe_dev *rxe = grp->rxe;
|
||||
|
||||
rxe_drop_key(grp);
|
||||
rxe->ifc_ops->mcast_delete(rxe, &grp->mgid);
|
||||
rxe_mcast_delete(rxe, &grp->mgid);
|
||||
}
|
||||
|
||||
@@ -205,6 +205,7 @@ int rxe_mem_init_user(struct rxe_dev *rxe, struct rxe_pd *pd, u64 start,
|
||||
vaddr = page_address(sg_page(sg));
|
||||
if (!vaddr) {
|
||||
pr_warn("null vaddr\n");
|
||||
ib_umem_release(umem);
|
||||
err = -ENOMEM;
|
||||
goto err1;
|
||||
}
|
||||
|
||||
@@ -102,17 +102,17 @@ static __be64 rxe_mac_to_eui64(struct net_device *ndev)
|
||||
return eui64;
|
||||
}
|
||||
|
||||
static __be64 node_guid(struct rxe_dev *rxe)
|
||||
__be64 rxe_node_guid(struct rxe_dev *rxe)
|
||||
{
|
||||
return rxe_mac_to_eui64(rxe->ndev);
|
||||
}
|
||||
|
||||
static __be64 port_guid(struct rxe_dev *rxe)
|
||||
__be64 rxe_port_guid(struct rxe_dev *rxe)
|
||||
{
|
||||
return rxe_mac_to_eui64(rxe->ndev);
|
||||
}
|
||||
|
||||
static struct device *dma_device(struct rxe_dev *rxe)
|
||||
struct device *rxe_dma_device(struct rxe_dev *rxe)
|
||||
{
|
||||
struct net_device *ndev;
|
||||
|
||||
@@ -124,7 +124,7 @@ static struct device *dma_device(struct rxe_dev *rxe)
|
||||
return ndev->dev.parent;
|
||||
}
|
||||
|
||||
static int mcast_add(struct rxe_dev *rxe, union ib_gid *mgid)
|
||||
int rxe_mcast_add(struct rxe_dev *rxe, union ib_gid *mgid)
|
||||
{
|
||||
int err;
|
||||
unsigned char ll_addr[ETH_ALEN];
|
||||
@@ -135,7 +135,7 @@ static int mcast_add(struct rxe_dev *rxe, union ib_gid *mgid)
|
||||
return err;
|
||||
}
|
||||
|
||||
static int mcast_delete(struct rxe_dev *rxe, union ib_gid *mgid)
|
||||
int rxe_mcast_delete(struct rxe_dev *rxe, union ib_gid *mgid)
|
||||
{
|
||||
int err;
|
||||
unsigned char ll_addr[ETH_ALEN];
|
||||
@@ -399,8 +399,8 @@ static int prepare6(struct rxe_dev *rxe, struct rxe_pkt_info *pkt,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int prepare(struct rxe_dev *rxe, struct rxe_pkt_info *pkt,
|
||||
struct sk_buff *skb, u32 *crc)
|
||||
int rxe_prepare(struct rxe_dev *rxe, struct rxe_pkt_info *pkt,
|
||||
struct sk_buff *skb, u32 *crc)
|
||||
{
|
||||
int err = 0;
|
||||
struct rxe_av *av = rxe_get_av(pkt);
|
||||
@@ -426,8 +426,7 @@ static void rxe_skb_tx_dtor(struct sk_buff *skb)
|
||||
rxe_run_task(&qp->req.task, 1);
|
||||
}
|
||||
|
||||
static int send(struct rxe_dev *rxe, struct rxe_pkt_info *pkt,
|
||||
struct sk_buff *skb)
|
||||
int rxe_send(struct rxe_dev *rxe, struct rxe_pkt_info *pkt, struct sk_buff *skb)
|
||||
{
|
||||
struct sk_buff *nskb;
|
||||
struct rxe_av *av;
|
||||
@@ -462,7 +461,7 @@ static int send(struct rxe_dev *rxe, struct rxe_pkt_info *pkt,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int loopback(struct sk_buff *skb)
|
||||
int rxe_loopback(struct sk_buff *skb)
|
||||
{
|
||||
return rxe_rcv(skb);
|
||||
}
|
||||
@@ -472,8 +471,8 @@ static inline int addr_same(struct rxe_dev *rxe, struct rxe_av *av)
|
||||
return rxe->port.port_guid == av->grh.dgid.global.interface_id;
|
||||
}
|
||||
|
||||
static struct sk_buff *init_packet(struct rxe_dev *rxe, struct rxe_av *av,
|
||||
int paylen, struct rxe_pkt_info *pkt)
|
||||
struct sk_buff *rxe_init_packet(struct rxe_dev *rxe, struct rxe_av *av,
|
||||
int paylen, struct rxe_pkt_info *pkt)
|
||||
{
|
||||
unsigned int hdr_len;
|
||||
struct sk_buff *skb;
|
||||
@@ -512,31 +511,16 @@ static struct sk_buff *init_packet(struct rxe_dev *rxe, struct rxe_av *av,
|
||||
* this is required by rxe_cfg to match rxe devices in
|
||||
* /sys/class/infiniband up with their underlying ethernet devices
|
||||
*/
|
||||
static char *parent_name(struct rxe_dev *rxe, unsigned int port_num)
|
||||
const char *rxe_parent_name(struct rxe_dev *rxe, unsigned int port_num)
|
||||
{
|
||||
return rxe->ndev->name;
|
||||
}
|
||||
|
||||
static enum rdma_link_layer link_layer(struct rxe_dev *rxe,
|
||||
unsigned int port_num)
|
||||
enum rdma_link_layer rxe_link_layer(struct rxe_dev *rxe, unsigned int port_num)
|
||||
{
|
||||
return IB_LINK_LAYER_ETHERNET;
|
||||
}
|
||||
|
||||
static struct rxe_ifc_ops ifc_ops = {
|
||||
.node_guid = node_guid,
|
||||
.port_guid = port_guid,
|
||||
.dma_device = dma_device,
|
||||
.mcast_add = mcast_add,
|
||||
.mcast_delete = mcast_delete,
|
||||
.prepare = prepare,
|
||||
.send = send,
|
||||
.loopback = loopback,
|
||||
.init_packet = init_packet,
|
||||
.parent_name = parent_name,
|
||||
.link_layer = link_layer,
|
||||
};
|
||||
|
||||
struct rxe_dev *rxe_net_add(struct net_device *ndev)
|
||||
{
|
||||
int err;
|
||||
@@ -546,7 +530,6 @@ struct rxe_dev *rxe_net_add(struct net_device *ndev)
|
||||
if (!rxe)
|
||||
return NULL;
|
||||
|
||||
rxe->ifc_ops = &ifc_ops;
|
||||
rxe->ndev = ndev;
|
||||
|
||||
err = rxe_add(rxe, ndev->mtu);
|
||||
|
||||
@@ -412,7 +412,7 @@ static struct sk_buff *init_req_packet(struct rxe_qp *qp,
|
||||
|
||||
/* init skb */
|
||||
av = rxe_get_av(pkt);
|
||||
skb = rxe->ifc_ops->init_packet(rxe, av, paylen, pkt);
|
||||
skb = rxe_init_packet(rxe, av, paylen, pkt);
|
||||
if (unlikely(!skb))
|
||||
return NULL;
|
||||
|
||||
@@ -483,7 +483,7 @@ static int fill_packet(struct rxe_qp *qp, struct rxe_send_wqe *wqe,
|
||||
u32 *p;
|
||||
int err;
|
||||
|
||||
err = rxe->ifc_ops->prepare(rxe, pkt, skb, &crc);
|
||||
err = rxe_prepare(rxe, pkt, skb, &crc);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
||||
@@ -600,7 +600,7 @@ static struct sk_buff *prepare_ack_packet(struct rxe_qp *qp,
|
||||
pad = (-payload) & 0x3;
|
||||
paylen = rxe_opcode[opcode].length + payload + pad + RXE_ICRC_SIZE;
|
||||
|
||||
skb = rxe->ifc_ops->init_packet(rxe, &qp->pri_av, paylen, ack);
|
||||
skb = rxe_init_packet(rxe, &qp->pri_av, paylen, ack);
|
||||
if (!skb)
|
||||
return NULL;
|
||||
|
||||
@@ -629,7 +629,7 @@ static struct sk_buff *prepare_ack_packet(struct rxe_qp *qp,
|
||||
if (ack->mask & RXE_ATMACK_MASK)
|
||||
atmack_set_orig(ack, qp->resp.atomic_orig);
|
||||
|
||||
err = rxe->ifc_ops->prepare(rxe, ack, skb, &crc);
|
||||
err = rxe_prepare(rxe, ack, skb, &crc);
|
||||
if (err) {
|
||||
kfree_skb(skb);
|
||||
return NULL;
|
||||
|
||||
@@ -234,7 +234,7 @@ static enum rdma_link_layer rxe_get_link_layer(struct ib_device *dev,
|
||||
{
|
||||
struct rxe_dev *rxe = to_rdev(dev);
|
||||
|
||||
return rxe->ifc_ops->link_layer(rxe, port_num);
|
||||
return rxe_link_layer(rxe, port_num);
|
||||
}
|
||||
|
||||
static struct ib_ucontext *rxe_alloc_ucontext(struct ib_device *dev,
|
||||
@@ -1194,10 +1194,8 @@ static ssize_t rxe_show_parent(struct device *device,
|
||||
{
|
||||
struct rxe_dev *rxe = container_of(device, struct rxe_dev,
|
||||
ib_dev.dev);
|
||||
char *name;
|
||||
|
||||
name = rxe->ifc_ops->parent_name(rxe, 1);
|
||||
return snprintf(buf, 16, "%s\n", name);
|
||||
return scnprintf(buf, PAGE_SIZE, "%s\n", rxe_parent_name(rxe, 1));
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(parent, S_IRUGO, rxe_show_parent, NULL);
|
||||
@@ -1219,9 +1217,9 @@ int rxe_register_device(struct rxe_dev *rxe)
|
||||
dev->node_type = RDMA_NODE_IB_CA;
|
||||
dev->phys_port_cnt = 1;
|
||||
dev->num_comp_vectors = RXE_NUM_COMP_VECTORS;
|
||||
dev->dma_device = rxe->ifc_ops->dma_device(rxe);
|
||||
dev->dma_device = rxe_dma_device(rxe);
|
||||
dev->local_dma_lkey = 0;
|
||||
dev->node_guid = rxe->ifc_ops->node_guid(rxe);
|
||||
dev->node_guid = rxe_node_guid(rxe);
|
||||
dev->dma_ops = &rxe_dma_mapping_ops;
|
||||
|
||||
dev->uverbs_abi_ver = RXE_UVERBS_ABI_VERSION;
|
||||
|
||||
@@ -373,26 +373,6 @@ struct rxe_port {
|
||||
u32 qp_gsi_index;
|
||||
};
|
||||
|
||||
/* callbacks from rdma_rxe to network interface layer */
|
||||
struct rxe_ifc_ops {
|
||||
void (*release)(struct rxe_dev *rxe);
|
||||
__be64 (*node_guid)(struct rxe_dev *rxe);
|
||||
__be64 (*port_guid)(struct rxe_dev *rxe);
|
||||
struct device *(*dma_device)(struct rxe_dev *rxe);
|
||||
int (*mcast_add)(struct rxe_dev *rxe, union ib_gid *mgid);
|
||||
int (*mcast_delete)(struct rxe_dev *rxe, union ib_gid *mgid);
|
||||
int (*prepare)(struct rxe_dev *rxe, struct rxe_pkt_info *pkt,
|
||||
struct sk_buff *skb, u32 *crc);
|
||||
int (*send)(struct rxe_dev *rxe, struct rxe_pkt_info *pkt,
|
||||
struct sk_buff *skb);
|
||||
int (*loopback)(struct sk_buff *skb);
|
||||
struct sk_buff *(*init_packet)(struct rxe_dev *rxe, struct rxe_av *av,
|
||||
int paylen, struct rxe_pkt_info *pkt);
|
||||
char *(*parent_name)(struct rxe_dev *rxe, unsigned int port_num);
|
||||
enum rdma_link_layer (*link_layer)(struct rxe_dev *rxe,
|
||||
unsigned int port_num);
|
||||
};
|
||||
|
||||
struct rxe_dev {
|
||||
struct ib_device ib_dev;
|
||||
struct ib_device_attr attr;
|
||||
@@ -401,8 +381,6 @@ struct rxe_dev {
|
||||
struct kref ref_cnt;
|
||||
struct mutex usdev_lock;
|
||||
|
||||
struct rxe_ifc_ops *ifc_ops;
|
||||
|
||||
struct net_device *ndev;
|
||||
|
||||
int xmit_errors;
|
||||
|
||||
@@ -552,6 +552,14 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5738"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Entroware Proteus */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Entroware"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Proteus"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "EL07R4"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
@@ -752,6 +760,14 @@ static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "33474HU"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Entroware Proteus */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Entroware"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Proteus"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "EL07R4"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
||||
@@ -377,6 +377,7 @@ static int cisco_ioctl(struct net_device *dev, struct ifreq *ifr)
|
||||
memcpy(&state(hdlc)->settings, &new_settings, size);
|
||||
spin_lock_init(&state(hdlc)->lock);
|
||||
dev->header_ops = &cisco_header_ops;
|
||||
dev->hard_header_len = sizeof(struct hdlc_header);
|
||||
dev->type = ARPHRD_CISCO;
|
||||
call_netdevice_notifiers(NETDEV_POST_TYPE_CHANGE, dev);
|
||||
netif_dormant_on(dev);
|
||||
|
||||
@@ -213,6 +213,8 @@ static void lapbeth_data_transmit(struct net_device *ndev, struct sk_buff *skb)
|
||||
|
||||
skb->dev = dev = lapbeth->ethdev;
|
||||
|
||||
skb_reset_network_header(skb);
|
||||
|
||||
dev_hard_header(skb, dev, ETH_P_DEC, bcast_addr, NULL, 0);
|
||||
|
||||
dev_queue_xmit(skb);
|
||||
@@ -343,6 +345,7 @@ static int lapbeth_new_device(struct net_device *dev)
|
||||
*/
|
||||
ndev->needed_headroom = -1 + 3 + 2 + dev->hard_header_len
|
||||
+ dev->needed_headroom;
|
||||
ndev->needed_tailroom = dev->needed_tailroom;
|
||||
|
||||
lapbeth = netdev_priv(ndev);
|
||||
lapbeth->axdev = ndev;
|
||||
|
||||
@@ -981,7 +981,7 @@ static int st95hf_in_send_cmd(struct nfc_digital_dev *ddev,
|
||||
rc = down_killable(&stcontext->exchange_lock);
|
||||
if (rc) {
|
||||
WARN(1, "Semaphore is not found up in st95hf_in_send_cmd\n");
|
||||
return rc;
|
||||
goto free_skb_resp;
|
||||
}
|
||||
|
||||
rc = st95hf_spi_send(&stcontext->spicontext, skb->data,
|
||||
|
||||
@@ -25,7 +25,7 @@ config RAPIDIO_ENABLE_RX_TX_PORTS
|
||||
config RAPIDIO_DMA_ENGINE
|
||||
bool "DMA Engine support for RapidIO"
|
||||
depends on RAPIDIO
|
||||
select DMADEVICES
|
||||
depends on DMADEVICES
|
||||
select DMA_ENGINE
|
||||
help
|
||||
Say Y here if you want to use DMA Engine frameork for RapidIO data
|
||||
|
||||
@@ -1191,7 +1191,7 @@ static int set_consumer_device_supply(struct regulator_dev *rdev,
|
||||
const char *consumer_dev_name,
|
||||
const char *supply)
|
||||
{
|
||||
struct regulator_map *node;
|
||||
struct regulator_map *node, *new_node;
|
||||
int has_dev;
|
||||
|
||||
if (supply == NULL)
|
||||
@@ -1202,6 +1202,22 @@ static int set_consumer_device_supply(struct regulator_dev *rdev,
|
||||
else
|
||||
has_dev = 0;
|
||||
|
||||
new_node = kzalloc(sizeof(struct regulator_map), GFP_KERNEL);
|
||||
if (new_node == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
new_node->regulator = rdev;
|
||||
new_node->supply = supply;
|
||||
|
||||
if (has_dev) {
|
||||
new_node->dev_name = kstrdup(consumer_dev_name, GFP_KERNEL);
|
||||
if (new_node->dev_name == NULL) {
|
||||
kfree(new_node);
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
mutex_lock(®ulator_list_mutex);
|
||||
list_for_each_entry(node, ®ulator_map_list, list) {
|
||||
if (node->dev_name && consumer_dev_name) {
|
||||
if (strcmp(node->dev_name, consumer_dev_name) != 0)
|
||||
@@ -1219,26 +1235,19 @@ static int set_consumer_device_supply(struct regulator_dev *rdev,
|
||||
node->regulator->desc->name,
|
||||
supply,
|
||||
dev_name(&rdev->dev), rdev_get_name(rdev));
|
||||
return -EBUSY;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
node = kzalloc(sizeof(struct regulator_map), GFP_KERNEL);
|
||||
if (node == NULL)
|
||||
return -ENOMEM;
|
||||
list_add(&new_node->list, ®ulator_map_list);
|
||||
mutex_unlock(®ulator_list_mutex);
|
||||
|
||||
node->regulator = rdev;
|
||||
node->supply = supply;
|
||||
|
||||
if (has_dev) {
|
||||
node->dev_name = kstrdup(consumer_dev_name, GFP_KERNEL);
|
||||
if (node->dev_name == NULL) {
|
||||
kfree(node);
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
list_add(&node->list, ®ulator_map_list);
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
mutex_unlock(®ulator_list_mutex);
|
||||
kfree(new_node->dev_name);
|
||||
kfree(new_node);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
static void unset_regulator_supplies(struct regulator_dev *rdev)
|
||||
@@ -4034,19 +4043,16 @@ regulator_register(const struct regulator_desc *regulator_desc,
|
||||
|
||||
/* add consumers devices */
|
||||
if (init_data) {
|
||||
mutex_lock(®ulator_list_mutex);
|
||||
for (i = 0; i < init_data->num_consumer_supplies; i++) {
|
||||
ret = set_consumer_device_supply(rdev,
|
||||
init_data->consumer_supplies[i].dev_name,
|
||||
init_data->consumer_supplies[i].supply);
|
||||
if (ret < 0) {
|
||||
mutex_unlock(®ulator_list_mutex);
|
||||
dev_err(dev, "Failed to set supply %s\n",
|
||||
init_data->consumer_supplies[i].supply);
|
||||
goto unset_supplies;
|
||||
}
|
||||
}
|
||||
mutex_unlock(®ulator_list_mutex);
|
||||
}
|
||||
|
||||
if (!rdev->desc->ops->get_voltage &&
|
||||
|
||||
@@ -227,7 +227,10 @@ static unsigned int sas_ata_qc_issue(struct ata_queued_cmd *qc)
|
||||
task->num_scatter = si;
|
||||
}
|
||||
|
||||
task->data_dir = qc->dma_dir;
|
||||
if (qc->tf.protocol == ATA_PROT_NODATA)
|
||||
task->data_dir = DMA_NONE;
|
||||
else
|
||||
task->data_dir = qc->dma_dir;
|
||||
task->scatter = qc->sg;
|
||||
task->ata_task.retry_count = 1;
|
||||
task->task_state_flags = SAS_TASK_STATE_PENDING;
|
||||
|
||||
@@ -3865,7 +3865,9 @@ lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
out:
|
||||
if (ndlp && NLP_CHK_NODE_ACT(ndlp) && shost) {
|
||||
spin_lock_irq(shost->host_lock);
|
||||
ndlp->nlp_flag &= ~(NLP_ACC_REGLOGIN | NLP_RM_DFLT_RPI);
|
||||
if (mbox)
|
||||
ndlp->nlp_flag &= ~NLP_ACC_REGLOGIN;
|
||||
ndlp->nlp_flag &= ~NLP_RM_DFLT_RPI;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
|
||||
/* If the node is not being used by another discovery thread,
|
||||
|
||||
@@ -795,7 +795,7 @@ pm8001_exec_internal_task_abort(struct pm8001_hba_info *pm8001_ha,
|
||||
|
||||
res = pm8001_tag_alloc(pm8001_ha, &ccb_tag);
|
||||
if (res)
|
||||
return res;
|
||||
goto ex_err;
|
||||
ccb = &pm8001_ha->ccb_info[ccb_tag];
|
||||
ccb->device = pm8001_dev;
|
||||
ccb->ccb_tag = ccb_tag;
|
||||
|
||||
@@ -74,7 +74,7 @@ static struct spi_test spi_tests[] = {
|
||||
{
|
||||
.description = "tx/rx-transfer - crossing PAGE_SIZE",
|
||||
.fill_option = FILL_COUNT_8,
|
||||
.iterate_len = { ITERATE_MAX_LEN },
|
||||
.iterate_len = { ITERATE_LEN },
|
||||
.iterate_tx_align = ITERATE_ALIGN,
|
||||
.iterate_rx_align = ITERATE_ALIGN,
|
||||
.transfers = {
|
||||
|
||||
@@ -462,6 +462,15 @@ static int gbcodec_mixer_dapm_ctl_put(struct snd_kcontrol *kcontrol,
|
||||
val = ucontrol->value.integer.value[0] & mask;
|
||||
connect = !!val;
|
||||
|
||||
ret = gb_pm_runtime_get_sync(bundle);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = gb_audio_gb_get_control(module->mgmt_connection, data->ctl_id,
|
||||
GB_AUDIO_INVALID_INDEX, &gbvalue);
|
||||
if (ret)
|
||||
goto exit;
|
||||
|
||||
/* update ucontrol */
|
||||
if (gbvalue.value.integer_value[0] != val) {
|
||||
for (wi = 0; wi < wlist->num_widgets; wi++) {
|
||||
@@ -475,25 +484,17 @@ static int gbcodec_mixer_dapm_ctl_put(struct snd_kcontrol *kcontrol,
|
||||
gbvalue.value.integer_value[0] =
|
||||
ucontrol->value.integer.value[0];
|
||||
|
||||
ret = gb_pm_runtime_get_sync(bundle);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = gb_audio_gb_set_control(module->mgmt_connection,
|
||||
data->ctl_id,
|
||||
GB_AUDIO_INVALID_INDEX, &gbvalue);
|
||||
|
||||
gb_pm_runtime_put_autosuspend(bundle);
|
||||
|
||||
if (ret) {
|
||||
dev_err_ratelimited(codec->dev,
|
||||
"%d:Error in %s for %s\n", ret,
|
||||
__func__, kcontrol->id.name);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
exit:
|
||||
gb_pm_runtime_put_autosuspend(bundle);
|
||||
if (ret)
|
||||
dev_err_ratelimited(codec_dev, "%d:Error in %s for %s\n", ret,
|
||||
__func__, kcontrol->id.name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define SOC_DAPM_MIXER_GB(xname, kcount, data) \
|
||||
|
||||
@@ -523,13 +523,8 @@ static void hfa384x_usb_defer(struct work_struct *data)
|
||||
----------------------------------------------------------------*/
|
||||
void hfa384x_create(struct hfa384x *hw, struct usb_device *usb)
|
||||
{
|
||||
memset(hw, 0, sizeof(struct hfa384x));
|
||||
hw->usb = usb;
|
||||
|
||||
/* set up the endpoints */
|
||||
hw->endp_in = usb_rcvbulkpipe(usb, 1);
|
||||
hw->endp_out = usb_sndbulkpipe(usb, 2);
|
||||
|
||||
/* Set up the waitq */
|
||||
init_waitqueue_head(&hw->cmdq);
|
||||
|
||||
|
||||
@@ -60,23 +60,14 @@ static int prism2sta_probe_usb(struct usb_interface *interface,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
struct usb_device *dev;
|
||||
const struct usb_endpoint_descriptor *epd;
|
||||
const struct usb_host_interface *iface_desc = interface->cur_altsetting;
|
||||
struct usb_endpoint_descriptor *bulk_in, *bulk_out;
|
||||
struct usb_host_interface *iface_desc = interface->cur_altsetting;
|
||||
struct wlandevice *wlandev = NULL;
|
||||
struct hfa384x *hw = NULL;
|
||||
int result = 0;
|
||||
|
||||
if (iface_desc->desc.bNumEndpoints != 2) {
|
||||
result = -ENODEV;
|
||||
goto failed;
|
||||
}
|
||||
|
||||
result = -EINVAL;
|
||||
epd = &iface_desc->endpoint[1].desc;
|
||||
if (!usb_endpoint_is_bulk_in(epd))
|
||||
goto failed;
|
||||
epd = &iface_desc->endpoint[2].desc;
|
||||
if (!usb_endpoint_is_bulk_out(epd))
|
||||
result = usb_find_common_endpoints(iface_desc, &bulk_in, &bulk_out, NULL, NULL);
|
||||
if (result)
|
||||
goto failed;
|
||||
|
||||
dev = interface_to_usbdev(interface);
|
||||
@@ -95,6 +86,8 @@ static int prism2sta_probe_usb(struct usb_interface *interface,
|
||||
}
|
||||
|
||||
/* Initialize the hw data */
|
||||
hw->endp_in = usb_rcvbulkpipe(dev, bulk_in->bEndpointAddress);
|
||||
hw->endp_out = usb_sndbulkpipe(dev, bulk_out->bEndpointAddress);
|
||||
hfa384x_create(hw, dev);
|
||||
hw->wlandev = wlandev;
|
||||
|
||||
|
||||
@@ -1396,14 +1396,27 @@ static u32 iscsit_do_crypto_hash_sg(
|
||||
sg = cmd->first_data_sg;
|
||||
page_off = cmd->first_data_sg_off;
|
||||
|
||||
if (data_length && page_off) {
|
||||
struct scatterlist first_sg;
|
||||
u32 len = min_t(u32, data_length, sg->length - page_off);
|
||||
|
||||
sg_init_table(&first_sg, 1);
|
||||
sg_set_page(&first_sg, sg_page(sg), len, sg->offset + page_off);
|
||||
|
||||
ahash_request_set_crypt(hash, &first_sg, NULL, len);
|
||||
crypto_ahash_update(hash);
|
||||
|
||||
data_length -= len;
|
||||
sg = sg_next(sg);
|
||||
}
|
||||
|
||||
while (data_length) {
|
||||
u32 cur_len = min_t(u32, data_length, (sg->length - page_off));
|
||||
u32 cur_len = min_t(u32, data_length, sg->length);
|
||||
|
||||
ahash_request_set_crypt(hash, sg, NULL, cur_len);
|
||||
crypto_ahash_update(hash);
|
||||
|
||||
data_length -= cur_len;
|
||||
page_off = 0;
|
||||
/* iscsit_map_iovec has already checked for invalid sg pointers */
|
||||
sg = sg_next(sg);
|
||||
}
|
||||
|
||||
@@ -1150,7 +1150,7 @@ iscsit_conn_set_transport(struct iscsi_conn *conn, struct iscsit_transport *t)
|
||||
}
|
||||
|
||||
void iscsi_target_login_sess_out(struct iscsi_conn *conn,
|
||||
struct iscsi_np *np, bool zero_tsih, bool new_sess)
|
||||
bool zero_tsih, bool new_sess)
|
||||
{
|
||||
if (!new_sess)
|
||||
goto old_sess_out;
|
||||
@@ -1172,7 +1172,6 @@ void iscsi_target_login_sess_out(struct iscsi_conn *conn,
|
||||
conn->sess = NULL;
|
||||
|
||||
old_sess_out:
|
||||
iscsi_stop_login_thread_timer(np);
|
||||
/*
|
||||
* If login negotiation fails check if the Time2Retain timer
|
||||
* needs to be restarted.
|
||||
@@ -1432,8 +1431,9 @@ static int __iscsi_target_login_thread(struct iscsi_np *np)
|
||||
new_sess_out:
|
||||
new_sess = true;
|
||||
old_sess_out:
|
||||
iscsi_stop_login_thread_timer(np);
|
||||
tpg_np = conn->tpg_np;
|
||||
iscsi_target_login_sess_out(conn, np, zero_tsih, new_sess);
|
||||
iscsi_target_login_sess_out(conn, zero_tsih, new_sess);
|
||||
new_sess = false;
|
||||
|
||||
if (tpg) {
|
||||
|
||||
@@ -14,8 +14,7 @@ extern int iscsit_put_login_tx(struct iscsi_conn *, struct iscsi_login *, u32);
|
||||
extern void iscsit_free_conn(struct iscsi_np *, struct iscsi_conn *);
|
||||
extern int iscsit_start_kthreads(struct iscsi_conn *);
|
||||
extern void iscsi_post_login_handler(struct iscsi_np *, struct iscsi_conn *, u8);
|
||||
extern void iscsi_target_login_sess_out(struct iscsi_conn *, struct iscsi_np *,
|
||||
bool, bool);
|
||||
extern void iscsi_target_login_sess_out(struct iscsi_conn *, bool, bool);
|
||||
extern int iscsi_target_login_thread(void *);
|
||||
|
||||
#endif /*** ISCSI_TARGET_LOGIN_H ***/
|
||||
|
||||
@@ -548,12 +548,11 @@ static bool iscsi_target_sk_check_and_clear(struct iscsi_conn *conn, unsigned in
|
||||
|
||||
static void iscsi_target_login_drop(struct iscsi_conn *conn, struct iscsi_login *login)
|
||||
{
|
||||
struct iscsi_np *np = login->np;
|
||||
bool zero_tsih = login->zero_tsih;
|
||||
|
||||
iscsi_remove_failed_auth_entry(conn);
|
||||
iscsi_target_nego_release(conn);
|
||||
iscsi_target_login_sess_out(conn, np, zero_tsih, true);
|
||||
iscsi_target_login_sess_out(conn, zero_tsih, true);
|
||||
}
|
||||
|
||||
static void iscsi_target_login_timeout(unsigned long data)
|
||||
|
||||
@@ -5709,6 +5709,17 @@ static struct pci_device_id serial_pci_tbl[] = {
|
||||
0,
|
||||
0, pbn_exar_XR17V358 },
|
||||
|
||||
/*
|
||||
* Realtek RealManage
|
||||
*/
|
||||
{ PCI_VENDOR_ID_REALTEK, 0x816a,
|
||||
PCI_ANY_ID, PCI_ANY_ID,
|
||||
0, 0, pbn_b0_1_115200 },
|
||||
|
||||
{ PCI_VENDOR_ID_REALTEK, 0x816b,
|
||||
PCI_ANY_ID, PCI_ANY_ID,
|
||||
0, 0, pbn_b0_1_115200 },
|
||||
|
||||
/* Fintek PCI serial cards */
|
||||
{ PCI_DEVICE(0x1c29, 0x1104), .driver_data = pbn_fintek_4 },
|
||||
{ PCI_DEVICE(0x1c29, 0x1108), .driver_data = pbn_fintek_8 },
|
||||
|
||||
@@ -840,6 +840,11 @@ static ssize_t usblp_read(struct file *file, char __user *buffer, size_t len, lo
|
||||
if (rv < 0)
|
||||
return rv;
|
||||
|
||||
if (!usblp->present) {
|
||||
count = -ENODEV;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if ((avail = usblp->rstatus) < 0) {
|
||||
printk(KERN_ERR "usblp%d: error %d reading from printer\n",
|
||||
usblp->minor, (int)avail);
|
||||
|
||||
@@ -1156,6 +1156,34 @@ void usb_disable_interface(struct usb_device *dev, struct usb_interface *intf,
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* usb_disable_device_endpoints -- Disable all endpoints for a device
|
||||
* @dev: the device whose endpoints are being disabled
|
||||
* @skip_ep0: 0 to disable endpoint 0, 1 to skip it.
|
||||
*/
|
||||
static void usb_disable_device_endpoints(struct usb_device *dev, int skip_ep0)
|
||||
{
|
||||
struct usb_hcd *hcd = bus_to_hcd(dev->bus);
|
||||
int i;
|
||||
|
||||
if (hcd->driver->check_bandwidth) {
|
||||
/* First pass: Cancel URBs, leave endpoint pointers intact. */
|
||||
for (i = skip_ep0; i < 16; ++i) {
|
||||
usb_disable_endpoint(dev, i, false);
|
||||
usb_disable_endpoint(dev, i + USB_DIR_IN, false);
|
||||
}
|
||||
/* Remove endpoints from the host controller internal state */
|
||||
mutex_lock(hcd->bandwidth_mutex);
|
||||
usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL);
|
||||
mutex_unlock(hcd->bandwidth_mutex);
|
||||
}
|
||||
/* Second pass: remove endpoint pointers */
|
||||
for (i = skip_ep0; i < 16; ++i) {
|
||||
usb_disable_endpoint(dev, i, true);
|
||||
usb_disable_endpoint(dev, i + USB_DIR_IN, true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* usb_disable_device - Disable all the endpoints for a USB device
|
||||
* @dev: the device whose endpoints are being disabled
|
||||
@@ -1169,7 +1197,6 @@ void usb_disable_interface(struct usb_device *dev, struct usb_interface *intf,
|
||||
void usb_disable_device(struct usb_device *dev, int skip_ep0)
|
||||
{
|
||||
int i;
|
||||
struct usb_hcd *hcd = bus_to_hcd(dev->bus);
|
||||
|
||||
/* getting rid of interfaces will disconnect
|
||||
* any drivers bound to them (a key side effect)
|
||||
@@ -1215,22 +1242,8 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0)
|
||||
|
||||
dev_dbg(&dev->dev, "%s nuking %s URBs\n", __func__,
|
||||
skip_ep0 ? "non-ep0" : "all");
|
||||
if (hcd->driver->check_bandwidth) {
|
||||
/* First pass: Cancel URBs, leave endpoint pointers intact. */
|
||||
for (i = skip_ep0; i < 16; ++i) {
|
||||
usb_disable_endpoint(dev, i, false);
|
||||
usb_disable_endpoint(dev, i + USB_DIR_IN, false);
|
||||
}
|
||||
/* Remove endpoints from the host controller internal state */
|
||||
mutex_lock(hcd->bandwidth_mutex);
|
||||
usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL);
|
||||
mutex_unlock(hcd->bandwidth_mutex);
|
||||
/* Second pass: remove endpoint pointers */
|
||||
}
|
||||
for (i = skip_ep0; i < 16; ++i) {
|
||||
usb_disable_endpoint(dev, i, true);
|
||||
usb_disable_endpoint(dev, i + USB_DIR_IN, true);
|
||||
}
|
||||
|
||||
usb_disable_device_endpoints(dev, skip_ep0);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1473,6 +1486,9 @@ EXPORT_SYMBOL_GPL(usb_set_interface);
|
||||
* The caller must own the device lock.
|
||||
*
|
||||
* Return: Zero on success, else a negative error code.
|
||||
*
|
||||
* If this routine fails the device will probably be in an unusable state
|
||||
* with endpoints disabled, and interfaces only partially enabled.
|
||||
*/
|
||||
int usb_reset_configuration(struct usb_device *dev)
|
||||
{
|
||||
@@ -1488,10 +1504,7 @@ int usb_reset_configuration(struct usb_device *dev)
|
||||
* calls during probe() are fine
|
||||
*/
|
||||
|
||||
for (i = 1; i < 16; ++i) {
|
||||
usb_disable_endpoint(dev, i, true);
|
||||
usb_disable_endpoint(dev, i + USB_DIR_IN, true);
|
||||
}
|
||||
usb_disable_device_endpoints(dev, 1); /* skip ep0*/
|
||||
|
||||
config = dev->actconfig;
|
||||
retval = 0;
|
||||
@@ -1504,34 +1517,10 @@ int usb_reset_configuration(struct usb_device *dev)
|
||||
mutex_unlock(hcd->bandwidth_mutex);
|
||||
return -ENOMEM;
|
||||
}
|
||||
/* Make sure we have enough bandwidth for each alternate setting 0 */
|
||||
for (i = 0; i < config->desc.bNumInterfaces; i++) {
|
||||
struct usb_interface *intf = config->interface[i];
|
||||
struct usb_host_interface *alt;
|
||||
|
||||
alt = usb_altnum_to_altsetting(intf, 0);
|
||||
if (!alt)
|
||||
alt = &intf->altsetting[0];
|
||||
if (alt != intf->cur_altsetting)
|
||||
retval = usb_hcd_alloc_bandwidth(dev, NULL,
|
||||
intf->cur_altsetting, alt);
|
||||
if (retval < 0)
|
||||
break;
|
||||
}
|
||||
/* If not, reinstate the old alternate settings */
|
||||
/* xHCI adds all endpoints in usb_hcd_alloc_bandwidth */
|
||||
retval = usb_hcd_alloc_bandwidth(dev, config, NULL, NULL);
|
||||
if (retval < 0) {
|
||||
reset_old_alts:
|
||||
for (i--; i >= 0; i--) {
|
||||
struct usb_interface *intf = config->interface[i];
|
||||
struct usb_host_interface *alt;
|
||||
|
||||
alt = usb_altnum_to_altsetting(intf, 0);
|
||||
if (!alt)
|
||||
alt = &intf->altsetting[0];
|
||||
if (alt != intf->cur_altsetting)
|
||||
usb_hcd_alloc_bandwidth(dev, NULL,
|
||||
alt, intf->cur_altsetting);
|
||||
}
|
||||
usb_enable_lpm(dev);
|
||||
mutex_unlock(hcd->bandwidth_mutex);
|
||||
return retval;
|
||||
@@ -1540,8 +1529,12 @@ reset_old_alts:
|
||||
USB_REQ_SET_CONFIGURATION, 0,
|
||||
config->desc.bConfigurationValue, 0,
|
||||
NULL, 0, USB_CTRL_SET_TIMEOUT);
|
||||
if (retval < 0)
|
||||
goto reset_old_alts;
|
||||
if (retval < 0) {
|
||||
usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL);
|
||||
usb_enable_lpm(dev);
|
||||
mutex_unlock(hcd->bandwidth_mutex);
|
||||
return retval;
|
||||
}
|
||||
mutex_unlock(hcd->bandwidth_mutex);
|
||||
|
||||
/* re-init hc/hcd interface/endpoint state */
|
||||
|
||||
@@ -236,6 +236,10 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||
/* Generic RTL8153 based ethernet adapters */
|
||||
{ USB_DEVICE(0x0bda, 0x8153), .driver_info = USB_QUIRK_NO_LPM },
|
||||
|
||||
/* SONiX USB DEVICE Touchpad */
|
||||
{ USB_DEVICE(0x0c45, 0x7056), .driver_info =
|
||||
USB_QUIRK_IGNORE_REMOTE_WAKEUP },
|
||||
|
||||
/* Action Semiconductor flash disk */
|
||||
{ USB_DEVICE(0x10d6, 0x2200), .driver_info =
|
||||
USB_QUIRK_STRING_FETCH_255 },
|
||||
|
||||
@@ -848,7 +848,11 @@ read_descriptors(struct file *filp, struct kobject *kobj,
|
||||
size_t srclen, n;
|
||||
int cfgno;
|
||||
void *src;
|
||||
int retval;
|
||||
|
||||
retval = usb_lock_device_interruptible(udev);
|
||||
if (retval < 0)
|
||||
return -EINTR;
|
||||
/* The binary attribute begins with the device descriptor.
|
||||
* Following that are the raw descriptor entries for all the
|
||||
* configurations (config plus subsidiary descriptors).
|
||||
@@ -873,6 +877,7 @@ read_descriptors(struct file *filp, struct kobject *kobj,
|
||||
off -= srclen;
|
||||
}
|
||||
}
|
||||
usb_unlock_device(udev);
|
||||
return count - nleft;
|
||||
}
|
||||
|
||||
|
||||
@@ -72,6 +72,89 @@ MODULE_PARM_DESC(autosuspend, "default autosuspend delay");
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* usb_find_common_endpoints() -- look up common endpoint descriptors
|
||||
* @alt: alternate setting to search
|
||||
* @bulk_in: pointer to descriptor pointer, or NULL
|
||||
* @bulk_out: pointer to descriptor pointer, or NULL
|
||||
* @int_in: pointer to descriptor pointer, or NULL
|
||||
* @int_out: pointer to descriptor pointer, or NULL
|
||||
*
|
||||
* Search the alternate setting's endpoint descriptors for the first bulk-in,
|
||||
* bulk-out, interrupt-in and interrupt-out endpoints and return them in the
|
||||
* provided pointers (unless they are NULL).
|
||||
*
|
||||
* If a requested endpoint is not found, the corresponding pointer is set to
|
||||
* NULL.
|
||||
*
|
||||
* Return: Zero if all requested descriptors were found, or -ENXIO otherwise.
|
||||
*/
|
||||
int usb_find_common_endpoints(struct usb_host_interface *alt,
|
||||
struct usb_endpoint_descriptor **bulk_in,
|
||||
struct usb_endpoint_descriptor **bulk_out,
|
||||
struct usb_endpoint_descriptor **int_in,
|
||||
struct usb_endpoint_descriptor **int_out)
|
||||
{
|
||||
struct usb_endpoint_descriptor *epd;
|
||||
int i;
|
||||
|
||||
if (bulk_in)
|
||||
*bulk_in = NULL;
|
||||
if (bulk_out)
|
||||
*bulk_out = NULL;
|
||||
if (int_in)
|
||||
*int_in = NULL;
|
||||
if (int_out)
|
||||
*int_out = NULL;
|
||||
|
||||
for (i = 0; i < alt->desc.bNumEndpoints; ++i) {
|
||||
epd = &alt->endpoint[i].desc;
|
||||
|
||||
switch (usb_endpoint_type(epd)) {
|
||||
case USB_ENDPOINT_XFER_BULK:
|
||||
if (usb_endpoint_dir_in(epd)) {
|
||||
if (bulk_in && !*bulk_in) {
|
||||
*bulk_in = epd;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (bulk_out && !*bulk_out) {
|
||||
*bulk_out = epd;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
continue;
|
||||
case USB_ENDPOINT_XFER_INT:
|
||||
if (usb_endpoint_dir_in(epd)) {
|
||||
if (int_in && !*int_in) {
|
||||
*int_in = epd;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (int_out && !*int_out) {
|
||||
*int_out = epd;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
continue;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((!bulk_in || *bulk_in) &&
|
||||
(!bulk_out || *bulk_out) &&
|
||||
(!int_in || *int_in) &&
|
||||
(!int_out || *int_out)) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return -ENXIO;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(usb_find_common_endpoints);
|
||||
|
||||
/**
|
||||
* usb_find_alt_setting() - Given a configuration, find the alternate setting
|
||||
* for the given interface.
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/usb/hcd.h>
|
||||
#include <linux/usb/otg.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/debugfs.h>
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
*/
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
#include <linux/usb/otg.h>
|
||||
|
||||
#define PORT_WAKE_BITS (PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E)
|
||||
|
||||
|
||||
@@ -708,6 +708,7 @@ static const struct usb_device_id id_table_combined[] = {
|
||||
{ USB_DEVICE(XSENS_VID, XSENS_AWINDA_STATION_PID) },
|
||||
{ USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) },
|
||||
{ USB_DEVICE(XSENS_VID, XSENS_MTDEVBOARD_PID) },
|
||||
{ USB_DEVICE(XSENS_VID, XSENS_MTIUSBCONVERTER_PID) },
|
||||
{ USB_DEVICE(XSENS_VID, XSENS_MTW_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_OMNI1509) },
|
||||
{ USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
#define XSENS_AWINDA_DONGLE_PID 0x0102
|
||||
#define XSENS_MTW_PID 0x0200 /* Xsens MTw */
|
||||
#define XSENS_MTDEVBOARD_PID 0x0300 /* Motion Tracker Development Board */
|
||||
#define XSENS_MTIUSBCONVERTER_PID 0x0301 /* MTi USB converter */
|
||||
#define XSENS_CONVERTER_PID 0xD00D /* Xsens USB-serial converter */
|
||||
|
||||
/* Xsens devices using FTDI VID */
|
||||
|
||||
@@ -1808,6 +1808,8 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE_INTERFACE_CLASS(0x1e0e, 0x9003, 0xff) }, /* Simcom SIM7500/SIM7600 MBIM mode */
|
||||
{ USB_DEVICE_INTERFACE_CLASS(0x1e0e, 0x9011, 0xff), /* Simcom SIM7500/SIM7600 RNDIS mode */
|
||||
.driver_info = RSVD(7) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(0x1e0e, 0x9205, 0xff) }, /* Simcom SIM7070/SIM7080/SIM7090 AT+ECM mode */
|
||||
{ USB_DEVICE_INTERFACE_CLASS(0x1e0e, 0x9206, 0xff) }, /* Simcom SIM7070/SIM7080/SIM7090 AT-only mode */
|
||||
{ USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S_X200),
|
||||
.driver_info = NCTRL(0) | NCTRL(1) | RSVD(4) },
|
||||
{ USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X220_X500D),
|
||||
|
||||
@@ -670,8 +670,7 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd,
|
||||
if (devinfo->resetting) {
|
||||
cmnd->result = DID_ERROR << 16;
|
||||
cmnd->scsi_done(cmnd);
|
||||
spin_unlock_irqrestore(&devinfo->lock, flags);
|
||||
return 0;
|
||||
goto zombie;
|
||||
}
|
||||
|
||||
/* Find a free uas-tag */
|
||||
@@ -706,6 +705,16 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd,
|
||||
cmdinfo->state &= ~(SUBMIT_DATA_IN_URB | SUBMIT_DATA_OUT_URB);
|
||||
|
||||
err = uas_submit_urbs(cmnd, devinfo);
|
||||
/*
|
||||
* in case of fatal errors the SCSI layer is peculiar
|
||||
* a command that has finished is a success for the purpose
|
||||
* of queueing, no matter how fatal the error
|
||||
*/
|
||||
if (err == -ENODEV) {
|
||||
cmnd->result = DID_ERROR << 16;
|
||||
cmnd->scsi_done(cmnd);
|
||||
goto zombie;
|
||||
}
|
||||
if (err) {
|
||||
/* If we did nothing, give up now */
|
||||
if (cmdinfo->state & SUBMIT_STATUS_URB) {
|
||||
@@ -716,6 +725,7 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd,
|
||||
}
|
||||
|
||||
devinfo->cmnd[idx] = cmnd;
|
||||
zombie:
|
||||
spin_unlock_irqrestore(&devinfo->lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -22,31 +22,6 @@ config VGA_CONSOLE
|
||||
|
||||
Say Y.
|
||||
|
||||
config VGACON_SOFT_SCROLLBACK
|
||||
bool "Enable Scrollback Buffer in System RAM"
|
||||
depends on VGA_CONSOLE
|
||||
default n
|
||||
help
|
||||
The scrollback buffer of the standard VGA console is located in
|
||||
the VGA RAM. The size of this RAM is fixed and is quite small.
|
||||
If you require a larger scrollback buffer, this can be placed in
|
||||
System RAM which is dynamically allocated during initialization.
|
||||
Placing the scrollback buffer in System RAM will slightly slow
|
||||
down the console.
|
||||
|
||||
If you want this feature, say 'Y' here and enter the amount of
|
||||
RAM to allocate for this buffer. If unsure, say 'N'.
|
||||
|
||||
config VGACON_SOFT_SCROLLBACK_SIZE
|
||||
int "Scrollback Buffer Size (in KB)"
|
||||
depends on VGACON_SOFT_SCROLLBACK
|
||||
range 1 1024
|
||||
default "64"
|
||||
help
|
||||
Enter the amount of System RAM to allocate for the scrollback
|
||||
buffer. Each 64KB will give you approximately 16 80x25
|
||||
screenfuls of scrollback buffer
|
||||
|
||||
config MDA_CONSOLE
|
||||
depends on !M68K && !PARISC && ISA
|
||||
tristate "MDA text console (dual-headed)"
|
||||
|
||||
@@ -234,7 +234,7 @@ static void bit_clear_margins(struct vc_data *vc, struct fb_info *info,
|
||||
}
|
||||
|
||||
static void bit_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
int softback_lines, int fg, int bg)
|
||||
int fg, int bg)
|
||||
{
|
||||
struct fb_cursor cursor;
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
@@ -247,15 +247,6 @@ static void bit_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
|
||||
cursor.set = 0;
|
||||
|
||||
if (softback_lines) {
|
||||
if (y + softback_lines >= vc->vc_rows) {
|
||||
mode = CM_ERASE;
|
||||
ops->cursor_flash = 0;
|
||||
return;
|
||||
} else
|
||||
y += softback_lines;
|
||||
}
|
||||
|
||||
c = scr_readw((u16 *) vc->vc_pos);
|
||||
attribute = get_attribute(info, c);
|
||||
src = vc->vc_font.data + ((c & charmask) * (w * vc->vc_font.height));
|
||||
|
||||
@@ -101,12 +101,6 @@ static int logo_lines;
|
||||
/* logo_shown is an index to vc_cons when >= 0; otherwise follows FBCON_LOGO
|
||||
enums. */
|
||||
static int logo_shown = FBCON_LOGO_CANSHOW;
|
||||
/* Software scrollback */
|
||||
static int fbcon_softback_size = 32768;
|
||||
static unsigned long softback_buf, softback_curr;
|
||||
static unsigned long softback_in;
|
||||
static unsigned long softback_top, softback_end;
|
||||
static int softback_lines;
|
||||
/* console mappings */
|
||||
static int first_fb_vc;
|
||||
static int last_fb_vc = MAX_NR_CONSOLES - 1;
|
||||
@@ -140,8 +134,6 @@ static int fbcon_has_sysfs;
|
||||
|
||||
static const struct consw fb_con;
|
||||
|
||||
#define CM_SOFTBACK (8)
|
||||
|
||||
#define advance_row(p, delta) (unsigned short *)((unsigned long)(p) + (delta) * vc->vc_size_row)
|
||||
|
||||
static int fbcon_set_origin(struct vc_data *);
|
||||
@@ -349,18 +341,6 @@ static int get_color(struct vc_data *vc, struct fb_info *info,
|
||||
return color;
|
||||
}
|
||||
|
||||
static void fbcon_update_softback(struct vc_data *vc)
|
||||
{
|
||||
int l = fbcon_softback_size / vc->vc_size_row;
|
||||
|
||||
if (l > 5)
|
||||
softback_end = softback_buf + l * vc->vc_size_row;
|
||||
else
|
||||
/* Smaller scrollback makes no sense, and 0 would screw
|
||||
the operation totally */
|
||||
softback_top = 0;
|
||||
}
|
||||
|
||||
static void fb_flashcursor(struct work_struct *work)
|
||||
{
|
||||
struct fb_info *info = container_of(work, struct fb_info, queue);
|
||||
@@ -390,7 +370,7 @@ static void fb_flashcursor(struct work_struct *work)
|
||||
c = scr_readw((u16 *) vc->vc_pos);
|
||||
mode = (!ops->cursor_flash || ops->cursor_state.enable) ?
|
||||
CM_ERASE : CM_DRAW;
|
||||
ops->cursor(vc, info, mode, softback_lines, get_color(vc, info, c, 1),
|
||||
ops->cursor(vc, info, mode, get_color(vc, info, c, 1),
|
||||
get_color(vc, info, c, 0));
|
||||
console_unlock();
|
||||
}
|
||||
@@ -450,13 +430,7 @@ static int __init fb_console_setup(char *this_opt)
|
||||
}
|
||||
|
||||
if (!strncmp(options, "scrollback:", 11)) {
|
||||
options += 11;
|
||||
if (*options) {
|
||||
fbcon_softback_size = simple_strtoul(options, &options, 0);
|
||||
if (*options == 'k' || *options == 'K') {
|
||||
fbcon_softback_size *= 1024;
|
||||
}
|
||||
}
|
||||
pr_warn("Ignoring scrollback size option\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -961,31 +935,6 @@ static const char *fbcon_startup(void)
|
||||
p->con_rotate = initial_rotation;
|
||||
set_blitting_type(vc, info);
|
||||
|
||||
if (info->fix.type != FB_TYPE_TEXT) {
|
||||
if (fbcon_softback_size) {
|
||||
if (!softback_buf) {
|
||||
softback_buf =
|
||||
(unsigned long)
|
||||
kmalloc(fbcon_softback_size,
|
||||
GFP_KERNEL);
|
||||
if (!softback_buf) {
|
||||
fbcon_softback_size = 0;
|
||||
softback_top = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (softback_buf) {
|
||||
kfree((void *) softback_buf);
|
||||
softback_buf = 0;
|
||||
softback_top = 0;
|
||||
}
|
||||
}
|
||||
if (softback_buf)
|
||||
softback_in = softback_top = softback_curr =
|
||||
softback_buf;
|
||||
softback_lines = 0;
|
||||
}
|
||||
|
||||
/* Setup default font */
|
||||
if (!p->fontdata && !vc->vc_font.data) {
|
||||
if (!fontname[0] || !(font = find_font(fontname)))
|
||||
@@ -1148,9 +1097,6 @@ static void fbcon_init(struct vc_data *vc, int init)
|
||||
if (logo)
|
||||
fbcon_prepare_logo(vc, info, cols, rows, new_cols, new_rows);
|
||||
|
||||
if (vc == svc && softback_buf)
|
||||
fbcon_update_softback(vc);
|
||||
|
||||
if (ops->rotate_font && ops->rotate_font(info, vc)) {
|
||||
ops->rotate = FB_ROTATE_UR;
|
||||
set_blitting_type(vc, info);
|
||||
@@ -1310,7 +1256,6 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
|
||||
{
|
||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
int y;
|
||||
int c = scr_readw((u16 *) vc->vc_pos);
|
||||
|
||||
ops->cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms);
|
||||
@@ -1324,16 +1269,8 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
|
||||
fbcon_add_cursor_timer(info);
|
||||
|
||||
ops->cursor_flash = (mode == CM_ERASE) ? 0 : 1;
|
||||
if (mode & CM_SOFTBACK) {
|
||||
mode &= ~CM_SOFTBACK;
|
||||
y = softback_lines;
|
||||
} else {
|
||||
if (softback_lines)
|
||||
fbcon_set_origin(vc);
|
||||
y = 0;
|
||||
}
|
||||
|
||||
ops->cursor(vc, info, mode, y, get_color(vc, info, c, 1),
|
||||
ops->cursor(vc, info, mode, get_color(vc, info, c, 1),
|
||||
get_color(vc, info, c, 0));
|
||||
}
|
||||
|
||||
@@ -1404,8 +1341,6 @@ static void fbcon_set_disp(struct fb_info *info, struct fb_var_screeninfo *var,
|
||||
|
||||
if (con_is_visible(vc)) {
|
||||
update_screen(vc);
|
||||
if (softback_buf)
|
||||
fbcon_update_softback(vc);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1543,99 +1478,6 @@ static __inline__ void ypan_down_redraw(struct vc_data *vc, int t, int count)
|
||||
scrollback_current = 0;
|
||||
}
|
||||
|
||||
static void fbcon_redraw_softback(struct vc_data *vc, struct display *p,
|
||||
long delta)
|
||||
{
|
||||
int count = vc->vc_rows;
|
||||
unsigned short *d, *s;
|
||||
unsigned long n;
|
||||
int line = 0;
|
||||
|
||||
d = (u16 *) softback_curr;
|
||||
if (d == (u16 *) softback_in)
|
||||
d = (u16 *) vc->vc_origin;
|
||||
n = softback_curr + delta * vc->vc_size_row;
|
||||
softback_lines -= delta;
|
||||
if (delta < 0) {
|
||||
if (softback_curr < softback_top && n < softback_buf) {
|
||||
n += softback_end - softback_buf;
|
||||
if (n < softback_top) {
|
||||
softback_lines -=
|
||||
(softback_top - n) / vc->vc_size_row;
|
||||
n = softback_top;
|
||||
}
|
||||
} else if (softback_curr >= softback_top
|
||||
&& n < softback_top) {
|
||||
softback_lines -=
|
||||
(softback_top - n) / vc->vc_size_row;
|
||||
n = softback_top;
|
||||
}
|
||||
} else {
|
||||
if (softback_curr > softback_in && n >= softback_end) {
|
||||
n += softback_buf - softback_end;
|
||||
if (n > softback_in) {
|
||||
n = softback_in;
|
||||
softback_lines = 0;
|
||||
}
|
||||
} else if (softback_curr <= softback_in && n > softback_in) {
|
||||
n = softback_in;
|
||||
softback_lines = 0;
|
||||
}
|
||||
}
|
||||
if (n == softback_curr)
|
||||
return;
|
||||
softback_curr = n;
|
||||
s = (u16 *) softback_curr;
|
||||
if (s == (u16 *) softback_in)
|
||||
s = (u16 *) vc->vc_origin;
|
||||
while (count--) {
|
||||
unsigned short *start;
|
||||
unsigned short *le;
|
||||
unsigned short c;
|
||||
int x = 0;
|
||||
unsigned short attr = 1;
|
||||
|
||||
start = s;
|
||||
le = advance_row(s, 1);
|
||||
do {
|
||||
c = scr_readw(s);
|
||||
if (attr != (c & 0xff00)) {
|
||||
attr = c & 0xff00;
|
||||
if (s > start) {
|
||||
fbcon_putcs(vc, start, s - start,
|
||||
line, x);
|
||||
x += s - start;
|
||||
start = s;
|
||||
}
|
||||
}
|
||||
if (c == scr_readw(d)) {
|
||||
if (s > start) {
|
||||
fbcon_putcs(vc, start, s - start,
|
||||
line, x);
|
||||
x += s - start + 1;
|
||||
start = s + 1;
|
||||
} else {
|
||||
x++;
|
||||
start++;
|
||||
}
|
||||
}
|
||||
s++;
|
||||
d++;
|
||||
} while (s < le);
|
||||
if (s > start)
|
||||
fbcon_putcs(vc, start, s - start, line, x);
|
||||
line++;
|
||||
if (d == (u16 *) softback_end)
|
||||
d = (u16 *) softback_buf;
|
||||
if (d == (u16 *) softback_in)
|
||||
d = (u16 *) vc->vc_origin;
|
||||
if (s == (u16 *) softback_end)
|
||||
s = (u16 *) softback_buf;
|
||||
if (s == (u16 *) softback_in)
|
||||
s = (u16 *) vc->vc_origin;
|
||||
}
|
||||
}
|
||||
|
||||
static void fbcon_redraw_move(struct vc_data *vc, struct display *p,
|
||||
int line, int count, int dy)
|
||||
{
|
||||
@@ -1775,31 +1617,6 @@ static void fbcon_redraw(struct vc_data *vc, struct display *p,
|
||||
}
|
||||
}
|
||||
|
||||
static inline void fbcon_softback_note(struct vc_data *vc, int t,
|
||||
int count)
|
||||
{
|
||||
unsigned short *p;
|
||||
|
||||
if (vc->vc_num != fg_console)
|
||||
return;
|
||||
p = (unsigned short *) (vc->vc_origin + t * vc->vc_size_row);
|
||||
|
||||
while (count) {
|
||||
scr_memcpyw((u16 *) softback_in, p, vc->vc_size_row);
|
||||
count--;
|
||||
p = advance_row(p, 1);
|
||||
softback_in += vc->vc_size_row;
|
||||
if (softback_in == softback_end)
|
||||
softback_in = softback_buf;
|
||||
if (softback_in == softback_top) {
|
||||
softback_top += vc->vc_size_row;
|
||||
if (softback_top == softback_end)
|
||||
softback_top = softback_buf;
|
||||
}
|
||||
}
|
||||
softback_curr = softback_in;
|
||||
}
|
||||
|
||||
static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
|
||||
int count)
|
||||
{
|
||||
@@ -1822,8 +1639,6 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
|
||||
case SM_UP:
|
||||
if (count > vc->vc_rows) /* Maximum realistic size */
|
||||
count = vc->vc_rows;
|
||||
if (softback_top)
|
||||
fbcon_softback_note(vc, t, count);
|
||||
if (logo_shown >= 0)
|
||||
goto redraw_up;
|
||||
switch (p->scrollmode) {
|
||||
@@ -2128,7 +1943,7 @@ static int fbcon_resize(struct vc_data *vc, unsigned int width,
|
||||
struct fb_var_screeninfo var = info->var;
|
||||
int x_diff, y_diff, virt_w, virt_h, virt_fw, virt_fh;
|
||||
|
||||
if (ops->p && ops->p->userfont && FNTSIZE(vc->vc_font.data)) {
|
||||
if (p->userfont && FNTSIZE(vc->vc_font.data)) {
|
||||
int size;
|
||||
int pitch = PITCH(vc->vc_font.width);
|
||||
|
||||
@@ -2194,14 +2009,6 @@ static int fbcon_switch(struct vc_data *vc)
|
||||
info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
ops = info->fbcon_par;
|
||||
|
||||
if (softback_top) {
|
||||
if (softback_lines)
|
||||
fbcon_set_origin(vc);
|
||||
softback_top = softback_curr = softback_in = softback_buf;
|
||||
softback_lines = 0;
|
||||
fbcon_update_softback(vc);
|
||||
}
|
||||
|
||||
if (logo_shown >= 0) {
|
||||
struct vc_data *conp2 = vc_cons[logo_shown].d;
|
||||
|
||||
@@ -2535,9 +2342,6 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
|
||||
int cnt;
|
||||
char *old_data = NULL;
|
||||
|
||||
if (con_is_visible(vc) && softback_lines)
|
||||
fbcon_set_origin(vc);
|
||||
|
||||
resize = (w != vc->vc_font.width) || (h != vc->vc_font.height);
|
||||
if (p->userfont)
|
||||
old_data = vc->vc_font.data;
|
||||
@@ -2563,8 +2367,6 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
|
||||
cols /= w;
|
||||
rows /= h;
|
||||
vc_resize(vc, cols, rows);
|
||||
if (con_is_visible(vc) && softback_buf)
|
||||
fbcon_update_softback(vc);
|
||||
} else if (con_is_visible(vc)
|
||||
&& vc->vc_mode == KD_TEXT) {
|
||||
fbcon_clear_margins(vc, 0);
|
||||
@@ -2722,19 +2524,7 @@ static void fbcon_set_palette(struct vc_data *vc, const unsigned char *table)
|
||||
|
||||
static u16 *fbcon_screen_pos(struct vc_data *vc, int offset)
|
||||
{
|
||||
unsigned long p;
|
||||
int line;
|
||||
|
||||
if (vc->vc_num != fg_console || !softback_lines)
|
||||
return (u16 *) (vc->vc_origin + offset);
|
||||
line = offset / vc->vc_size_row;
|
||||
if (line >= softback_lines)
|
||||
return (u16 *) (vc->vc_origin + offset -
|
||||
softback_lines * vc->vc_size_row);
|
||||
p = softback_curr + offset;
|
||||
if (p >= softback_end)
|
||||
p += softback_buf - softback_end;
|
||||
return (u16 *) p;
|
||||
return (u16 *) (vc->vc_origin + offset);
|
||||
}
|
||||
|
||||
static unsigned long fbcon_getxy(struct vc_data *vc, unsigned long pos,
|
||||
@@ -2748,22 +2538,7 @@ static unsigned long fbcon_getxy(struct vc_data *vc, unsigned long pos,
|
||||
|
||||
x = offset % vc->vc_cols;
|
||||
y = offset / vc->vc_cols;
|
||||
if (vc->vc_num == fg_console)
|
||||
y += softback_lines;
|
||||
ret = pos + (vc->vc_cols - x) * 2;
|
||||
} else if (vc->vc_num == fg_console && softback_lines) {
|
||||
unsigned long offset = pos - softback_curr;
|
||||
|
||||
if (pos < softback_curr)
|
||||
offset += softback_end - softback_buf;
|
||||
offset /= 2;
|
||||
x = offset % vc->vc_cols;
|
||||
y = offset / vc->vc_cols;
|
||||
ret = pos + (vc->vc_cols - x) * 2;
|
||||
if (ret == softback_end)
|
||||
ret = softback_buf;
|
||||
if (ret == softback_in)
|
||||
ret = vc->vc_origin;
|
||||
} else {
|
||||
/* Should not happen */
|
||||
x = y = 0;
|
||||
@@ -2791,106 +2566,11 @@ static void fbcon_invert_region(struct vc_data *vc, u16 * p, int cnt)
|
||||
a = ((a) & 0x88ff) | (((a) & 0x7000) >> 4) |
|
||||
(((a) & 0x0700) << 4);
|
||||
scr_writew(a, p++);
|
||||
if (p == (u16 *) softback_end)
|
||||
p = (u16 *) softback_buf;
|
||||
if (p == (u16 *) softback_in)
|
||||
p = (u16 *) vc->vc_origin;
|
||||
}
|
||||
}
|
||||
|
||||
static void fbcon_scrolldelta(struct vc_data *vc, int lines)
|
||||
{
|
||||
struct fb_info *info = registered_fb[con2fb_map[fg_console]];
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
struct display *disp = &fb_display[fg_console];
|
||||
int offset, limit, scrollback_old;
|
||||
|
||||
if (softback_top) {
|
||||
if (vc->vc_num != fg_console)
|
||||
return;
|
||||
if (vc->vc_mode != KD_TEXT || !lines)
|
||||
return;
|
||||
if (logo_shown >= 0) {
|
||||
struct vc_data *conp2 = vc_cons[logo_shown].d;
|
||||
|
||||
if (conp2->vc_top == logo_lines
|
||||
&& conp2->vc_bottom == conp2->vc_rows)
|
||||
conp2->vc_top = 0;
|
||||
if (logo_shown == vc->vc_num) {
|
||||
unsigned long p, q;
|
||||
int i;
|
||||
|
||||
p = softback_in;
|
||||
q = vc->vc_origin +
|
||||
logo_lines * vc->vc_size_row;
|
||||
for (i = 0; i < logo_lines; i++) {
|
||||
if (p == softback_top)
|
||||
break;
|
||||
if (p == softback_buf)
|
||||
p = softback_end;
|
||||
p -= vc->vc_size_row;
|
||||
q -= vc->vc_size_row;
|
||||
scr_memcpyw((u16 *) q, (u16 *) p,
|
||||
vc->vc_size_row);
|
||||
}
|
||||
softback_in = softback_curr = p;
|
||||
update_region(vc, vc->vc_origin,
|
||||
logo_lines * vc->vc_cols);
|
||||
}
|
||||
logo_shown = FBCON_LOGO_CANSHOW;
|
||||
}
|
||||
fbcon_cursor(vc, CM_ERASE | CM_SOFTBACK);
|
||||
fbcon_redraw_softback(vc, disp, lines);
|
||||
fbcon_cursor(vc, CM_DRAW | CM_SOFTBACK);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!scrollback_phys_max)
|
||||
return;
|
||||
|
||||
scrollback_old = scrollback_current;
|
||||
scrollback_current -= lines;
|
||||
if (scrollback_current < 0)
|
||||
scrollback_current = 0;
|
||||
else if (scrollback_current > scrollback_max)
|
||||
scrollback_current = scrollback_max;
|
||||
if (scrollback_current == scrollback_old)
|
||||
return;
|
||||
|
||||
if (fbcon_is_inactive(vc, info))
|
||||
return;
|
||||
|
||||
fbcon_cursor(vc, CM_ERASE);
|
||||
|
||||
offset = disp->yscroll - scrollback_current;
|
||||
limit = disp->vrows;
|
||||
switch (disp->scrollmode) {
|
||||
case SCROLL_WRAP_MOVE:
|
||||
info->var.vmode |= FB_VMODE_YWRAP;
|
||||
break;
|
||||
case SCROLL_PAN_MOVE:
|
||||
case SCROLL_PAN_REDRAW:
|
||||
limit -= vc->vc_rows;
|
||||
info->var.vmode &= ~FB_VMODE_YWRAP;
|
||||
break;
|
||||
}
|
||||
if (offset < 0)
|
||||
offset += limit;
|
||||
else if (offset >= limit)
|
||||
offset -= limit;
|
||||
|
||||
ops->var.xoffset = 0;
|
||||
ops->var.yoffset = offset * vc->vc_font.height;
|
||||
ops->update_start(info);
|
||||
|
||||
if (!scrollback_current)
|
||||
fbcon_cursor(vc, CM_DRAW);
|
||||
}
|
||||
|
||||
static int fbcon_set_origin(struct vc_data *vc)
|
||||
{
|
||||
if (softback_lines)
|
||||
fbcon_scrolldelta(vc, softback_lines);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2954,8 +2634,6 @@ static void fbcon_modechanged(struct fb_info *info)
|
||||
|
||||
fbcon_set_palette(vc, color_table);
|
||||
update_screen(vc);
|
||||
if (softback_buf)
|
||||
fbcon_update_softback(vc);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3375,7 +3053,6 @@ static const struct consw fb_con = {
|
||||
.con_font_default = fbcon_set_def_font,
|
||||
.con_font_copy = fbcon_copy_font,
|
||||
.con_set_palette = fbcon_set_palette,
|
||||
.con_scrolldelta = fbcon_scrolldelta,
|
||||
.con_set_origin = fbcon_set_origin,
|
||||
.con_invert_region = fbcon_invert_region,
|
||||
.con_screen_pos = fbcon_screen_pos,
|
||||
@@ -3584,9 +3261,6 @@ static void fbcon_exit(void)
|
||||
if (fbcon_has_exited)
|
||||
return;
|
||||
|
||||
kfree((void *)softback_buf);
|
||||
softback_buf = 0UL;
|
||||
|
||||
for (i = 0; i < FB_MAX; i++) {
|
||||
int pending = 0;
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ struct fbcon_ops {
|
||||
void (*clear_margins)(struct vc_data *vc, struct fb_info *info,
|
||||
int bottom_only);
|
||||
void (*cursor)(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
int softback_lines, int fg, int bg);
|
||||
int fg, int bg);
|
||||
int (*update_start)(struct fb_info *info);
|
||||
int (*rotate_font)(struct fb_info *info, struct vc_data *vc);
|
||||
struct fb_var_screeninfo var; /* copy of the current fb_var_screeninfo */
|
||||
|
||||
@@ -219,7 +219,7 @@ static void ccw_clear_margins(struct vc_data *vc, struct fb_info *info,
|
||||
}
|
||||
|
||||
static void ccw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
int softback_lines, int fg, int bg)
|
||||
int fg, int bg)
|
||||
{
|
||||
struct fb_cursor cursor;
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
@@ -236,15 +236,6 @@ static void ccw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
|
||||
cursor.set = 0;
|
||||
|
||||
if (softback_lines) {
|
||||
if (y + softback_lines >= vc->vc_rows) {
|
||||
mode = CM_ERASE;
|
||||
ops->cursor_flash = 0;
|
||||
return;
|
||||
} else
|
||||
y += softback_lines;
|
||||
}
|
||||
|
||||
c = scr_readw((u16 *) vc->vc_pos);
|
||||
attribute = get_attribute(info, c);
|
||||
src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.width));
|
||||
|
||||
@@ -202,7 +202,7 @@ static void cw_clear_margins(struct vc_data *vc, struct fb_info *info,
|
||||
}
|
||||
|
||||
static void cw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
int softback_lines, int fg, int bg)
|
||||
int fg, int bg)
|
||||
{
|
||||
struct fb_cursor cursor;
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
@@ -219,15 +219,6 @@ static void cw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
|
||||
cursor.set = 0;
|
||||
|
||||
if (softback_lines) {
|
||||
if (y + softback_lines >= vc->vc_rows) {
|
||||
mode = CM_ERASE;
|
||||
ops->cursor_flash = 0;
|
||||
return;
|
||||
} else
|
||||
y += softback_lines;
|
||||
}
|
||||
|
||||
c = scr_readw((u16 *) vc->vc_pos);
|
||||
attribute = get_attribute(info, c);
|
||||
src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.width));
|
||||
|
||||
@@ -249,7 +249,7 @@ static void ud_clear_margins(struct vc_data *vc, struct fb_info *info,
|
||||
}
|
||||
|
||||
static void ud_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
int softback_lines, int fg, int bg)
|
||||
int fg, int bg)
|
||||
{
|
||||
struct fb_cursor cursor;
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
@@ -267,15 +267,6 @@ static void ud_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
|
||||
cursor.set = 0;
|
||||
|
||||
if (softback_lines) {
|
||||
if (y + softback_lines >= vc->vc_rows) {
|
||||
mode = CM_ERASE;
|
||||
ops->cursor_flash = 0;
|
||||
return;
|
||||
} else
|
||||
y += softback_lines;
|
||||
}
|
||||
|
||||
c = scr_readw((u16 *) vc->vc_pos);
|
||||
attribute = get_attribute(info, c);
|
||||
src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.height));
|
||||
|
||||
@@ -80,7 +80,7 @@ static void tile_clear_margins(struct vc_data *vc, struct fb_info *info,
|
||||
}
|
||||
|
||||
static void tile_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
int softback_lines, int fg, int bg)
|
||||
int fg, int bg)
|
||||
{
|
||||
struct fb_tilecursor cursor;
|
||||
int use_sw = (vc->vc_cursor_type & 0x10);
|
||||
|
||||
@@ -179,157 +179,6 @@ static inline void vga_set_mem_top(struct vc_data *c)
|
||||
write_vga(12, (c->vc_visible_origin - vga_vram_base) / 2);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_VGACON_SOFT_SCROLLBACK
|
||||
/* software scrollback */
|
||||
static void *vgacon_scrollback;
|
||||
static int vgacon_scrollback_tail;
|
||||
static int vgacon_scrollback_size;
|
||||
static int vgacon_scrollback_rows;
|
||||
static int vgacon_scrollback_cnt;
|
||||
static int vgacon_scrollback_cur;
|
||||
static int vgacon_scrollback_save;
|
||||
static int vgacon_scrollback_restore;
|
||||
|
||||
static void vgacon_scrollback_init(int pitch)
|
||||
{
|
||||
int rows = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024/pitch;
|
||||
|
||||
if (vgacon_scrollback) {
|
||||
vgacon_scrollback_cnt = 0;
|
||||
vgacon_scrollback_tail = 0;
|
||||
vgacon_scrollback_cur = 0;
|
||||
vgacon_scrollback_rows = rows - 1;
|
||||
vgacon_scrollback_size = rows * pitch;
|
||||
}
|
||||
}
|
||||
|
||||
static void vgacon_scrollback_startup(void)
|
||||
{
|
||||
vgacon_scrollback = kcalloc(CONFIG_VGACON_SOFT_SCROLLBACK_SIZE, 1024, GFP_NOWAIT);
|
||||
vgacon_scrollback_init(vga_video_num_columns * 2);
|
||||
}
|
||||
|
||||
static void vgacon_scrollback_update(struct vc_data *c, int t, int count)
|
||||
{
|
||||
void *p;
|
||||
|
||||
if (!vgacon_scrollback_size || c->vc_num != fg_console)
|
||||
return;
|
||||
|
||||
p = (void *) (c->vc_origin + t * c->vc_size_row);
|
||||
|
||||
while (count--) {
|
||||
if ((vgacon_scrollback_tail + c->vc_size_row) >
|
||||
vgacon_scrollback_size)
|
||||
vgacon_scrollback_tail = 0;
|
||||
|
||||
scr_memcpyw(vgacon_scrollback + vgacon_scrollback_tail,
|
||||
p, c->vc_size_row);
|
||||
vgacon_scrollback_cnt++;
|
||||
p += c->vc_size_row;
|
||||
vgacon_scrollback_tail += c->vc_size_row;
|
||||
|
||||
if (vgacon_scrollback_tail >= vgacon_scrollback_size)
|
||||
vgacon_scrollback_tail = 0;
|
||||
|
||||
if (vgacon_scrollback_cnt > vgacon_scrollback_rows)
|
||||
vgacon_scrollback_cnt = vgacon_scrollback_rows;
|
||||
|
||||
vgacon_scrollback_cur = vgacon_scrollback_cnt;
|
||||
}
|
||||
}
|
||||
|
||||
static void vgacon_restore_screen(struct vc_data *c)
|
||||
{
|
||||
vgacon_scrollback_save = 0;
|
||||
|
||||
if (!vga_is_gfx && !vgacon_scrollback_restore) {
|
||||
scr_memcpyw((u16 *) c->vc_origin, (u16 *) c->vc_screenbuf,
|
||||
c->vc_screenbuf_size > vga_vram_size ?
|
||||
vga_vram_size : c->vc_screenbuf_size);
|
||||
vgacon_scrollback_restore = 1;
|
||||
vgacon_scrollback_cur = vgacon_scrollback_cnt;
|
||||
}
|
||||
}
|
||||
|
||||
static void vgacon_scrolldelta(struct vc_data *c, int lines)
|
||||
{
|
||||
int start, end, count, soff;
|
||||
|
||||
if (!lines) {
|
||||
c->vc_visible_origin = c->vc_origin;
|
||||
vga_set_mem_top(c);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!vgacon_scrollback)
|
||||
return;
|
||||
|
||||
if (!vgacon_scrollback_save) {
|
||||
vgacon_cursor(c, CM_ERASE);
|
||||
vgacon_save_screen(c);
|
||||
vgacon_scrollback_save = 1;
|
||||
}
|
||||
|
||||
vgacon_scrollback_restore = 0;
|
||||
start = vgacon_scrollback_cur + lines;
|
||||
end = start + abs(lines);
|
||||
|
||||
if (start < 0)
|
||||
start = 0;
|
||||
|
||||
if (start > vgacon_scrollback_cnt)
|
||||
start = vgacon_scrollback_cnt;
|
||||
|
||||
if (end < 0)
|
||||
end = 0;
|
||||
|
||||
if (end > vgacon_scrollback_cnt)
|
||||
end = vgacon_scrollback_cnt;
|
||||
|
||||
vgacon_scrollback_cur = start;
|
||||
count = end - start;
|
||||
soff = vgacon_scrollback_tail - ((vgacon_scrollback_cnt - end) *
|
||||
c->vc_size_row);
|
||||
soff -= count * c->vc_size_row;
|
||||
|
||||
if (soff < 0)
|
||||
soff += vgacon_scrollback_size;
|
||||
|
||||
count = vgacon_scrollback_cnt - start;
|
||||
|
||||
if (count > c->vc_rows)
|
||||
count = c->vc_rows;
|
||||
|
||||
if (count) {
|
||||
int copysize;
|
||||
|
||||
int diff = c->vc_rows - count;
|
||||
void *d = (void *) c->vc_origin;
|
||||
void *s = (void *) c->vc_screenbuf;
|
||||
|
||||
count *= c->vc_size_row;
|
||||
/* how much memory to end of buffer left? */
|
||||
copysize = min(count, vgacon_scrollback_size - soff);
|
||||
scr_memcpyw(d, vgacon_scrollback + soff, copysize);
|
||||
d += copysize;
|
||||
count -= copysize;
|
||||
|
||||
if (count) {
|
||||
scr_memcpyw(d, vgacon_scrollback, count);
|
||||
d += count;
|
||||
}
|
||||
|
||||
if (diff)
|
||||
scr_memcpyw(d, s, diff * c->vc_size_row);
|
||||
} else
|
||||
vgacon_cursor(c, CM_MOVE);
|
||||
}
|
||||
#else
|
||||
#define vgacon_scrollback_startup(...) do { } while (0)
|
||||
#define vgacon_scrollback_init(...) do { } while (0)
|
||||
#define vgacon_scrollback_update(...) do { } while (0)
|
||||
|
||||
static void vgacon_restore_screen(struct vc_data *c)
|
||||
{
|
||||
if (c->vc_origin != c->vc_visible_origin)
|
||||
@@ -365,7 +214,6 @@ static void vgacon_scrolldelta(struct vc_data *c, int lines)
|
||||
}
|
||||
vga_set_mem_top(c);
|
||||
}
|
||||
#endif /* CONFIG_VGACON_SOFT_SCROLLBACK */
|
||||
|
||||
static const char *vgacon_startup(void)
|
||||
{
|
||||
@@ -562,10 +410,7 @@ static const char *vgacon_startup(void)
|
||||
vgacon_xres = screen_info.orig_video_cols * VGA_FONTWIDTH;
|
||||
vgacon_yres = vga_scan_lines;
|
||||
|
||||
if (!vga_init_done) {
|
||||
vgacon_scrollback_startup();
|
||||
vga_init_done = 1;
|
||||
}
|
||||
vga_init_done = 1;
|
||||
|
||||
return display_desc;
|
||||
}
|
||||
@@ -861,7 +706,6 @@ static int vgacon_switch(struct vc_data *c)
|
||||
vgacon_doresize(c, c->vc_cols, c->vc_rows);
|
||||
}
|
||||
|
||||
vgacon_scrollback_init(c->vc_size_row);
|
||||
return 0; /* Redrawing not needed */
|
||||
}
|
||||
|
||||
@@ -1391,7 +1235,6 @@ static int vgacon_scroll(struct vc_data *c, int t, int b, int dir,
|
||||
oldo = c->vc_origin;
|
||||
delta = lines * c->vc_size_row;
|
||||
if (dir == SM_UP) {
|
||||
vgacon_scrollback_update(c, t, lines);
|
||||
if (c->vc_scr_end + delta >= vga_vram_end) {
|
||||
scr_memcpyw((u16 *) vga_vram_base,
|
||||
(u16 *) (oldo + delta),
|
||||
|
||||
@@ -1122,7 +1122,7 @@ static void vga_8planes_imageblit(struct fb_info *info, const struct fb_image *i
|
||||
char oldop = setop(0);
|
||||
char oldsr = setsr(0);
|
||||
char oldmask = selectmask();
|
||||
const char *cdat = image->data;
|
||||
const unsigned char *cdat = image->data;
|
||||
u32 dx = image->dx;
|
||||
char __iomem *where;
|
||||
int y;
|
||||
|
||||
@@ -2151,7 +2151,8 @@ static noinline int search_ioctl(struct inode *inode,
|
||||
key.offset = sk->min_offset;
|
||||
|
||||
while (1) {
|
||||
ret = fault_in_pages_writeable(ubuf, *buf_size - sk_offset);
|
||||
ret = fault_in_pages_writeable(ubuf + sk_offset,
|
||||
*buf_size - sk_offset);
|
||||
if (ret)
|
||||
break;
|
||||
|
||||
|
||||
@@ -6527,7 +6527,12 @@ int nfs4_lock_delegation_recall(struct file_lock *fl, struct nfs4_state *state,
|
||||
err = nfs4_set_lock_state(state, fl);
|
||||
if (err != 0)
|
||||
return err;
|
||||
err = _nfs4_do_setlk(state, F_SETLK, fl, NFS_LOCK_NEW);
|
||||
do {
|
||||
err = _nfs4_do_setlk(state, F_SETLK, fl, NFS_LOCK_NEW);
|
||||
if (err != -NFS4ERR_DELAY)
|
||||
break;
|
||||
ssleep(1);
|
||||
} while (err == -NFS4ERR_DELAY);
|
||||
return nfs4_handle_delegation_recall_error(server, state, stateid, fl, err);
|
||||
}
|
||||
|
||||
|
||||
@@ -520,8 +520,8 @@ xfs_attr_shortform_create(xfs_da_args_t *args)
|
||||
ASSERT(ifp->if_flags & XFS_IFINLINE);
|
||||
}
|
||||
xfs_idata_realloc(dp, sizeof(*hdr), XFS_ATTR_FORK);
|
||||
hdr = (xfs_attr_sf_hdr_t *)ifp->if_u1.if_data;
|
||||
hdr->count = 0;
|
||||
hdr = (struct xfs_attr_sf_hdr *)ifp->if_u1.if_data;
|
||||
memset(hdr, 0, sizeof(*hdr));
|
||||
hdr->totsize = cpu_to_be16(sizeof(*hdr));
|
||||
xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA);
|
||||
}
|
||||
|
||||
@@ -52,6 +52,20 @@
|
||||
#define I2C_PCA_CON_SI 0x08 /* Serial Interrupt */
|
||||
#define I2C_PCA_CON_CR 0x07 /* Clock Rate (MASK) */
|
||||
|
||||
/**
|
||||
* struct pca_i2c_bus_settings - The configured PCA i2c bus settings
|
||||
* @mode: Configured i2c bus mode
|
||||
* @tlow: Configured SCL LOW period
|
||||
* @thi: Configured SCL HIGH period
|
||||
* @clock_freq: The configured clock frequency
|
||||
*/
|
||||
struct pca_i2c_bus_settings {
|
||||
int mode;
|
||||
int tlow;
|
||||
int thi;
|
||||
int clock_freq;
|
||||
};
|
||||
|
||||
struct i2c_algo_pca_data {
|
||||
void *data; /* private low level data */
|
||||
void (*write_byte) (void *data, int reg, int val);
|
||||
@@ -63,6 +77,7 @@ struct i2c_algo_pca_data {
|
||||
* For PCA9665, use the frequency you want here. */
|
||||
unsigned int i2c_clock;
|
||||
unsigned int chip;
|
||||
struct pca_i2c_bus_settings bus_settings;
|
||||
};
|
||||
|
||||
int i2c_pca_add_bus(struct i2c_adapter *);
|
||||
|
||||
@@ -103,6 +103,41 @@ enum usb_interface_condition {
|
||||
USB_INTERFACE_UNBINDING,
|
||||
};
|
||||
|
||||
int __must_check
|
||||
usb_find_common_endpoints(struct usb_host_interface *alt,
|
||||
struct usb_endpoint_descriptor **bulk_in,
|
||||
struct usb_endpoint_descriptor **bulk_out,
|
||||
struct usb_endpoint_descriptor **int_in,
|
||||
struct usb_endpoint_descriptor **int_out);
|
||||
|
||||
static inline int __must_check
|
||||
usb_find_bulk_in_endpoint(struct usb_host_interface *alt,
|
||||
struct usb_endpoint_descriptor **bulk_in)
|
||||
{
|
||||
return usb_find_common_endpoints(alt, bulk_in, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
static inline int __must_check
|
||||
usb_find_bulk_out_endpoint(struct usb_host_interface *alt,
|
||||
struct usb_endpoint_descriptor **bulk_out)
|
||||
{
|
||||
return usb_find_common_endpoints(alt, NULL, bulk_out, NULL, NULL);
|
||||
}
|
||||
|
||||
static inline int __must_check
|
||||
usb_find_int_in_endpoint(struct usb_host_interface *alt,
|
||||
struct usb_endpoint_descriptor **int_in)
|
||||
{
|
||||
return usb_find_common_endpoints(alt, NULL, NULL, int_in, NULL);
|
||||
}
|
||||
|
||||
static inline int __must_check
|
||||
usb_find_int_out_endpoint(struct usb_host_interface *alt,
|
||||
struct usb_endpoint_descriptor **int_out)
|
||||
{
|
||||
return usb_find_common_endpoints(alt, NULL, NULL, NULL, int_out);
|
||||
}
|
||||
|
||||
/**
|
||||
* struct usb_interface - what usb device drivers talk to
|
||||
* @altsetting: array of interface structures, one for each alternate
|
||||
|
||||
@@ -45,6 +45,12 @@
|
||||
#define CTOP_INST_MOV2B_FLIP_R3_B1_B2_INST 0x5B60
|
||||
#define CTOP_INST_MOV2B_FLIP_R3_B1_B2_LIMM 0x00010422
|
||||
|
||||
#ifndef AUX_IENABLE
|
||||
#define AUX_IENABLE 0x40c
|
||||
#endif
|
||||
|
||||
#define CTOP_AUX_IACK (0xFFFFF800 + 0x088)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/* In order to increase compilation test coverage */
|
||||
|
||||
@@ -18,7 +18,9 @@
|
||||
#include <linux/vmalloc.h>
|
||||
#include "gcov.h"
|
||||
|
||||
#if (__GNUC__ >= 7)
|
||||
#if (__GNUC__ >= 10)
|
||||
#define GCOV_COUNTERS 8
|
||||
#elif (__GNUC__ >= 7)
|
||||
#define GCOV_COUNTERS 9
|
||||
#elif (__GNUC__ > 5) || (__GNUC__ == 5 && __GNUC_MINOR__ >= 1)
|
||||
#define GCOV_COUNTERS 10
|
||||
|
||||
@@ -4990,9 +4990,13 @@ static int pskb_carve_inside_nonlinear(struct sk_buff *skb, const u32 off,
|
||||
if (skb_has_frag_list(skb))
|
||||
skb_clone_fraglist(skb);
|
||||
|
||||
if (k == 0) {
|
||||
/* split line is in frag list */
|
||||
pskb_carve_frag_list(skb, shinfo, off - pos, gfp_mask);
|
||||
/* split line is in frag list */
|
||||
if (k == 0 && pskb_carve_frag_list(skb, shinfo, off - pos, gfp_mask)) {
|
||||
/* skb_frag_unref() is not needed here as shinfo->nr_frags = 0. */
|
||||
if (skb_has_frag_list(skb))
|
||||
kfree_skb_list(skb_shinfo(skb)->frag_list);
|
||||
kfree(data);
|
||||
return -ENOMEM;
|
||||
}
|
||||
skb_release_data(skb);
|
||||
|
||||
|
||||
@@ -975,8 +975,8 @@ static int rpcb_dec_getaddr(struct rpc_rqst *req, struct xdr_stream *xdr,
|
||||
p = xdr_inline_decode(xdr, len);
|
||||
if (unlikely(p == NULL))
|
||||
goto out_fail;
|
||||
dprintk("RPC: %5u RPCB_%s reply: %s\n", req->rq_task->tk_pid,
|
||||
req->rq_task->tk_msg.rpc_proc->p_name, (char *)p);
|
||||
dprintk("RPC: %5u RPCB_%s reply: %*pE\n", req->rq_task->tk_pid,
|
||||
req->rq_task->tk_msg.rpc_proc->p_name, len, (char *)p);
|
||||
|
||||
if (rpc_uaddr2sockaddr(req->rq_xprt->xprt_net, (char *)p, len,
|
||||
sap, sizeof(address)) == 0)
|
||||
|
||||
@@ -123,6 +123,8 @@ EXPORT_SYMBOL_GPL(snd_hdac_device_init);
|
||||
void snd_hdac_device_exit(struct hdac_device *codec)
|
||||
{
|
||||
pm_runtime_put_noidle(&codec->dev);
|
||||
/* keep balance of runtime PM child_count in parent device */
|
||||
pm_runtime_set_suspended(&codec->dev);
|
||||
snd_hdac_bus_remove_device(codec->bus, codec);
|
||||
kfree(codec->vendor_name);
|
||||
kfree(codec->chip_name);
|
||||
|
||||
@@ -3224,6 +3224,7 @@ static int tegra_hdmi_build_pcms(struct hda_codec *codec)
|
||||
|
||||
static int patch_tegra_hdmi(struct hda_codec *codec)
|
||||
{
|
||||
struct hdmi_spec *spec;
|
||||
int err;
|
||||
|
||||
err = patch_generic_hdmi(codec);
|
||||
@@ -3231,6 +3232,10 @@ static int patch_tegra_hdmi(struct hda_codec *codec)
|
||||
return err;
|
||||
|
||||
codec->patch_ops.build_pcms = tegra_hdmi_build_pcms;
|
||||
spec = codec->spec;
|
||||
spec->chmap.ops.chmap_cea_alloc_validate_get_type =
|
||||
nvhdmi_chmap_cea_alloc_validate_get_type;
|
||||
spec->chmap.ops.chmap_validate = nvhdmi_chmap_validate;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -169,6 +169,7 @@ int test__pmu(int subtest __maybe_unused)
|
||||
ret = 0;
|
||||
} while (0);
|
||||
|
||||
perf_pmu__del_formats(&formats);
|
||||
test_format_dir_put(format);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1018,6 +1018,17 @@ void perf_pmu__set_format(unsigned long *bits, long from, long to)
|
||||
set_bit(b, bits);
|
||||
}
|
||||
|
||||
void perf_pmu__del_formats(struct list_head *formats)
|
||||
{
|
||||
struct perf_pmu_format *fmt, *tmp;
|
||||
|
||||
list_for_each_entry_safe(fmt, tmp, formats, list) {
|
||||
list_del(&fmt->list);
|
||||
free(fmt->name);
|
||||
free(fmt);
|
||||
}
|
||||
}
|
||||
|
||||
static int sub_non_neg(int a, int b)
|
||||
{
|
||||
if (b > a)
|
||||
|
||||
@@ -71,6 +71,7 @@ int perf_pmu__new_format(struct list_head *list, char *name,
|
||||
int config, unsigned long *bits);
|
||||
void perf_pmu__set_format(unsigned long *bits, long from, long to);
|
||||
int perf_pmu__format_parse(char *dir, struct list_head *head);
|
||||
void perf_pmu__del_formats(struct list_head *formats);
|
||||
|
||||
struct perf_pmu *perf_pmu__scan(struct perf_pmu *pmu);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user