mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
Staging driver updates for 6.16-rc1
Here is the "big" set of staging driver changes for 6.16-rc1. Included
in here are:
- gpib driver cleanups and updates. This subsystem is _almost_ ready
to be merged into the main portion of the kernel tree. Hopefully
should happen in the next kernel merge cycle if all goes well.
- sm750fb driver cleanups
- rtl8723bs driver cleanups
- other small driver cleanups for coding style issues
All of these have been in for over 2 weeks with no reported issues
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-----BEGIN PGP SIGNATURE-----
iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCaEKofA8cZ3JlZ0Brcm9h
aC5jb20ACgkQMUfUDdst+ykn5ACg1H4WXygJwNZdW6rSQ3hafugGu8IAn2oYjAlS
CZG3iqSQ8q8l1Dl3peMj
=J8mr
-----END PGP SIGNATURE-----
Merge tag 'staging-6.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging
Pull staging driver updates from Greg KH:
"Here is the "big" set of staging driver changes for 6.16-rc1. Included
in here are:
- gpib driver cleanups and updates.
This subsystem is _almost_ ready to be merged into the main portion
of the kernel tree. Hopefully should happen in the next kernel
merge cycle if all goes well.
- sm750fb driver cleanups
- rtl8723bs driver cleanups
- other small driver cleanups for coding style issues
All of these have been in for over 2 weeks with no reported issues"
* tag 'staging-6.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: (203 commits)
staging: rtl8723bs: remove unnecessary braces for single statement blocks
staging: rtl8723bs: Removed multiple blank lines of rtw_pwrctrl.c
staging: sm750fb: rename `hw_sm750le_setBLANK`
staging: sm750fb: rename `hw_sm750_setBLANK`
staging: sm750fb: rename `hw_sm750_setColReg`
staging: sm750fb: rename `hw_sm750_crtc_setMode`
staging: sm750fb: rename `hw_sm750_crtc_checkMode`
staging: sm750fb: rename `hw_sm750_output_setMode`
staging: sm750fb: rename `hw_sm750le_deWait`
staging: sm750fb: rename `hw_sm750_deWait`
staging: sm750fb: rename `hw_sm750_initAccel`
staging: gpib: switch to kmalloc(sizeof(*status))
staging: gpib: Fix secondary address restriction
staging: gpib: Fix uapi include header guard name
staging: gpib: Avoid unused variable warning
staging: gpib: Declare driver entry points static
staging: gpib: Fix PCMCIA config identifier
staging: gpib: Avoid unused variable warnings
staging: gpib: Fix lpvo request_system_control
staging: sm750fb: rename sm750_hw_cursor_setData2
...
This commit is contained in:
commit
a100922a38
76 changed files with 1592 additions and 2612 deletions
|
|
@ -9147,9 +9147,10 @@ F: lib/fault-inject.c
|
|||
F: tools/testing/fault-injection/
|
||||
|
||||
FBTFT Framebuffer drivers
|
||||
M: Andy Shevchenko <andy@kernel.org>
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
L: linux-fbdev@vger.kernel.org
|
||||
S: Orphan
|
||||
S: Odd fixes
|
||||
F: drivers/staging/fbtft/
|
||||
|
||||
FC0011 TUNER DRIVER
|
||||
|
|
|
|||
|
|
@ -8,160 +8,136 @@ menuconfig FB_TFT
|
|||
select FB_BACKLIGHT
|
||||
select FB_SYSMEM_HELPERS_DEFERRED
|
||||
|
||||
if FB_TFT
|
||||
|
||||
config FB_TFT_AGM1264K_FL
|
||||
tristate "FB driver for the AGM1264K-FL LCD display"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Framebuffer support for the AGM1264K-FL LCD display (two Samsung KS0108 compatible chips)
|
||||
|
||||
config FB_TFT_BD663474
|
||||
tristate "FB driver for the BD663474 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for BD663474
|
||||
|
||||
config FB_TFT_HX8340BN
|
||||
tristate "FB driver for the HX8340BN LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for HX8340BN
|
||||
|
||||
config FB_TFT_HX8347D
|
||||
tristate "FB driver for the HX8347D LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for HX8347D
|
||||
|
||||
config FB_TFT_HX8353D
|
||||
tristate "FB driver for the HX8353D LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for HX8353D
|
||||
|
||||
config FB_TFT_HX8357D
|
||||
tristate "FB driver for the HX8357D LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for HX8357D
|
||||
|
||||
config FB_TFT_ILI9163
|
||||
tristate "FB driver for the ILI9163 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for ILI9163
|
||||
|
||||
config FB_TFT_ILI9320
|
||||
tristate "FB driver for the ILI9320 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for ILI9320
|
||||
|
||||
config FB_TFT_ILI9325
|
||||
tristate "FB driver for the ILI9325 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for ILI9325
|
||||
|
||||
config FB_TFT_ILI9340
|
||||
tristate "FB driver for the ILI9340 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for ILI9340
|
||||
|
||||
config FB_TFT_ILI9341
|
||||
tristate "FB driver for the ILI9341 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for ILI9341
|
||||
|
||||
config FB_TFT_ILI9481
|
||||
tristate "FB driver for the ILI9481 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for ILI9481
|
||||
|
||||
config FB_TFT_ILI9486
|
||||
tristate "FB driver for the ILI9486 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for ILI9486
|
||||
|
||||
config FB_TFT_PCD8544
|
||||
tristate "FB driver for the PCD8544 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for PCD8544
|
||||
|
||||
config FB_TFT_RA8875
|
||||
tristate "FB driver for the RA8875 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for RA8875
|
||||
|
||||
config FB_TFT_S6D02A1
|
||||
tristate "FB driver for the S6D02A1 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for S6D02A1
|
||||
|
||||
config FB_TFT_S6D1121
|
||||
tristate "FB driver for the S6D1211 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for S6D1121
|
||||
|
||||
config FB_TFT_SEPS525
|
||||
tristate "FB driver for the SEPS525 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for SEPS525
|
||||
Say Y if you have such a display that utilizes this controller.
|
||||
|
||||
config FB_TFT_SH1106
|
||||
tristate "FB driver for the SH1106 OLED Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Framebuffer support for SH1106
|
||||
|
||||
config FB_TFT_SSD1289
|
||||
tristate "FB driver for the SSD1289 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Framebuffer support for SSD1289
|
||||
|
||||
config FB_TFT_SSD1305
|
||||
tristate "FB driver for the SSD1305 OLED Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Framebuffer support for SSD1305
|
||||
|
||||
config FB_TFT_SSD1306
|
||||
tristate "FB driver for the SSD1306 OLED Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Framebuffer support for SSD1306
|
||||
|
||||
config FB_TFT_SSD1331
|
||||
tristate "FB driver for the SSD1331 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Framebuffer support for SSD1331
|
||||
|
||||
config FB_TFT_SSD1351
|
||||
tristate "FB driver for the SSD1351 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Framebuffer support for SSD1351
|
||||
|
||||
config FB_TFT_ST7735R
|
||||
tristate "FB driver for the ST7735R LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for ST7735R
|
||||
|
||||
config FB_TFT_ST7789V
|
||||
tristate "FB driver for the ST7789V LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
This enables generic framebuffer support for the Sitronix ST7789V
|
||||
display controller. The controller is intended for small color
|
||||
|
|
@ -171,30 +147,27 @@ config FB_TFT_ST7789V
|
|||
|
||||
config FB_TFT_TINYLCD
|
||||
tristate "FB driver for tinylcd.com display"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Custom Framebuffer support for tinylcd.com display
|
||||
|
||||
config FB_TFT_TLS8204
|
||||
tristate "FB driver for the TLS8204 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for TLS8204
|
||||
|
||||
config FB_TFT_UC1611
|
||||
tristate "FB driver for the UC1611 LCD controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for UC1611
|
||||
|
||||
config FB_TFT_UC1701
|
||||
tristate "FB driver for the UC1701 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for UC1701
|
||||
|
||||
config FB_TFT_UPD161704
|
||||
tristate "FB driver for the uPD161704 LCD Controller"
|
||||
depends on FB_TFT
|
||||
help
|
||||
Generic Framebuffer support for uPD161704
|
||||
|
||||
endif
|
||||
|
|
|
|||
|
|
@ -27,10 +27,10 @@ MODULE_DESCRIPTION("GPIB driver for Agilent 82350b");
|
|||
static int read_transfer_counter(struct agilent_82350b_priv *a_priv);
|
||||
static unsigned short read_and_clear_event_status(struct gpib_board *board);
|
||||
static void set_transfer_counter(struct agilent_82350b_priv *a_priv, int count);
|
||||
static int agilent_82350b_write(struct gpib_board *board, uint8_t *buffer,
|
||||
static int agilent_82350b_write(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, int send_eoi, size_t *bytes_written);
|
||||
|
||||
static int agilent_82350b_accel_read(struct gpib_board *board, uint8_t *buffer,
|
||||
static int agilent_82350b_accel_read(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, int *end, size_t *bytes_read)
|
||||
|
||||
{
|
||||
|
|
@ -39,7 +39,7 @@ static int agilent_82350b_accel_read(struct gpib_board *board, uint8_t *buffer,
|
|||
int retval = 0;
|
||||
unsigned short event_status;
|
||||
int i, num_fifo_bytes;
|
||||
//hardware doesn't support checking for end-of-string character when using fifo
|
||||
/* hardware doesn't support checking for end-of-string character when using fifo */
|
||||
if (tms_priv->eos_flags & REOS)
|
||||
return tms9914_read(board, tms_priv, buffer, length, end, bytes_read);
|
||||
|
||||
|
|
@ -50,9 +50,9 @@ static int agilent_82350b_accel_read(struct gpib_board *board, uint8_t *buffer,
|
|||
*bytes_read = 0;
|
||||
if (length == 0)
|
||||
return 0;
|
||||
//disable fifo for the moment
|
||||
/* disable fifo for the moment */
|
||||
writeb(DIRECTION_GPIB_TO_HOST, a_priv->gpib_base + SRAM_ACCESS_CONTROL_REG);
|
||||
// handle corner case of board not in holdoff and one byte might slip in early
|
||||
/* handle corner case of board not in holdoff and one byte might slip in early */
|
||||
if (tms_priv->holdoff_active == 0 && length > 1) {
|
||||
size_t num_bytes;
|
||||
|
||||
|
|
@ -67,7 +67,8 @@ static int agilent_82350b_accel_read(struct gpib_board *board, uint8_t *buffer,
|
|||
tms9914_release_holdoff(tms_priv);
|
||||
i = 0;
|
||||
num_fifo_bytes = length - 1;
|
||||
write_byte(tms_priv, tms_priv->imr0_bits & ~HR_BIIE, IMR0); // disable BI interrupts
|
||||
/* disable BI interrupts */
|
||||
write_byte(tms_priv, tms_priv->imr0_bits & ~HR_BIIE, IMR0);
|
||||
while (i < num_fifo_bytes && *end == 0) {
|
||||
int block_size;
|
||||
int j;
|
||||
|
|
@ -111,17 +112,18 @@ static int agilent_82350b_accel_read(struct gpib_board *board, uint8_t *buffer,
|
|||
break;
|
||||
}
|
||||
}
|
||||
write_byte(tms_priv, tms_priv->imr0_bits, IMR0); // re-enable BI interrupts
|
||||
/* re-enable BI interrupts */
|
||||
write_byte(tms_priv, tms_priv->imr0_bits, IMR0);
|
||||
*bytes_read += i;
|
||||
buffer += i;
|
||||
length -= i;
|
||||
writeb(DIRECTION_GPIB_TO_HOST, a_priv->gpib_base + SRAM_ACCESS_CONTROL_REG);
|
||||
if (retval < 0)
|
||||
return retval;
|
||||
// read last bytes if we havn't received an END yet
|
||||
/* read last bytes if we havn't received an END yet */
|
||||
if (*end == 0) {
|
||||
size_t num_bytes;
|
||||
// try to make sure we holdoff after last byte read
|
||||
/* try to make sure we holdoff after last byte read */
|
||||
retval = tms9914_read(board, tms_priv, buffer, length, end, &num_bytes);
|
||||
*bytes_read += num_bytes;
|
||||
if (retval < 0)
|
||||
|
|
@ -145,7 +147,7 @@ static int translate_wait_return_value(struct gpib_board *board, int retval)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int agilent_82350b_accel_write(struct gpib_board *board, uint8_t *buffer,
|
||||
static int agilent_82350b_accel_write(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, int send_eoi,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
|
|
@ -169,7 +171,7 @@ static int agilent_82350b_accel_write(struct gpib_board *board, uint8_t *buffer,
|
|||
event_status = read_and_clear_event_status(board);
|
||||
|
||||
#ifdef EXPERIMENTAL
|
||||
// wait for previous BO to complete if any
|
||||
/* wait for previous BO to complete if any */
|
||||
retval = wait_event_interruptible(board->wait,
|
||||
test_bit(DEV_CLEAR_BN, &tms_priv->state) ||
|
||||
test_bit(WRITE_READY_BN, &tms_priv->state) ||
|
||||
|
|
@ -192,7 +194,7 @@ static int agilent_82350b_accel_write(struct gpib_board *board, uint8_t *buffer,
|
|||
block_size = min(fifotransferlength - i, agilent_82350b_fifo_size);
|
||||
set_transfer_counter(a_priv, block_size);
|
||||
for (j = 0; j < block_size; ++j, ++i) {
|
||||
// load data into board's sram
|
||||
/* load data into board's sram */
|
||||
writeb(buffer[i], a_priv->sram_base + j);
|
||||
}
|
||||
writeb(ENABLE_TI_TO_SRAM, a_priv->gpib_base + SRAM_ACCESS_CONTROL_REG);
|
||||
|
|
@ -262,7 +264,7 @@ static irqreturn_t agilent_82350b_interrupt(int irq, void *arg)
|
|||
tms9914_interrupt_have_status(board, &a_priv->tms9914_priv, tms9914_status1,
|
||||
tms9914_status2);
|
||||
}
|
||||
//write-clear status bits
|
||||
/* write-clear status bits */
|
||||
if (event_status & (BUFFER_END_STATUS_BIT | TERM_COUNT_STATUS_BIT)) {
|
||||
writeb(event_status & (BUFFER_END_STATUS_BIT | TERM_COUNT_STATUS_BIT),
|
||||
a_priv->gpib_base + EVENT_STATUS_REG);
|
||||
|
|
@ -292,12 +294,12 @@ static void set_transfer_counter(struct agilent_82350b_priv *a_priv, int count)
|
|||
|
||||
writeb(complement & 0xff, a_priv->gpib_base + XFER_COUNT_LO_REG);
|
||||
writeb((complement >> 8) & 0xff, a_priv->gpib_base + XFER_COUNT_MID_REG);
|
||||
//I don't think the hi count reg is even used, but oh well
|
||||
/* I don't think the hi count reg is even used, but oh well */
|
||||
writeb((complement >> 16) & 0xf, a_priv->gpib_base + XFER_COUNT_HI_REG);
|
||||
}
|
||||
|
||||
// wrappers for interface functions
|
||||
static int agilent_82350b_read(struct gpib_board *board, uint8_t *buffer,
|
||||
/* wrappers for interface functions */
|
||||
static int agilent_82350b_read(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, int *end, size_t *bytes_read)
|
||||
{
|
||||
struct agilent_82350b_priv *priv = board->private_data;
|
||||
|
|
@ -305,7 +307,7 @@ static int agilent_82350b_read(struct gpib_board *board, uint8_t *buffer,
|
|||
return tms9914_read(board, &priv->tms9914_priv, buffer, length, end, bytes_read);
|
||||
}
|
||||
|
||||
static int agilent_82350b_write(struct gpib_board *board, uint8_t *buffer,
|
||||
static int agilent_82350b_write(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, int send_eoi, size_t *bytes_written)
|
||||
|
||||
{
|
||||
|
|
@ -314,7 +316,7 @@ static int agilent_82350b_write(struct gpib_board *board, uint8_t *buffer,
|
|||
return tms9914_write(board, &priv->tms9914_priv, buffer, length, send_eoi, bytes_written);
|
||||
}
|
||||
|
||||
static int agilent_82350b_command(struct gpib_board *board, uint8_t *buffer,
|
||||
static int agilent_82350b_command(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, size_t *bytes_written)
|
||||
|
||||
{
|
||||
|
|
@ -339,9 +341,7 @@ static int agilent_82350b_go_to_standby(struct gpib_board *board)
|
|||
return tms9914_go_to_standby(board, &priv->tms9914_priv);
|
||||
}
|
||||
|
||||
static void agilent_82350b_request_system_control(struct gpib_board *board,
|
||||
int request_control)
|
||||
|
||||
static int agilent_82350b_request_system_control(struct gpib_board *board, int request_control)
|
||||
{
|
||||
struct agilent_82350b_priv *a_priv = board->private_data;
|
||||
|
||||
|
|
@ -355,7 +355,7 @@ static void agilent_82350b_request_system_control(struct gpib_board *board,
|
|||
writeb(0, a_priv->gpib_base + INTERNAL_CONFIG_REG);
|
||||
}
|
||||
writeb(a_priv->card_mode_bits, a_priv->gpib_base + CARD_MODE_REG);
|
||||
tms9914_request_system_control(board, &a_priv->tms9914_priv, request_control);
|
||||
return tms9914_request_system_control(board, &a_priv->tms9914_priv, request_control);
|
||||
}
|
||||
|
||||
static void agilent_82350b_interface_clear(struct gpib_board *board, int assert)
|
||||
|
|
@ -373,7 +373,7 @@ static void agilent_82350b_remote_enable(struct gpib_board *board, int enable)
|
|||
tms9914_remote_enable(board, &priv->tms9914_priv, enable);
|
||||
}
|
||||
|
||||
static int agilent_82350b_enable_eos(struct gpib_board *board, uint8_t eos_byte,
|
||||
static int agilent_82350b_enable_eos(struct gpib_board *board, u8 eos_byte,
|
||||
int compare_8_bits)
|
||||
{
|
||||
struct agilent_82350b_priv *priv = board->private_data;
|
||||
|
|
@ -412,7 +412,7 @@ static int agilent_82350b_secondary_address(struct gpib_board *board,
|
|||
return tms9914_secondary_address(board, &priv->tms9914_priv, address, enable);
|
||||
}
|
||||
|
||||
static int agilent_82350b_parallel_poll(struct gpib_board *board, uint8_t *result)
|
||||
static int agilent_82350b_parallel_poll(struct gpib_board *board, u8 *result)
|
||||
{
|
||||
struct agilent_82350b_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -420,7 +420,7 @@ static int agilent_82350b_parallel_poll(struct gpib_board *board, uint8_t *resul
|
|||
}
|
||||
|
||||
static void agilent_82350b_parallel_poll_configure(struct gpib_board *board,
|
||||
uint8_t config)
|
||||
u8 config)
|
||||
{
|
||||
struct agilent_82350b_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -434,14 +434,14 @@ static void agilent_82350b_parallel_poll_response(struct gpib_board *board, int
|
|||
tms9914_parallel_poll_response(board, &priv->tms9914_priv, ist);
|
||||
}
|
||||
|
||||
static void agilent_82350b_serial_poll_response(struct gpib_board *board, uint8_t status)
|
||||
static void agilent_82350b_serial_poll_response(struct gpib_board *board, u8 status)
|
||||
{
|
||||
struct agilent_82350b_priv *priv = board->private_data;
|
||||
|
||||
tms9914_serial_poll_response(board, &priv->tms9914_priv, status);
|
||||
}
|
||||
|
||||
static uint8_t agilent_82350b_serial_poll_status(struct gpib_board *board)
|
||||
static u8 agilent_82350b_serial_poll_status(struct gpib_board *board)
|
||||
{
|
||||
struct agilent_82350b_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -492,7 +492,7 @@ static void agilent_82350b_free_private(struct gpib_board *board)
|
|||
}
|
||||
|
||||
static int init_82350a_hardware(struct gpib_board *board,
|
||||
const gpib_board_config_t *config)
|
||||
const struct gpib_board_config *config)
|
||||
{
|
||||
struct agilent_82350b_priv *a_priv = board->private_data;
|
||||
static const unsigned int firmware_length = 5302;
|
||||
|
|
@ -511,18 +511,18 @@ static int init_82350a_hardware(struct gpib_board *board,
|
|||
PLX9050_PCI_RETRY_DELAY_BITS(64) |
|
||||
PLX9050_DIRECT_SLAVE_LOCK_ENABLE_BIT;
|
||||
|
||||
// load borg data
|
||||
/* load borg data */
|
||||
borg_status = readb(a_priv->borg_base);
|
||||
if ((borg_status & BORG_DONE_BIT))
|
||||
return 0;
|
||||
// need to programme borg
|
||||
/* need to programme borg */
|
||||
if (!config->init_data || config->init_data_length != firmware_length) {
|
||||
dev_err(board->gpib_dev, "the 82350A board requires firmware after powering on.\n");
|
||||
return -EIO;
|
||||
}
|
||||
dev_dbg(board->gpib_dev, "Loading firmware...\n");
|
||||
|
||||
// tickle the borg
|
||||
/* tickle the borg */
|
||||
writel(plx_cntrl_static_bits | PLX9050_USER3_DATA_BIT,
|
||||
a_priv->plx_base + PLX9050_CNTRL_REG);
|
||||
usleep_range(1000, 2000);
|
||||
|
|
@ -563,7 +563,7 @@ static int test_sram(struct gpib_board *board)
|
|||
struct agilent_82350b_priv *a_priv = board->private_data;
|
||||
unsigned int i;
|
||||
const unsigned int sram_length = pci_resource_len(a_priv->pci_device, SRAM_82350A_REGION);
|
||||
// test SRAM
|
||||
/* test SRAM */
|
||||
const unsigned int byte_mask = 0xff;
|
||||
|
||||
for (i = 0; i < sram_length; ++i) {
|
||||
|
|
@ -587,7 +587,7 @@ static int test_sram(struct gpib_board *board)
|
|||
}
|
||||
|
||||
static int agilent_82350b_generic_attach(struct gpib_board *board,
|
||||
const gpib_board_config_t *config,
|
||||
const struct gpib_board_config *config,
|
||||
int use_fifos)
|
||||
|
||||
{
|
||||
|
|
@ -606,7 +606,7 @@ static int agilent_82350b_generic_attach(struct gpib_board *board,
|
|||
tms_priv->write_byte = tms9914_iomem_write_byte;
|
||||
tms_priv->offset = 1;
|
||||
|
||||
// find board
|
||||
/* find board */
|
||||
a_priv->pci_device = gpib_pci_get_device(config, PCI_VENDOR_ID_AGILENT,
|
||||
PCI_DEVICE_ID_82350B, NULL);
|
||||
if (a_priv->pci_device) {
|
||||
|
|
@ -702,7 +702,7 @@ static int agilent_82350b_generic_attach(struct gpib_board *board,
|
|||
writeb(a_priv->card_mode_bits, a_priv->gpib_base + CARD_MODE_REG);
|
||||
|
||||
if (a_priv->model == MODEL_82350A) {
|
||||
// enable PCI interrupts for 82350a
|
||||
/* enable PCI interrupts for 82350a */
|
||||
writel(PLX9050_LINTR1_EN_BIT | PLX9050_LINTR2_POLARITY_BIT |
|
||||
PLX9050_PCI_INTR_EN_BIT,
|
||||
a_priv->plx_base + PLX9050_INTCSR_REG);
|
||||
|
|
@ -713,7 +713,7 @@ static int agilent_82350b_generic_attach(struct gpib_board *board,
|
|||
a_priv->gpib_base + EVENT_ENABLE_REG);
|
||||
writeb(ENABLE_TERM_COUNT_INTERRUPT_BIT | ENABLE_BUFFER_END_INTERRUPT_BIT |
|
||||
ENABLE_TMS9914_INTERRUPTS_BIT, a_priv->gpib_base + INTERRUPT_ENABLE_REG);
|
||||
//write-clear event status bits
|
||||
/* write-clear event status bits */
|
||||
writeb(BUFFER_END_STATUS_BIT | TERM_COUNT_STATUS_BIT,
|
||||
a_priv->gpib_base + EVENT_STATUS_REG);
|
||||
} else {
|
||||
|
|
@ -730,13 +730,13 @@ static int agilent_82350b_generic_attach(struct gpib_board *board,
|
|||
}
|
||||
|
||||
static int agilent_82350b_unaccel_attach(struct gpib_board *board,
|
||||
const gpib_board_config_t *config)
|
||||
const struct gpib_board_config *config)
|
||||
{
|
||||
return agilent_82350b_generic_attach(board, config, 0);
|
||||
}
|
||||
|
||||
static int agilent_82350b_accel_attach(struct gpib_board *board,
|
||||
const gpib_board_config_t *config)
|
||||
const struct gpib_board_config *config)
|
||||
{
|
||||
return agilent_82350b_generic_attach(board, config, 1);
|
||||
}
|
||||
|
|
@ -747,7 +747,7 @@ static void agilent_82350b_detach(struct gpib_board *board)
|
|||
struct tms9914_priv *tms_priv;
|
||||
|
||||
if (a_priv) {
|
||||
if (a_priv->plx_base) // disable interrupts
|
||||
if (a_priv->plx_base) /* disable interrupts */
|
||||
writel(0, a_priv->plx_base + PLX9050_INTCSR_REG);
|
||||
|
||||
tms_priv = &a_priv->tms9914_priv;
|
||||
|
|
@ -773,7 +773,7 @@ static void agilent_82350b_detach(struct gpib_board *board)
|
|||
agilent_82350b_free_private(board);
|
||||
}
|
||||
|
||||
static gpib_interface_t agilent_82350b_unaccel_interface = {
|
||||
static struct gpib_interface agilent_82350b_unaccel_interface = {
|
||||
.name = "agilent_82350b_unaccel",
|
||||
.attach = agilent_82350b_unaccel_attach,
|
||||
.detach = agilent_82350b_detach,
|
||||
|
|
@ -790,7 +790,7 @@ static gpib_interface_t agilent_82350b_unaccel_interface = {
|
|||
.parallel_poll = agilent_82350b_parallel_poll,
|
||||
.parallel_poll_configure = agilent_82350b_parallel_poll_configure,
|
||||
.parallel_poll_response = agilent_82350b_parallel_poll_response,
|
||||
.local_parallel_poll_mode = NULL, // XXX
|
||||
.local_parallel_poll_mode = NULL, /* XXX */
|
||||
.line_status = agilent_82350b_line_status,
|
||||
.update_status = agilent_82350b_update_status,
|
||||
.primary_address = agilent_82350b_primary_address,
|
||||
|
|
@ -801,7 +801,7 @@ static gpib_interface_t agilent_82350b_unaccel_interface = {
|
|||
.return_to_local = agilent_82350b_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t agilent_82350b_interface = {
|
||||
static struct gpib_interface agilent_82350b_interface = {
|
||||
.name = "agilent_82350b",
|
||||
.attach = agilent_82350b_accel_attach,
|
||||
.detach = agilent_82350b_detach,
|
||||
|
|
@ -818,7 +818,7 @@ static gpib_interface_t agilent_82350b_interface = {
|
|||
.parallel_poll = agilent_82350b_parallel_poll,
|
||||
.parallel_poll_configure = agilent_82350b_parallel_poll_configure,
|
||||
.parallel_poll_response = agilent_82350b_parallel_poll_response,
|
||||
.local_parallel_poll_mode = NULL, // XXX
|
||||
.local_parallel_poll_mode = NULL, /* XXX */
|
||||
.line_status = agilent_82350b_line_status,
|
||||
.update_status = agilent_82350b_update_status,
|
||||
.primary_address = agilent_82350b_primary_address,
|
||||
|
|
|
|||
|
|
@ -41,11 +41,11 @@ enum board_model {
|
|||
MODEL_82351A
|
||||
};
|
||||
|
||||
// struct which defines private_data for board
|
||||
/* struct which defines private_data for board */
|
||||
struct agilent_82350b_priv {
|
||||
struct tms9914_priv tms9914_priv;
|
||||
struct pci_dev *pci_device;
|
||||
void __iomem *plx_base; //82350a only
|
||||
void __iomem *plx_base; /* 82350a only */
|
||||
void __iomem *gpib_base;
|
||||
void __iomem *sram_base;
|
||||
void __iomem *misc_base;
|
||||
|
|
@ -57,12 +57,12 @@ struct agilent_82350b_priv {
|
|||
bool using_fifos;
|
||||
};
|
||||
|
||||
//registers
|
||||
/* registers */
|
||||
enum agilent_82350b_gpib_registers
|
||||
|
||||
{
|
||||
CARD_MODE_REG = 0x1,
|
||||
CONFIG_DATA_REG = 0x2, // 82350A specific
|
||||
CONFIG_DATA_REG = 0x2, /* 82350A specific */
|
||||
INTERRUPT_ENABLE_REG = 0x3,
|
||||
EVENT_STATUS_REG = 0x4,
|
||||
EVENT_ENABLE_REG = 0x5,
|
||||
|
|
@ -76,8 +76,8 @@ enum agilent_82350b_gpib_registers
|
|||
XFER_COUNT_HI_REG = 0xe,
|
||||
TMS9914_BASE_REG = 0x10,
|
||||
INTERNAL_CONFIG_REG = 0x18,
|
||||
IMR0_READ_REG = 0x19, //read
|
||||
T1_DELAY_REG = 0x19, // write
|
||||
IMR0_READ_REG = 0x19, /* read */
|
||||
T1_DELAY_REG = 0x19, /* write */
|
||||
IMR1_READ_REG = 0x1a,
|
||||
ADR_READ_REG = 0x1b,
|
||||
SPMR_READ_REG = 0x1c,
|
||||
|
|
@ -89,7 +89,7 @@ enum agilent_82350b_gpib_registers
|
|||
enum card_mode_bits
|
||||
|
||||
{
|
||||
ACTIVE_CONTROLLER_BIT = 0x2, // read-only
|
||||
ACTIVE_CONTROLLER_BIT = 0x2, /* read-only */
|
||||
CM_SYSTEM_CONTROLLER_BIT = 0x8,
|
||||
ENABLE_BUS_MONITOR_BIT = 0x10,
|
||||
ENABLE_PCI_IRQ_BIT = 0x20,
|
||||
|
|
@ -115,15 +115,15 @@ enum event_status_bits
|
|||
{
|
||||
TMS9914_IRQ_STATUS_BIT = 0x1,
|
||||
IRQ_STATUS_BIT = 0x2,
|
||||
BUFFER_END_STATUS_BIT = 0x10, // write-clear
|
||||
TERM_COUNT_STATUS_BIT = 0x20, // write-clear
|
||||
BUFFER_END_STATUS_BIT = 0x10, /* write-clear */
|
||||
TERM_COUNT_STATUS_BIT = 0x20, /* write-clear */
|
||||
};
|
||||
|
||||
enum stream_status_bits
|
||||
|
||||
{
|
||||
HALTED_STATUS_BIT = 0x1, //read
|
||||
RESTART_STREAM_BIT = 0x1, //write
|
||||
HALTED_STATUS_BIT = 0x1, /* read */
|
||||
RESTART_STREAM_BIT = 0x1, /* write */
|
||||
};
|
||||
|
||||
enum internal_config_bits
|
||||
|
|
@ -135,9 +135,9 @@ enum internal_config_bits
|
|||
enum sram_access_control_bits
|
||||
|
||||
{
|
||||
DIRECTION_GPIB_TO_HOST = 0x20, // transfer direction
|
||||
ENABLE_TI_TO_SRAM = 0x40, // enable fifo
|
||||
ENABLE_FAST_TALKER = 0x80 // added for 82350A (not used)
|
||||
DIRECTION_GPIB_TO_HOST = 0x20, /* transfer direction */
|
||||
ENABLE_TI_TO_SRAM = 0x40, /* enable fifo */
|
||||
ENABLE_FAST_TALKER = 0x80 /* added for 82350A (not used) */
|
||||
};
|
||||
|
||||
enum borg_bits
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ static struct usb_interface *agilent_82357a_driver_interfaces[MAX_NUM_82357A_INT
|
|||
static DEFINE_MUTEX(agilent_82357a_hotplug_lock); // protect board insertion and removal
|
||||
|
||||
static unsigned int agilent_82357a_update_status(struct gpib_board *board,
|
||||
unsigned int clear_mask);
|
||||
unsigned int clear_mask);
|
||||
|
||||
static int agilent_82357a_take_control_internal(struct gpib_board *board, int synchronous);
|
||||
|
||||
|
|
@ -34,7 +34,7 @@ static void agilent_82357a_bulk_complete(struct urb *urb)
|
|||
{
|
||||
struct agilent_82357a_urb_ctx *context = urb->context;
|
||||
|
||||
up(&context->complete);
|
||||
complete(&context->complete);
|
||||
}
|
||||
|
||||
static void agilent_82357a_timeout_handler(struct timer_list *t)
|
||||
|
|
@ -43,7 +43,7 @@ static void agilent_82357a_timeout_handler(struct timer_list *t)
|
|||
struct agilent_82357a_urb_ctx *context = &a_priv->context;
|
||||
|
||||
context->timed_out = 1;
|
||||
up(&context->complete);
|
||||
complete(&context->complete);
|
||||
}
|
||||
|
||||
static int agilent_82357a_send_bulk_msg(struct agilent_82357a_priv *a_priv, void *data,
|
||||
|
|
@ -74,7 +74,7 @@ static int agilent_82357a_send_bulk_msg(struct agilent_82357a_priv *a_priv, void
|
|||
}
|
||||
usb_dev = interface_to_usbdev(a_priv->bus_interface);
|
||||
out_pipe = usb_sndbulkpipe(usb_dev, a_priv->bulk_out_endpoint);
|
||||
sema_init(&context->complete, 0);
|
||||
init_completion(&context->complete);
|
||||
context->timed_out = 0;
|
||||
usb_fill_bulk_urb(a_priv->bulk_urb, usb_dev, out_pipe, data, data_length,
|
||||
&agilent_82357a_bulk_complete, context);
|
||||
|
|
@ -89,7 +89,7 @@ static int agilent_82357a_send_bulk_msg(struct agilent_82357a_priv *a_priv, void
|
|||
goto cleanup;
|
||||
}
|
||||
mutex_unlock(&a_priv->bulk_alloc_lock);
|
||||
if (down_interruptible(&context->complete)) {
|
||||
if (wait_for_completion_interruptible(&context->complete)) {
|
||||
retval = -ERESTARTSYS;
|
||||
goto cleanup;
|
||||
}
|
||||
|
|
@ -142,7 +142,7 @@ static int agilent_82357a_receive_bulk_msg(struct agilent_82357a_priv *a_priv, v
|
|||
}
|
||||
usb_dev = interface_to_usbdev(a_priv->bus_interface);
|
||||
in_pipe = usb_rcvbulkpipe(usb_dev, AGILENT_82357_BULK_IN_ENDPOINT);
|
||||
sema_init(&context->complete, 0);
|
||||
init_completion(&context->complete);
|
||||
context->timed_out = 0;
|
||||
usb_fill_bulk_urb(a_priv->bulk_urb, usb_dev, in_pipe, data, data_length,
|
||||
&agilent_82357a_bulk_complete, context);
|
||||
|
|
@ -157,7 +157,7 @@ static int agilent_82357a_receive_bulk_msg(struct agilent_82357a_priv *a_priv, v
|
|||
goto cleanup;
|
||||
}
|
||||
mutex_unlock(&a_priv->bulk_alloc_lock);
|
||||
if (down_interruptible(&context->complete)) {
|
||||
if (wait_for_completion_interruptible(&context->complete)) {
|
||||
retval = -ERESTARTSYS;
|
||||
goto cleanup;
|
||||
}
|
||||
|
|
@ -420,10 +420,10 @@ cleanup:
|
|||
}
|
||||
|
||||
// interface functions
|
||||
int agilent_82357a_command(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
int agilent_82357a_command(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
size_t *bytes_written);
|
||||
|
||||
static int agilent_82357a_read(struct gpib_board *board, uint8_t *buffer, size_t length, int *end,
|
||||
static int agilent_82357a_read(struct gpib_board *board, u8 *buffer, size_t length, int *end,
|
||||
size_t *nbytes)
|
||||
{
|
||||
int retval;
|
||||
|
|
@ -524,9 +524,10 @@ static int agilent_82357a_read(struct gpib_board *board, uint8_t *buffer, size_t
|
|||
}
|
||||
kfree(in_data);
|
||||
|
||||
/* Fix for a bug in 9914A that does not return the contents of ADSR
|
||||
* when the board is in listener active state and ATN is not asserted.
|
||||
* Set ATN here to obtain a valid board level ibsta
|
||||
/*
|
||||
* Fix for a bug in 9914A that does not return the contents of ADSR
|
||||
* when the board is in listener active state and ATN is not asserted.
|
||||
* Set ATN here to obtain a valid board level ibsta
|
||||
*/
|
||||
agilent_82357a_take_control_internal(board, 0);
|
||||
|
||||
|
|
@ -535,7 +536,7 @@ static int agilent_82357a_read(struct gpib_board *board, uint8_t *buffer, size_t
|
|||
}
|
||||
|
||||
static ssize_t agilent_82357a_generic_write(struct gpib_board *board,
|
||||
uint8_t *buffer, size_t length,
|
||||
u8 *buffer, size_t length,
|
||||
int send_commands, int send_eoi,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
|
|
@ -675,13 +676,13 @@ static ssize_t agilent_82357a_generic_write(struct gpib_board *board,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int agilent_82357a_write(struct gpib_board *board, uint8_t *buffer,
|
||||
static int agilent_82357a_write(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, int send_eoi, size_t *bytes_written)
|
||||
{
|
||||
return agilent_82357a_generic_write(board, buffer, length, 0, send_eoi, bytes_written);
|
||||
}
|
||||
|
||||
int agilent_82357a_command(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
int agilent_82357a_command(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
return agilent_82357a_generic_write(board, buffer, length, 1, 0, bytes_written);
|
||||
|
|
@ -715,9 +716,10 @@ static int agilent_82357a_take_control(struct gpib_board *board, int synchronous
|
|||
if (!a_priv->bus_interface)
|
||||
return -ENODEV;
|
||||
|
||||
/* It looks like the 9914 does not handle tcs properly.
|
||||
* See comment above tms9914_take_control_workaround() in
|
||||
* drivers/gpib/tms9914/tms9914_aux.c
|
||||
/*
|
||||
* It looks like the 9914 does not handle tcs properly.
|
||||
* See comment above tms9914_take_control_workaround() in
|
||||
* drivers/gpib/tms9914/tms9914_aux.c
|
||||
*/
|
||||
if (synchronous)
|
||||
return -ETIMEDOUT;
|
||||
|
|
@ -754,9 +756,7 @@ static int agilent_82357a_go_to_standby(struct gpib_board *board)
|
|||
return 0;
|
||||
}
|
||||
|
||||
//FIXME should change prototype to return int
|
||||
static void agilent_82357a_request_system_control(struct gpib_board *board,
|
||||
int request_control)
|
||||
static int agilent_82357a_request_system_control(struct gpib_board *board, int request_control)
|
||||
{
|
||||
struct agilent_82357a_priv *a_priv = board->private_data;
|
||||
struct usb_device *usb_dev;
|
||||
|
|
@ -765,7 +765,7 @@ static void agilent_82357a_request_system_control(struct gpib_board *board,
|
|||
int i = 0;
|
||||
|
||||
if (!a_priv->bus_interface)
|
||||
return; // -ENODEV;
|
||||
return -ENODEV;
|
||||
|
||||
usb_dev = interface_to_usbdev(a_priv->bus_interface);
|
||||
/* 82357B needs bit to be set in 9914 AUXCR register */
|
||||
|
|
@ -774,9 +774,7 @@ static void agilent_82357a_request_system_control(struct gpib_board *board,
|
|||
writes[i].value = AUX_RQC;
|
||||
a_priv->hw_control_bits |= SYSTEM_CONTROLLER;
|
||||
} else {
|
||||
writes[i].value = AUX_RLC;
|
||||
a_priv->is_cic = 0;
|
||||
a_priv->hw_control_bits &= ~SYSTEM_CONTROLLER;
|
||||
return -EINVAL;
|
||||
}
|
||||
++i;
|
||||
writes[i].address = HW_CONTROL;
|
||||
|
|
@ -785,7 +783,7 @@ static void agilent_82357a_request_system_control(struct gpib_board *board,
|
|||
retval = agilent_82357a_write_registers(a_priv, writes, i);
|
||||
if (retval)
|
||||
dev_err(&usb_dev->dev, "write_registers() returned error\n");
|
||||
return;// retval;
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void agilent_82357a_interface_clear(struct gpib_board *board, int assert)
|
||||
|
|
@ -832,7 +830,7 @@ static void agilent_82357a_remote_enable(struct gpib_board *board, int enable)
|
|||
return;// 0;
|
||||
}
|
||||
|
||||
static int agilent_82357a_enable_eos(struct gpib_board *board, uint8_t eos_byte,
|
||||
static int agilent_82357a_enable_eos(struct gpib_board *board, u8 eos_byte,
|
||||
int compare_8_bits)
|
||||
{
|
||||
struct agilent_82357a_priv *a_priv = board->private_data;
|
||||
|
|
@ -946,7 +944,7 @@ static int agilent_82357a_secondary_address(struct gpib_board *board,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int agilent_82357a_parallel_poll(struct gpib_board *board, uint8_t *result)
|
||||
static int agilent_82357a_parallel_poll(struct gpib_board *board, u8 *result)
|
||||
{
|
||||
struct agilent_82357a_priv *a_priv = board->private_data;
|
||||
struct usb_device *usb_dev;
|
||||
|
|
@ -988,7 +986,7 @@ static int agilent_82357a_parallel_poll(struct gpib_board *board, uint8_t *resul
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void agilent_82357a_parallel_poll_configure(struct gpib_board *board, uint8_t config)
|
||||
static void agilent_82357a_parallel_poll_configure(struct gpib_board *board, u8 config)
|
||||
{
|
||||
//board can only be system controller
|
||||
return;// 0;
|
||||
|
|
@ -1000,13 +998,13 @@ static void agilent_82357a_parallel_poll_response(struct gpib_board *board, int
|
|||
return;// 0;
|
||||
}
|
||||
|
||||
static void agilent_82357a_serial_poll_response(struct gpib_board *board, uint8_t status)
|
||||
static void agilent_82357a_serial_poll_response(struct gpib_board *board, u8 status)
|
||||
{
|
||||
//board can only be system controller
|
||||
return;// 0;
|
||||
}
|
||||
|
||||
static uint8_t agilent_82357a_serial_poll_status(struct gpib_board *board)
|
||||
static u8 agilent_82357a_serial_poll_status(struct gpib_board *board)
|
||||
{
|
||||
//board can only be system controller
|
||||
return 0;
|
||||
|
|
@ -1292,7 +1290,7 @@ static int agilent_82357a_init(struct gpib_board *board)
|
|||
}
|
||||
|
||||
static inline int agilent_82357a_device_match(struct usb_interface *interface,
|
||||
const gpib_board_config_t *config)
|
||||
const struct gpib_board_config *config)
|
||||
{
|
||||
struct usb_device * const usbdev = interface_to_usbdev(interface);
|
||||
|
||||
|
|
@ -1305,7 +1303,7 @@ static inline int agilent_82357a_device_match(struct usb_interface *interface,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int agilent_82357a_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int agilent_82357a_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
int retval;
|
||||
int i;
|
||||
|
|
@ -1432,7 +1430,7 @@ static void agilent_82357a_detach(struct gpib_board *board)
|
|||
mutex_unlock(&agilent_82357a_hotplug_lock);
|
||||
}
|
||||
|
||||
static gpib_interface_t agilent_82357a_gpib_interface = {
|
||||
static struct gpib_interface agilent_82357a_gpib_interface = {
|
||||
.name = "agilent_82357a",
|
||||
.attach = agilent_82357a_attach,
|
||||
.detach = agilent_82357a_detach,
|
||||
|
|
@ -1591,7 +1589,7 @@ static int agilent_82357a_driver_resume(struct usb_interface *interface)
|
|||
{
|
||||
struct usb_device *usb_dev = interface_to_usbdev(interface);
|
||||
struct gpib_board *board;
|
||||
int i, retval;
|
||||
int i, retval = 0;
|
||||
|
||||
mutex_lock(&agilent_82357a_hotplug_lock);
|
||||
|
||||
|
|
@ -1602,8 +1600,10 @@ static int agilent_82357a_driver_resume(struct usb_interface *interface)
|
|||
break;
|
||||
}
|
||||
}
|
||||
if (i == MAX_NUM_82357A_INTERFACES)
|
||||
if (i == MAX_NUM_82357A_INTERFACES) {
|
||||
retval = -ENOENT;
|
||||
goto resume_exit;
|
||||
}
|
||||
|
||||
struct agilent_82357a_priv *a_priv = board->private_data;
|
||||
|
||||
|
|
@ -1626,7 +1626,7 @@ static int agilent_82357a_driver_resume(struct usb_interface *interface)
|
|||
return retval;
|
||||
}
|
||||
// set/unset system controller
|
||||
agilent_82357a_request_system_control(board, board->master);
|
||||
retval = agilent_82357a_request_system_control(board, board->master);
|
||||
// toggle ifc if master
|
||||
if (board->master) {
|
||||
agilent_82357a_interface_clear(board, 1);
|
||||
|
|
@ -1644,7 +1644,7 @@ static int agilent_82357a_driver_resume(struct usb_interface *interface)
|
|||
resume_exit:
|
||||
mutex_unlock(&agilent_82357a_hotplug_lock);
|
||||
|
||||
return 0;
|
||||
return retval;
|
||||
}
|
||||
|
||||
static struct usb_driver agilent_82357a_bus_driver = {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/semaphore.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/compiler_attributes.h>
|
||||
|
|
@ -115,7 +115,7 @@ enum xfer_abort_type {
|
|||
#define INTERRUPT_BUF_LEN 8
|
||||
|
||||
struct agilent_82357a_urb_ctx {
|
||||
struct semaphore complete;
|
||||
struct completion complete;
|
||||
unsigned timed_out : 1;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("GPIB driver Measurement Computing boards using cb7210.2 and cbi488.2");
|
||||
|
||||
static int cb7210_read(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int cb7210_read(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int *end, size_t *bytes_read);
|
||||
|
||||
static inline int have_fifo_word(const struct cb7210_priv *cb_priv)
|
||||
|
|
@ -76,7 +76,7 @@ static inline void input_fifo_enable(struct gpib_board *board, int enable)
|
|||
spin_unlock_irqrestore(&board->spinlock, flags);
|
||||
}
|
||||
|
||||
static int fifo_read(struct gpib_board *board, struct cb7210_priv *cb_priv, uint8_t *buffer,
|
||||
static int fifo_read(struct gpib_board *board, struct cb7210_priv *cb_priv, u8 *buffer,
|
||||
size_t length, int *end, size_t *bytes_read)
|
||||
{
|
||||
ssize_t retval = 0;
|
||||
|
|
@ -170,7 +170,7 @@ static int fifo_read(struct gpib_board *board, struct cb7210_priv *cb_priv, uint
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int cb7210_accel_read(struct gpib_board *board, uint8_t *buffer,
|
||||
static int cb7210_accel_read(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, int *end, size_t *bytes_read)
|
||||
{
|
||||
ssize_t retval;
|
||||
|
|
@ -264,7 +264,7 @@ static inline void output_fifo_enable(struct gpib_board *board, int enable)
|
|||
spin_unlock_irqrestore(&board->spinlock, flags);
|
||||
}
|
||||
|
||||
static int fifo_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int fifo_write(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
size_t count = 0;
|
||||
|
|
@ -350,7 +350,7 @@ static int fifo_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int cb7210_accel_write(struct gpib_board *board, uint8_t *buffer,
|
||||
static int cb7210_accel_write(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, int send_eoi, size_t *bytes_written)
|
||||
{
|
||||
struct cb7210_priv *cb_priv = board->private_data;
|
||||
|
|
@ -533,14 +533,14 @@ static irqreturn_t cb7210_interrupt(int irq, void *arg)
|
|||
return cb7210_internal_interrupt(arg);
|
||||
}
|
||||
|
||||
static int cb_pci_attach(struct gpib_board *board, const gpib_board_config_t *config);
|
||||
static int cb_isa_attach(struct gpib_board *board, const gpib_board_config_t *config);
|
||||
static int cb_pci_attach(struct gpib_board *board, const struct gpib_board_config *config);
|
||||
static int cb_isa_attach(struct gpib_board *board, const struct gpib_board_config *config);
|
||||
|
||||
static void cb_pci_detach(struct gpib_board *board);
|
||||
static void cb_isa_detach(struct gpib_board *board);
|
||||
|
||||
// wrappers for interface functions
|
||||
static int cb7210_read(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int cb7210_read(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int *end, size_t *bytes_read)
|
||||
{
|
||||
struct cb7210_priv *priv = board->private_data;
|
||||
|
|
@ -548,7 +548,7 @@ static int cb7210_read(struct gpib_board *board, uint8_t *buffer, size_t length,
|
|||
return nec7210_read(board, &priv->nec7210_priv, buffer, length, end, bytes_read);
|
||||
}
|
||||
|
||||
static int cb7210_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int cb7210_write(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int send_eoi, size_t *bytes_written)
|
||||
{
|
||||
struct cb7210_priv *priv = board->private_data;
|
||||
|
|
@ -556,7 +556,7 @@ static int cb7210_write(struct gpib_board *board, uint8_t *buffer, size_t length
|
|||
return nec7210_write(board, &priv->nec7210_priv, buffer, length, send_eoi, bytes_written);
|
||||
}
|
||||
|
||||
static int cb7210_command(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int cb7210_command(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
struct cb7210_priv *priv = board->private_data;
|
||||
|
|
@ -578,7 +578,7 @@ static int cb7210_go_to_standby(struct gpib_board *board)
|
|||
return nec7210_go_to_standby(board, &priv->nec7210_priv);
|
||||
}
|
||||
|
||||
static void cb7210_request_system_control(struct gpib_board *board, int request_control)
|
||||
static int cb7210_request_system_control(struct gpib_board *board, int request_control)
|
||||
{
|
||||
struct cb7210_priv *priv = board->private_data;
|
||||
struct nec7210_priv *nec_priv = &priv->nec7210_priv;
|
||||
|
|
@ -589,7 +589,7 @@ static void cb7210_request_system_control(struct gpib_board *board, int request_
|
|||
priv->hs_mode_bits &= ~HS_SYS_CONTROL;
|
||||
|
||||
cb7210_write_byte(priv, priv->hs_mode_bits, HS_MODE);
|
||||
nec7210_request_system_control(board, nec_priv, request_control);
|
||||
return nec7210_request_system_control(board, nec_priv, request_control);
|
||||
}
|
||||
|
||||
static void cb7210_interface_clear(struct gpib_board *board, int assert)
|
||||
|
|
@ -606,7 +606,7 @@ static void cb7210_remote_enable(struct gpib_board *board, int enable)
|
|||
nec7210_remote_enable(board, &priv->nec7210_priv, enable);
|
||||
}
|
||||
|
||||
static int cb7210_enable_eos(struct gpib_board *board, uint8_t eos_byte, int compare_8_bits)
|
||||
static int cb7210_enable_eos(struct gpib_board *board, u8 eos_byte, int compare_8_bits)
|
||||
{
|
||||
struct cb7210_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -641,14 +641,14 @@ static int cb7210_secondary_address(struct gpib_board *board, unsigned int addre
|
|||
return nec7210_secondary_address(board, &priv->nec7210_priv, address, enable);
|
||||
}
|
||||
|
||||
static int cb7210_parallel_poll(struct gpib_board *board, uint8_t *result)
|
||||
static int cb7210_parallel_poll(struct gpib_board *board, u8 *result)
|
||||
{
|
||||
struct cb7210_priv *priv = board->private_data;
|
||||
|
||||
return nec7210_parallel_poll(board, &priv->nec7210_priv, result);
|
||||
}
|
||||
|
||||
static void cb7210_parallel_poll_configure(struct gpib_board *board, uint8_t configuration)
|
||||
static void cb7210_parallel_poll_configure(struct gpib_board *board, u8 configuration)
|
||||
{
|
||||
struct cb7210_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -662,14 +662,14 @@ static void cb7210_parallel_poll_response(struct gpib_board *board, int ist)
|
|||
nec7210_parallel_poll_response(board, &priv->nec7210_priv, ist);
|
||||
}
|
||||
|
||||
static void cb7210_serial_poll_response(struct gpib_board *board, uint8_t status)
|
||||
static void cb7210_serial_poll_response(struct gpib_board *board, u8 status)
|
||||
{
|
||||
struct cb7210_priv *priv = board->private_data;
|
||||
|
||||
nec7210_serial_poll_response(board, &priv->nec7210_priv, status);
|
||||
}
|
||||
|
||||
static uint8_t cb7210_serial_poll_status(struct gpib_board *board)
|
||||
static u8 cb7210_serial_poll_status(struct gpib_board *board)
|
||||
{
|
||||
struct cb7210_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -686,7 +686,7 @@ static void cb7210_return_to_local(struct gpib_board *board)
|
|||
write_byte(nec_priv, AUX_RTL, AUXMR);
|
||||
}
|
||||
|
||||
static gpib_interface_t cb_pci_unaccel_interface = {
|
||||
static struct gpib_interface cb_pci_unaccel_interface = {
|
||||
.name = "cbi_pci_unaccel",
|
||||
.attach = cb_pci_attach,
|
||||
.detach = cb_pci_detach,
|
||||
|
|
@ -714,7 +714,7 @@ static gpib_interface_t cb_pci_unaccel_interface = {
|
|||
.return_to_local = cb7210_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t cb_pci_accel_interface = {
|
||||
static struct gpib_interface cb_pci_accel_interface = {
|
||||
.name = "cbi_pci_accel",
|
||||
.attach = cb_pci_attach,
|
||||
.detach = cb_pci_detach,
|
||||
|
|
@ -742,7 +742,7 @@ static gpib_interface_t cb_pci_accel_interface = {
|
|||
.return_to_local = cb7210_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t cb_pci_interface = {
|
||||
static struct gpib_interface cb_pci_interface = {
|
||||
.name = "cbi_pci",
|
||||
.attach = cb_pci_attach,
|
||||
.detach = cb_pci_detach,
|
||||
|
|
@ -769,7 +769,7 @@ static gpib_interface_t cb_pci_interface = {
|
|||
.return_to_local = cb7210_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t cb_isa_unaccel_interface = {
|
||||
static struct gpib_interface cb_isa_unaccel_interface = {
|
||||
.name = "cbi_isa_unaccel",
|
||||
.attach = cb_isa_attach,
|
||||
.detach = cb_isa_detach,
|
||||
|
|
@ -797,7 +797,7 @@ static gpib_interface_t cb_isa_unaccel_interface = {
|
|||
.return_to_local = cb7210_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t cb_isa_interface = {
|
||||
static struct gpib_interface cb_isa_interface = {
|
||||
.name = "cbi_isa",
|
||||
.attach = cb_isa_attach,
|
||||
.detach = cb_isa_detach,
|
||||
|
|
@ -824,7 +824,7 @@ static gpib_interface_t cb_isa_interface = {
|
|||
.return_to_local = cb7210_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t cb_isa_accel_interface = {
|
||||
static struct gpib_interface cb_isa_accel_interface = {
|
||||
.name = "cbi_isa_accel",
|
||||
.attach = cb_isa_attach,
|
||||
.detach = cb_isa_detach,
|
||||
|
|
@ -905,7 +905,8 @@ static int cb7210_init(struct cb7210_priv *cb_priv, struct gpib_board *board)
|
|||
cb7210_write_byte(cb_priv, cb_priv->hs_mode_bits, HS_MODE);
|
||||
|
||||
write_byte(nec_priv, AUX_LO_SPEED, AUXMR);
|
||||
/* set clock register for maximum (20 MHz) driving frequency
|
||||
/*
|
||||
* set clock register for maximum (20 MHz) driving frequency
|
||||
* ICR should be set to clock in megahertz (1-15) and to zero
|
||||
* for clocks faster than 15 MHz (max 20MHz)
|
||||
*/
|
||||
|
|
@ -926,7 +927,7 @@ static int cb7210_init(struct cb7210_priv *cb_priv, struct gpib_board *board)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cb_pci_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int cb_pci_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
struct cb7210_priv *cb_priv;
|
||||
struct nec7210_priv *nec_priv;
|
||||
|
|
@ -1031,7 +1032,7 @@ static void cb_pci_detach(struct gpib_board *board)
|
|||
cb7210_generic_detach(board);
|
||||
}
|
||||
|
||||
static int cb_isa_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int cb_isa_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
int isr_flags = 0;
|
||||
struct cb7210_priv *cb_priv;
|
||||
|
|
@ -1133,7 +1134,7 @@ static struct pci_driver cb7210_pci_driver = {
|
|||
|
||||
static int cb_gpib_config(struct pcmcia_device *link);
|
||||
static void cb_gpib_release(struct pcmcia_device *link);
|
||||
static int cb_pcmcia_attach(struct gpib_board *board, const gpib_board_config_t *config);
|
||||
static int cb_pcmcia_attach(struct gpib_board *board, const struct gpib_board_config *config);
|
||||
static void cb_pcmcia_detach(struct gpib_board *board);
|
||||
|
||||
/*
|
||||
|
|
@ -1246,13 +1247,8 @@ static int cb_gpib_config_iteration(struct pcmcia_device *link, void *priv_data)
|
|||
|
||||
static int cb_gpib_config(struct pcmcia_device *link)
|
||||
{
|
||||
struct pcmcia_device *handle;
|
||||
struct local_info *dev;
|
||||
int retval;
|
||||
|
||||
handle = link;
|
||||
dev = link->priv;
|
||||
|
||||
retval = pcmcia_loop_config(link, &cb_gpib_config_iteration, NULL);
|
||||
if (retval) {
|
||||
dev_warn(&link->dev, "no configuration found\n");
|
||||
|
|
@ -1275,9 +1271,9 @@ static int cb_gpib_config(struct pcmcia_device *link)
|
|||
} /* gpib_config */
|
||||
|
||||
/*
|
||||
* After a card is removed, gpib_release() will unregister the net
|
||||
* device, and release the PCMCIA configuration. If the device is
|
||||
* still open, this will be postponed until it is closed.
|
||||
* After a card is removed, gpib_release() will unregister the net
|
||||
* device, and release the PCMCIA configuration. If the device is
|
||||
* still open, this will be postponed until it is closed.
|
||||
*/
|
||||
|
||||
static void cb_gpib_release(struct pcmcia_device *link)
|
||||
|
|
@ -1333,7 +1329,7 @@ static void cb_pcmcia_cleanup_module(void)
|
|||
pcmcia_unregister_driver(&cb_gpib_cs_driver);
|
||||
}
|
||||
|
||||
static gpib_interface_t cb_pcmcia_unaccel_interface = {
|
||||
static struct gpib_interface cb_pcmcia_unaccel_interface = {
|
||||
.name = "cbi_pcmcia_unaccel",
|
||||
.attach = cb_pcmcia_attach,
|
||||
.detach = cb_pcmcia_detach,
|
||||
|
|
@ -1361,7 +1357,7 @@ static gpib_interface_t cb_pcmcia_unaccel_interface = {
|
|||
.return_to_local = cb7210_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t cb_pcmcia_interface = {
|
||||
static struct gpib_interface cb_pcmcia_interface = {
|
||||
.name = "cbi_pcmcia",
|
||||
.attach = cb_pcmcia_attach,
|
||||
.detach = cb_pcmcia_detach,
|
||||
|
|
@ -1389,7 +1385,7 @@ static gpib_interface_t cb_pcmcia_interface = {
|
|||
.return_to_local = cb7210_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t cb_pcmcia_accel_interface = {
|
||||
static struct gpib_interface cb_pcmcia_accel_interface = {
|
||||
.name = "cbi_pcmcia_accel",
|
||||
.attach = cb_pcmcia_attach,
|
||||
.detach = cb_pcmcia_detach,
|
||||
|
|
@ -1417,7 +1413,7 @@ static gpib_interface_t cb_pcmcia_accel_interface = {
|
|||
.return_to_local = cb7210_return_to_local,
|
||||
};
|
||||
|
||||
static int cb_pcmcia_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int cb_pcmcia_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
struct cb7210_priv *cb_priv;
|
||||
struct nec7210_priv *nec_priv;
|
||||
|
|
|
|||
|
|
@ -73,8 +73,8 @@ static inline int cb7210_page_in_bits(unsigned int page)
|
|||
return 0x50 | (page & 0xf);
|
||||
}
|
||||
|
||||
static inline uint8_t cb7210_paged_read_byte(struct cb7210_priv *cb_priv,
|
||||
unsigned int register_num, unsigned int page)
|
||||
static inline u8 cb7210_paged_read_byte(struct cb7210_priv *cb_priv,
|
||||
unsigned int register_num, unsigned int page)
|
||||
{
|
||||
struct nec7210_priv *nec_priv = &cb_priv->nec7210_priv;
|
||||
u8 retval;
|
||||
|
|
@ -89,8 +89,8 @@ static inline uint8_t cb7210_paged_read_byte(struct cb7210_priv *cb_priv,
|
|||
}
|
||||
|
||||
// don't use for register_num < 8, since it doesn't lock
|
||||
static inline uint8_t cb7210_read_byte(const struct cb7210_priv *cb_priv,
|
||||
enum hs_regs register_num)
|
||||
static inline u8 cb7210_read_byte(const struct cb7210_priv *cb_priv,
|
||||
enum hs_regs register_num)
|
||||
{
|
||||
const struct nec7210_priv *nec_priv = &cb_priv->nec7210_priv;
|
||||
u8 retval;
|
||||
|
|
@ -99,7 +99,7 @@ static inline uint8_t cb7210_read_byte(const struct cb7210_priv *cb_priv,
|
|||
return retval;
|
||||
}
|
||||
|
||||
static inline void cb7210_paged_write_byte(struct cb7210_priv *cb_priv, uint8_t data,
|
||||
static inline void cb7210_paged_write_byte(struct cb7210_priv *cb_priv, u8 data,
|
||||
unsigned int register_num, unsigned int page)
|
||||
{
|
||||
struct nec7210_priv *nec_priv = &cb_priv->nec7210_priv;
|
||||
|
|
@ -113,7 +113,7 @@ static inline void cb7210_paged_write_byte(struct cb7210_priv *cb_priv, uint8_t
|
|||
}
|
||||
|
||||
// don't use for register_num < 8, since it doesn't lock
|
||||
static inline void cb7210_write_byte(const struct cb7210_priv *cb_priv, uint8_t data,
|
||||
static inline void cb7210_write_byte(const struct cb7210_priv *cb_priv, u8 data,
|
||||
enum hs_regs register_num)
|
||||
{
|
||||
const struct nec7210_priv *nec_priv = &cb_priv->nec7210_priv;
|
||||
|
|
@ -134,7 +134,8 @@ enum bus_status_bits {
|
|||
|
||||
/* CBI 488.2 HS control */
|
||||
|
||||
/* when both bit 0 and 1 are set, it
|
||||
/*
|
||||
* when both bit 0 and 1 are set, it
|
||||
* 1 clears the transmit state machine to an initial condition
|
||||
* 2 clears any residual interrupts left latched on cbi488.2
|
||||
* 3 resets all control bits in HS_MODE to zero
|
||||
|
|
@ -189,11 +190,12 @@ static inline unsigned int irq_bits(unsigned int irq)
|
|||
}
|
||||
|
||||
enum cb7210_aux_cmds {
|
||||
/* AUX_RTL2 is an undocumented aux command which causes cb7210 to assert
|
||||
* (and keep asserted) local rtl message. This is used in conjunction
|
||||
* with the (stupid) cb7210 implementation
|
||||
* of the normal nec7210 AUX_RTL aux command, which
|
||||
* causes the rtl message to toggle between on and off.
|
||||
/*
|
||||
* AUX_RTL2 is an undocumented aux command which causes cb7210 to assert
|
||||
* (and keep asserted) local rtl message. This is used in conjunction
|
||||
* with the (stupid) cb7210 implementation
|
||||
* of the normal nec7210 AUX_RTL aux command, which
|
||||
* causes the rtl message to toggle between on and off.
|
||||
*/
|
||||
AUX_RTL2 = 0xd,
|
||||
AUX_LO_SPEED = 0x40,
|
||||
|
|
|
|||
|
|
@ -40,12 +40,12 @@ static irqreturn_t cec_interrupt(int irq, void *arg)
|
|||
#define CEC_DEV_ID 0x5cec
|
||||
#define CEC_SUBID 0x9050
|
||||
|
||||
static int cec_pci_attach(struct gpib_board *board, const gpib_board_config_t *config);
|
||||
static int cec_pci_attach(struct gpib_board *board, const struct gpib_board_config *config);
|
||||
|
||||
static void cec_pci_detach(struct gpib_board *board);
|
||||
|
||||
// wrappers for interface functions
|
||||
static int cec_read(struct gpib_board *board, uint8_t *buffer, size_t length, int *end,
|
||||
static int cec_read(struct gpib_board *board, u8 *buffer, size_t length, int *end,
|
||||
size_t *bytes_read)
|
||||
{
|
||||
struct cec_priv *priv = board->private_data;
|
||||
|
|
@ -53,7 +53,7 @@ static int cec_read(struct gpib_board *board, uint8_t *buffer, size_t length, in
|
|||
return nec7210_read(board, &priv->nec7210_priv, buffer, length, end, bytes_read);
|
||||
}
|
||||
|
||||
static int cec_write(struct gpib_board *board, uint8_t *buffer, size_t length, int send_eoi,
|
||||
static int cec_write(struct gpib_board *board, u8 *buffer, size_t length, int send_eoi,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
struct cec_priv *priv = board->private_data;
|
||||
|
|
@ -61,7 +61,7 @@ static int cec_write(struct gpib_board *board, uint8_t *buffer, size_t length, i
|
|||
return nec7210_write(board, &priv->nec7210_priv, buffer, length, send_eoi, bytes_written);
|
||||
}
|
||||
|
||||
static int cec_command(struct gpib_board *board, uint8_t *buffer,
|
||||
static int cec_command(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, size_t *bytes_written)
|
||||
{
|
||||
struct cec_priv *priv = board->private_data;
|
||||
|
|
@ -83,11 +83,11 @@ static int cec_go_to_standby(struct gpib_board *board)
|
|||
return nec7210_go_to_standby(board, &priv->nec7210_priv);
|
||||
}
|
||||
|
||||
static void cec_request_system_control(struct gpib_board *board, int request_control)
|
||||
static int cec_request_system_control(struct gpib_board *board, int request_control)
|
||||
{
|
||||
struct cec_priv *priv = board->private_data;
|
||||
|
||||
nec7210_request_system_control(board, &priv->nec7210_priv, request_control);
|
||||
return nec7210_request_system_control(board, &priv->nec7210_priv, request_control);
|
||||
}
|
||||
|
||||
static void cec_interface_clear(struct gpib_board *board, int assert)
|
||||
|
|
@ -104,7 +104,7 @@ static void cec_remote_enable(struct gpib_board *board, int enable)
|
|||
nec7210_remote_enable(board, &priv->nec7210_priv, enable);
|
||||
}
|
||||
|
||||
static int cec_enable_eos(struct gpib_board *board, uint8_t eos_byte, int compare_8_bits)
|
||||
static int cec_enable_eos(struct gpib_board *board, u8 eos_byte, int compare_8_bits)
|
||||
{
|
||||
struct cec_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -139,14 +139,14 @@ static int cec_secondary_address(struct gpib_board *board, unsigned int address,
|
|||
return nec7210_secondary_address(board, &priv->nec7210_priv, address, enable);
|
||||
}
|
||||
|
||||
static int cec_parallel_poll(struct gpib_board *board, uint8_t *result)
|
||||
static int cec_parallel_poll(struct gpib_board *board, u8 *result)
|
||||
{
|
||||
struct cec_priv *priv = board->private_data;
|
||||
|
||||
return nec7210_parallel_poll(board, &priv->nec7210_priv, result);
|
||||
}
|
||||
|
||||
static void cec_parallel_poll_configure(struct gpib_board *board, uint8_t config)
|
||||
static void cec_parallel_poll_configure(struct gpib_board *board, u8 config)
|
||||
{
|
||||
struct cec_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -160,14 +160,14 @@ static void cec_parallel_poll_response(struct gpib_board *board, int ist)
|
|||
nec7210_parallel_poll_response(board, &priv->nec7210_priv, ist);
|
||||
}
|
||||
|
||||
static void cec_serial_poll_response(struct gpib_board *board, uint8_t status)
|
||||
static void cec_serial_poll_response(struct gpib_board *board, u8 status)
|
||||
{
|
||||
struct cec_priv *priv = board->private_data;
|
||||
|
||||
nec7210_serial_poll_response(board, &priv->nec7210_priv, status);
|
||||
}
|
||||
|
||||
static uint8_t cec_serial_poll_status(struct gpib_board *board)
|
||||
static u8 cec_serial_poll_status(struct gpib_board *board)
|
||||
{
|
||||
struct cec_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -188,7 +188,7 @@ static void cec_return_to_local(struct gpib_board *board)
|
|||
nec7210_return_to_local(board, &priv->nec7210_priv);
|
||||
}
|
||||
|
||||
static gpib_interface_t cec_pci_interface = {
|
||||
static struct gpib_interface cec_pci_interface = {
|
||||
.name = "cec_pci",
|
||||
.attach = cec_pci_attach,
|
||||
.detach = cec_pci_detach,
|
||||
|
|
@ -265,7 +265,7 @@ static void cec_init(struct cec_priv *cec_priv, const struct gpib_board *board)
|
|||
nec7210_board_online(nec_priv, board);
|
||||
}
|
||||
|
||||
static int cec_pci_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int cec_pci_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
struct cec_priv *cec_priv;
|
||||
struct nec7210_priv *nec_priv;
|
||||
|
|
|
|||
|
|
@ -26,35 +26,37 @@ MODULE_LICENSE("GPL");
|
|||
MODULE_DESCRIPTION("GPIB base support");
|
||||
MODULE_ALIAS_CHARDEV_MAJOR(GPIB_CODE);
|
||||
|
||||
static int board_type_ioctl(gpib_file_private_t *file_priv, struct gpib_board *board, unsigned long arg);
|
||||
static int read_ioctl(gpib_file_private_t *file_priv, struct gpib_board *board,
|
||||
static int board_type_ioctl(struct gpib_file_private *file_priv,
|
||||
struct gpib_board *board, unsigned long arg);
|
||||
static int read_ioctl(struct gpib_file_private *file_priv, struct gpib_board *board,
|
||||
unsigned long arg);
|
||||
static int write_ioctl(gpib_file_private_t *file_priv, struct gpib_board *board,
|
||||
static int write_ioctl(struct gpib_file_private *file_priv, struct gpib_board *board,
|
||||
unsigned long arg);
|
||||
static int command_ioctl(gpib_file_private_t *file_priv, struct gpib_board *board,
|
||||
static int command_ioctl(struct gpib_file_private *file_priv, struct gpib_board *board,
|
||||
unsigned long arg);
|
||||
static int open_dev_ioctl(struct file *filep, struct gpib_board *board, unsigned long arg);
|
||||
static int close_dev_ioctl(struct file *filep, struct gpib_board *board, unsigned long arg);
|
||||
static int serial_poll_ioctl(struct gpib_board *board, unsigned long arg);
|
||||
static int wait_ioctl(gpib_file_private_t *file_priv, struct gpib_board *board, unsigned long arg);
|
||||
static int wait_ioctl(struct gpib_file_private *file_priv,
|
||||
struct gpib_board *board, unsigned long arg);
|
||||
static int parallel_poll_ioctl(struct gpib_board *board, unsigned long arg);
|
||||
static int online_ioctl(struct gpib_board *board, unsigned long arg);
|
||||
static int remote_enable_ioctl(struct gpib_board *board, unsigned long arg);
|
||||
static int take_control_ioctl(struct gpib_board *board, unsigned long arg);
|
||||
static int line_status_ioctl(struct gpib_board *board, unsigned long arg);
|
||||
static int pad_ioctl(struct gpib_board *board, gpib_file_private_t *file_priv,
|
||||
static int pad_ioctl(struct gpib_board *board, struct gpib_file_private *file_priv,
|
||||
unsigned long arg);
|
||||
static int sad_ioctl(struct gpib_board *board, gpib_file_private_t *file_priv,
|
||||
static int sad_ioctl(struct gpib_board *board, struct gpib_file_private *file_priv,
|
||||
unsigned long arg);
|
||||
static int eos_ioctl(struct gpib_board *board, unsigned long arg);
|
||||
static int request_service_ioctl(struct gpib_board *board, unsigned long arg);
|
||||
static int request_service2_ioctl(struct gpib_board *board, unsigned long arg);
|
||||
static int iobase_ioctl(gpib_board_config_t *config, unsigned long arg);
|
||||
static int irq_ioctl(gpib_board_config_t *config, unsigned long arg);
|
||||
static int dma_ioctl(gpib_board_config_t *config, unsigned long arg);
|
||||
static int autospoll_ioctl(struct gpib_board *board, gpib_file_private_t *file_priv,
|
||||
static int iobase_ioctl(struct gpib_board_config *config, unsigned long arg);
|
||||
static int irq_ioctl(struct gpib_board_config *config, unsigned long arg);
|
||||
static int dma_ioctl(struct gpib_board_config *config, unsigned long arg);
|
||||
static int autospoll_ioctl(struct gpib_board *board, struct gpib_file_private *file_priv,
|
||||
unsigned long arg);
|
||||
static int mutex_ioctl(struct gpib_board *board, gpib_file_private_t *file_priv,
|
||||
static int mutex_ioctl(struct gpib_board *board, struct gpib_file_private *file_priv,
|
||||
unsigned long arg);
|
||||
static int timeout_ioctl(struct gpib_board *board, unsigned long arg);
|
||||
static int status_bytes_ioctl(struct gpib_board *board, unsigned long arg);
|
||||
|
|
@ -64,15 +66,16 @@ static int set_local_ppoll_mode_ioctl(struct gpib_board *board, unsigned long ar
|
|||
static int get_local_ppoll_mode_ioctl(struct gpib_board *board, unsigned long arg);
|
||||
static int query_board_rsv_ioctl(struct gpib_board *board, unsigned long arg);
|
||||
static int interface_clear_ioctl(struct gpib_board *board, unsigned long arg);
|
||||
static int select_pci_ioctl(gpib_board_config_t *config, unsigned long arg);
|
||||
static int select_device_path_ioctl(gpib_board_config_t *config, unsigned long arg);
|
||||
static int select_pci_ioctl(struct gpib_board_config *config, unsigned long arg);
|
||||
static int select_device_path_ioctl(struct gpib_board_config *config, unsigned long arg);
|
||||
static int event_ioctl(struct gpib_board *board, unsigned long arg);
|
||||
static int request_system_control_ioctl(struct gpib_board *board, unsigned long arg);
|
||||
static int t1_delay_ioctl(struct gpib_board *board, unsigned long arg);
|
||||
|
||||
static int cleanup_open_devices(gpib_file_private_t *file_priv, struct gpib_board *board);
|
||||
static int cleanup_open_devices(struct gpib_file_private *file_priv, struct gpib_board *board);
|
||||
|
||||
static int pop_gpib_event_nolock(struct gpib_board *board, gpib_event_queue_t *queue, short *event_type);
|
||||
static int pop_gpib_event_nolock(struct gpib_board *board,
|
||||
struct gpib_event_queue *queue, short *event_type);
|
||||
|
||||
/*
|
||||
* Timer functions
|
||||
|
|
@ -119,7 +122,8 @@ int io_timed_out(struct gpib_board *board)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* this is a function instead of a constant because of Suse
|
||||
/*
|
||||
* this is a function instead of a constant because of Suse
|
||||
* defining HZ to be a function call to get_hz()
|
||||
*/
|
||||
static inline int pseudo_irq_period(void)
|
||||
|
|
@ -170,7 +174,7 @@ EXPORT_SYMBOL(gpib_free_pseudo_irq);
|
|||
|
||||
static const unsigned int serial_timeout = 1000000;
|
||||
|
||||
unsigned int num_status_bytes(const gpib_status_queue_t *dev)
|
||||
unsigned int num_status_bytes(const struct gpib_status_queue *dev)
|
||||
{
|
||||
if (!dev)
|
||||
return 0;
|
||||
|
|
@ -178,10 +182,10 @@ unsigned int num_status_bytes(const gpib_status_queue_t *dev)
|
|||
}
|
||||
|
||||
// push status byte onto back of status byte fifo
|
||||
int push_status_byte(struct gpib_board *board, gpib_status_queue_t *device, u8 poll_byte)
|
||||
int push_status_byte(struct gpib_board *board, struct gpib_status_queue *device, u8 poll_byte)
|
||||
{
|
||||
struct list_head *head = &device->status_bytes;
|
||||
status_byte_t *status;
|
||||
struct gpib_status_byte *status;
|
||||
static const unsigned int max_num_status_bytes = 1024;
|
||||
int retval;
|
||||
|
||||
|
|
@ -194,7 +198,7 @@ int push_status_byte(struct gpib_board *board, gpib_status_queue_t *device, u8 p
|
|||
return retval;
|
||||
}
|
||||
|
||||
status = kmalloc(sizeof(status_byte_t), GFP_KERNEL);
|
||||
status = kmalloc(sizeof(*status), GFP_KERNEL);
|
||||
if (!status)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
@ -212,11 +216,11 @@ int push_status_byte(struct gpib_board *board, gpib_status_queue_t *device, u8 p
|
|||
}
|
||||
|
||||
// pop status byte from front of status byte fifo
|
||||
int pop_status_byte(struct gpib_board *board, gpib_status_queue_t *device, u8 *poll_byte)
|
||||
int pop_status_byte(struct gpib_board *board, struct gpib_status_queue *device, u8 *poll_byte)
|
||||
{
|
||||
struct list_head *head = &device->status_bytes;
|
||||
struct list_head *front = head->next;
|
||||
status_byte_t *status;
|
||||
struct gpib_status_byte *status;
|
||||
|
||||
if (num_status_bytes(device) == 0)
|
||||
return -EIO;
|
||||
|
|
@ -229,7 +233,7 @@ int pop_status_byte(struct gpib_board *board, gpib_status_queue_t *device, u8 *p
|
|||
return -EPIPE;
|
||||
}
|
||||
|
||||
status = list_entry(front, status_byte_t, list);
|
||||
status = list_entry(front, struct gpib_status_byte, list);
|
||||
*poll_byte = status->poll_byte;
|
||||
|
||||
list_del(front);
|
||||
|
|
@ -243,14 +247,14 @@ int pop_status_byte(struct gpib_board *board, gpib_status_queue_t *device, u8 *p
|
|||
return 0;
|
||||
}
|
||||
|
||||
gpib_status_queue_t *get_gpib_status_queue(struct gpib_board *board, unsigned int pad, int sad)
|
||||
struct gpib_status_queue *get_gpib_status_queue(struct gpib_board *board, unsigned int pad, int sad)
|
||||
{
|
||||
gpib_status_queue_t *device;
|
||||
struct gpib_status_queue *device;
|
||||
struct list_head *list_ptr;
|
||||
const struct list_head *head = &board->device_list;
|
||||
|
||||
for (list_ptr = head->next; list_ptr != head; list_ptr = list_ptr->next) {
|
||||
device = list_entry(list_ptr, gpib_status_queue_t, list);
|
||||
device = list_entry(list_ptr, struct gpib_status_queue, list);
|
||||
if (gpib_address_equal(device->pad, device->sad, pad, sad))
|
||||
return device;
|
||||
}
|
||||
|
|
@ -258,10 +262,10 @@ gpib_status_queue_t *get_gpib_status_queue(struct gpib_board *board, unsigned in
|
|||
return NULL;
|
||||
}
|
||||
|
||||
int get_serial_poll_byte(struct gpib_board *board, unsigned int pad, int sad, unsigned int usec_timeout,
|
||||
uint8_t *poll_byte)
|
||||
int get_serial_poll_byte(struct gpib_board *board, unsigned int pad, int sad,
|
||||
unsigned int usec_timeout, u8 *poll_byte)
|
||||
{
|
||||
gpib_status_queue_t *device;
|
||||
struct gpib_status_queue *device;
|
||||
|
||||
device = get_gpib_status_queue(board, pad, sad);
|
||||
if (num_status_bytes(device))
|
||||
|
|
@ -291,7 +295,8 @@ int autopoll_all_devices(struct gpib_board *board)
|
|||
}
|
||||
|
||||
dev_dbg(board->gpib_dev, "complete\n");
|
||||
/* need to wake wait queue in case someone is
|
||||
/*
|
||||
* need to wake wait queue in case someone is
|
||||
* waiting on RQS
|
||||
*/
|
||||
wake_up_interruptible(&board->wait);
|
||||
|
|
@ -334,7 +339,7 @@ static int setup_serial_poll(struct gpib_board *board, unsigned int usec_timeout
|
|||
}
|
||||
|
||||
static int read_serial_poll_byte(struct gpib_board *board, unsigned int pad,
|
||||
int sad, unsigned int usec_timeout, uint8_t *result)
|
||||
int sad, unsigned int usec_timeout, u8 *result)
|
||||
{
|
||||
u8 cmd_string[8];
|
||||
int end_flag;
|
||||
|
|
@ -405,7 +410,7 @@ static int cleanup_serial_poll(struct gpib_board *board, unsigned int usec_timeo
|
|||
}
|
||||
|
||||
static int serial_poll_single(struct gpib_board *board, unsigned int pad, int sad,
|
||||
unsigned int usec_timeout, uint8_t *result)
|
||||
unsigned int usec_timeout, u8 *result)
|
||||
{
|
||||
int retval, cleanup_retval;
|
||||
|
||||
|
|
@ -427,7 +432,7 @@ int serial_poll_all(struct gpib_board *board, unsigned int usec_timeout)
|
|||
int retval = 0;
|
||||
struct list_head *cur;
|
||||
const struct list_head *head = NULL;
|
||||
gpib_status_queue_t *device;
|
||||
struct gpib_status_queue *device;
|
||||
u8 result;
|
||||
unsigned int num_bytes = 0;
|
||||
|
||||
|
|
@ -440,7 +445,7 @@ int serial_poll_all(struct gpib_board *board, unsigned int usec_timeout)
|
|||
return retval;
|
||||
|
||||
for (cur = head->next; cur != head; cur = cur->next) {
|
||||
device = list_entry(cur, gpib_status_queue_t, list);
|
||||
device = list_entry(cur, struct gpib_status_queue, list);
|
||||
retval = read_serial_poll_byte(board,
|
||||
device->pad, device->sad, usec_timeout, &result);
|
||||
if (retval < 0)
|
||||
|
|
@ -470,7 +475,7 @@ int serial_poll_all(struct gpib_board *board, unsigned int usec_timeout)
|
|||
*/
|
||||
|
||||
int dvrsp(struct gpib_board *board, unsigned int pad, int sad,
|
||||
unsigned int usec_timeout, uint8_t *result)
|
||||
unsigned int usec_timeout, u8 *result)
|
||||
{
|
||||
int status = ibstatus(board);
|
||||
int retval;
|
||||
|
|
@ -492,8 +497,8 @@ int dvrsp(struct gpib_board *board, unsigned int pad, int sad,
|
|||
return retval;
|
||||
}
|
||||
|
||||
static gpib_descriptor_t *handle_to_descriptor(const gpib_file_private_t *file_priv,
|
||||
int handle)
|
||||
static struct gpib_descriptor *handle_to_descriptor(const struct gpib_file_private *file_priv,
|
||||
int handle)
|
||||
{
|
||||
if (handle < 0 || handle >= GPIB_MAX_NUM_DESCRIPTORS) {
|
||||
pr_err("gpib: invalid handle %i\n", handle);
|
||||
|
|
@ -503,11 +508,11 @@ static gpib_descriptor_t *handle_to_descriptor(const gpib_file_private_t *file_p
|
|||
return file_priv->descriptors[handle];
|
||||
}
|
||||
|
||||
static int init_gpib_file_private(gpib_file_private_t *priv)
|
||||
static int init_gpib_file_private(struct gpib_file_private *priv)
|
||||
{
|
||||
memset(priv, 0, sizeof(*priv));
|
||||
atomic_set(&priv->holding_mutex, 0);
|
||||
priv->descriptors[0] = kmalloc(sizeof(gpib_descriptor_t), GFP_KERNEL);
|
||||
priv->descriptors[0] = kmalloc(sizeof(struct gpib_descriptor), GFP_KERNEL);
|
||||
if (!priv->descriptors[0]) {
|
||||
pr_err("gpib: failed to allocate default board descriptor\n");
|
||||
return -ENOMEM;
|
||||
|
|
@ -522,7 +527,7 @@ int ibopen(struct inode *inode, struct file *filep)
|
|||
{
|
||||
unsigned int minor = iminor(inode);
|
||||
struct gpib_board *board;
|
||||
gpib_file_private_t *priv;
|
||||
struct gpib_file_private *priv;
|
||||
|
||||
if (minor >= GPIB_MAX_NUM_BOARDS) {
|
||||
pr_err("gpib: invalid minor number of device file\n");
|
||||
|
|
@ -531,12 +536,12 @@ int ibopen(struct inode *inode, struct file *filep)
|
|||
|
||||
board = &board_array[minor];
|
||||
|
||||
filep->private_data = kmalloc(sizeof(gpib_file_private_t), GFP_KERNEL);
|
||||
filep->private_data = kmalloc(sizeof(struct gpib_file_private), GFP_KERNEL);
|
||||
if (!filep->private_data)
|
||||
return -ENOMEM;
|
||||
|
||||
priv = filep->private_data;
|
||||
init_gpib_file_private((gpib_file_private_t *)filep->private_data);
|
||||
init_gpib_file_private((struct gpib_file_private *)filep->private_data);
|
||||
|
||||
if (board->use_count == 0) {
|
||||
int retval;
|
||||
|
|
@ -560,8 +565,8 @@ int ibclose(struct inode *inode, struct file *filep)
|
|||
{
|
||||
unsigned int minor = iminor(inode);
|
||||
struct gpib_board *board;
|
||||
gpib_file_private_t *priv = filep->private_data;
|
||||
gpib_descriptor_t *desc;
|
||||
struct gpib_file_private *priv = filep->private_data;
|
||||
struct gpib_descriptor *desc;
|
||||
|
||||
if (minor >= GPIB_MAX_NUM_BOARDS) {
|
||||
pr_err("gpib: invalid minor number of device file\n");
|
||||
|
|
@ -606,7 +611,7 @@ long ibioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
|||
{
|
||||
unsigned int minor = iminor(filep->f_path.dentry->d_inode);
|
||||
struct gpib_board *board;
|
||||
gpib_file_private_t *file_priv = filep->private_data;
|
||||
struct gpib_file_private *file_priv = filep->private_data;
|
||||
long retval = -ENOTTY;
|
||||
|
||||
if (minor >= GPIB_MAX_NUM_BOARDS) {
|
||||
|
|
@ -665,8 +670,9 @@ long ibioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
|||
retval = board_info_ioctl(board, arg);
|
||||
goto done;
|
||||
case IBMUTEX:
|
||||
/* Need to unlock board->big_gpib_mutex before potentially locking board->user_mutex
|
||||
* to maintain consistent locking order
|
||||
/*
|
||||
* Need to unlock board->big_gpib_mutex before potentially locking board->user_mutex
|
||||
* to maintain consistent locking order
|
||||
*/
|
||||
mutex_unlock(&board->big_gpib_mutex);
|
||||
return mutex_ioctl(board, file_priv, arg);
|
||||
|
|
@ -736,8 +742,9 @@ long ibioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
|||
retval = take_control_ioctl(board, arg);
|
||||
goto done;
|
||||
case IBCMD:
|
||||
/* IO ioctls can take a long time, we need to unlock board->big_gpib_mutex
|
||||
* before we call them.
|
||||
/*
|
||||
* IO ioctls can take a long time, we need to unlock board->big_gpib_mutex
|
||||
* before we call them.
|
||||
*/
|
||||
mutex_unlock(&board->big_gpib_mutex);
|
||||
return command_ioctl(file_priv, board, arg);
|
||||
|
|
@ -760,8 +767,9 @@ long ibioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
|||
retval = query_board_rsv_ioctl(board, arg);
|
||||
goto done;
|
||||
case IBRD:
|
||||
/* IO ioctls can take a long time, we need to unlock board->big_gpib_mutex
|
||||
* before we call them.
|
||||
/*
|
||||
* IO ioctls can take a long time, we need to unlock board->big_gpib_mutex
|
||||
* before we call them.
|
||||
*/
|
||||
mutex_unlock(&board->big_gpib_mutex);
|
||||
return read_ioctl(file_priv, board, arg);
|
||||
|
|
@ -790,8 +798,9 @@ long ibioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
|||
retval = timeout_ioctl(board, arg);
|
||||
goto done;
|
||||
case IBWRT:
|
||||
/* IO ioctls can take a long time, we need to unlock board->big_gpib_mutex
|
||||
* before we call them.
|
||||
/*
|
||||
* IO ioctls can take a long time, we need to unlock board->big_gpib_mutex
|
||||
* before we call them.
|
||||
*/
|
||||
mutex_unlock(&board->big_gpib_mutex);
|
||||
return write_ioctl(file_priv, board, arg);
|
||||
|
|
@ -806,10 +815,11 @@ done:
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int board_type_ioctl(gpib_file_private_t *file_priv, struct gpib_board *board, unsigned long arg)
|
||||
static int board_type_ioctl(struct gpib_file_private *file_priv,
|
||||
struct gpib_board *board, unsigned long arg)
|
||||
{
|
||||
struct list_head *list_ptr;
|
||||
board_type_ioctl_t cmd;
|
||||
struct gpib_board_type_ioctl cmd;
|
||||
int retval;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
|
|
@ -817,15 +827,16 @@ static int board_type_ioctl(gpib_file_private_t *file_priv, struct gpib_board *b
|
|||
if (board->online)
|
||||
return -EBUSY;
|
||||
|
||||
retval = copy_from_user(&cmd, (void __user *)arg, sizeof(board_type_ioctl_t));
|
||||
retval = copy_from_user(&cmd, (void __user *)arg,
|
||||
sizeof(struct gpib_board_type_ioctl));
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
for (list_ptr = registered_drivers.next; list_ptr != ®istered_drivers;
|
||||
list_ptr = list_ptr->next) {
|
||||
gpib_interface_list_t *entry;
|
||||
struct gpib_interface_list *entry;
|
||||
|
||||
entry = list_entry(list_ptr, gpib_interface_list_t, list);
|
||||
entry = list_entry(list_ptr, struct gpib_interface_list, list);
|
||||
if (strcmp(entry->interface->name, cmd.name) == 0) {
|
||||
int i;
|
||||
int had_module = file_priv->got_module;
|
||||
|
|
@ -857,16 +868,16 @@ static int board_type_ioctl(gpib_file_private_t *file_priv, struct gpib_board *b
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int read_ioctl(gpib_file_private_t *file_priv, struct gpib_board *board,
|
||||
static int read_ioctl(struct gpib_file_private *file_priv, struct gpib_board *board,
|
||||
unsigned long arg)
|
||||
{
|
||||
read_write_ioctl_t read_cmd;
|
||||
struct gpib_read_write_ioctl read_cmd;
|
||||
u8 __user *userbuf;
|
||||
unsigned long remain;
|
||||
int end_flag = 0;
|
||||
int retval;
|
||||
ssize_t read_ret = 0;
|
||||
gpib_descriptor_t *desc;
|
||||
struct gpib_descriptor *desc;
|
||||
size_t nbytes;
|
||||
|
||||
retval = copy_from_user(&read_cmd, (void __user *)arg, sizeof(read_cmd));
|
||||
|
|
@ -913,7 +924,8 @@ static int read_ioctl(gpib_file_private_t *file_priv, struct gpib_board *board,
|
|||
}
|
||||
read_cmd.completed_transfer_count = read_cmd.requested_transfer_count - remain;
|
||||
read_cmd.end = end_flag;
|
||||
/* suppress errors (for example due to timeout or interruption by device clear)
|
||||
/*
|
||||
* suppress errors (for example due to timeout or interruption by device clear)
|
||||
* if all bytes got sent. This prevents races that can occur in the various drivers
|
||||
* if a device receives a device clear immediately after a transfer completes and
|
||||
* the driver code wasn't careful enough to handle that case.
|
||||
|
|
@ -932,15 +944,15 @@ static int read_ioctl(gpib_file_private_t *file_priv, struct gpib_board *board,
|
|||
return read_ret;
|
||||
}
|
||||
|
||||
static int command_ioctl(gpib_file_private_t *file_priv,
|
||||
static int command_ioctl(struct gpib_file_private *file_priv,
|
||||
struct gpib_board *board, unsigned long arg)
|
||||
{
|
||||
read_write_ioctl_t cmd;
|
||||
struct gpib_read_write_ioctl cmd;
|
||||
u8 __user *userbuf;
|
||||
unsigned long remain;
|
||||
int retval;
|
||||
int fault = 0;
|
||||
gpib_descriptor_t *desc;
|
||||
struct gpib_descriptor *desc;
|
||||
size_t bytes_written;
|
||||
int no_clear_io_in_prog;
|
||||
|
||||
|
|
@ -967,10 +979,11 @@ static int command_ioctl(gpib_file_private_t *file_priv,
|
|||
if (!access_ok(userbuf, remain))
|
||||
return -EFAULT;
|
||||
|
||||
/* Write buffer loads till we empty the user supplied buffer.
|
||||
* Call drivers at least once, even if remain is zero, in
|
||||
* order to allow them to insure previous commands were
|
||||
* completely finished, in the case of a restarted ioctl.
|
||||
/*
|
||||
* Write buffer loads till we empty the user supplied buffer.
|
||||
* Call drivers at least once, even if remain is zero, in
|
||||
* order to allow them to insure previous commands were
|
||||
* completely finished, in the case of a restarted ioctl.
|
||||
*/
|
||||
|
||||
atomic_set(&desc->io_in_progress, 1);
|
||||
|
|
@ -1016,15 +1029,15 @@ static int command_ioctl(gpib_file_private_t *file_priv,
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int write_ioctl(gpib_file_private_t *file_priv, struct gpib_board *board,
|
||||
static int write_ioctl(struct gpib_file_private *file_priv, struct gpib_board *board,
|
||||
unsigned long arg)
|
||||
{
|
||||
read_write_ioctl_t write_cmd;
|
||||
struct gpib_read_write_ioctl write_cmd;
|
||||
u8 __user *userbuf;
|
||||
unsigned long remain;
|
||||
int retval = 0;
|
||||
int fault;
|
||||
gpib_descriptor_t *desc;
|
||||
struct gpib_descriptor *desc;
|
||||
|
||||
fault = copy_from_user(&write_cmd, (void __user *)arg, sizeof(write_cmd));
|
||||
if (fault)
|
||||
|
|
@ -1068,7 +1081,8 @@ static int write_ioctl(gpib_file_private_t *file_priv, struct gpib_board *board,
|
|||
break;
|
||||
}
|
||||
write_cmd.completed_transfer_count = write_cmd.requested_transfer_count - remain;
|
||||
/* suppress errors (for example due to timeout or interruption by device clear)
|
||||
/*
|
||||
* suppress errors (for example due to timeout or interruption by device clear)
|
||||
* if all bytes got sent. This prevents races that can occur in the various drivers
|
||||
* if a device receives a device clear immediately after a transfer completes and
|
||||
* the driver code wasn't careful enough to handle that case.
|
||||
|
|
@ -1089,8 +1103,8 @@ static int write_ioctl(gpib_file_private_t *file_priv, struct gpib_board *board,
|
|||
|
||||
static int status_bytes_ioctl(struct gpib_board *board, unsigned long arg)
|
||||
{
|
||||
gpib_status_queue_t *device;
|
||||
spoll_bytes_ioctl_t cmd;
|
||||
struct gpib_status_queue *device;
|
||||
struct gpib_spoll_bytes_ioctl cmd;
|
||||
int retval;
|
||||
|
||||
retval = copy_from_user(&cmd, (void __user *)arg, sizeof(cmd));
|
||||
|
|
@ -1114,13 +1128,14 @@ static int increment_open_device_count(struct gpib_board *board, struct list_hea
|
|||
unsigned int pad, int sad)
|
||||
{
|
||||
struct list_head *list_ptr;
|
||||
gpib_status_queue_t *device;
|
||||
struct gpib_status_queue *device;
|
||||
|
||||
/* first see if address has already been opened, then increment
|
||||
/*
|
||||
* first see if address has already been opened, then increment
|
||||
* open count
|
||||
*/
|
||||
for (list_ptr = head->next; list_ptr != head; list_ptr = list_ptr->next) {
|
||||
device = list_entry(list_ptr, gpib_status_queue_t, list);
|
||||
device = list_entry(list_ptr, struct gpib_status_queue, list);
|
||||
if (gpib_address_equal(device->pad, device->sad, pad, sad)) {
|
||||
dev_dbg(board->gpib_dev, "incrementing open count for pad %i, sad %i\n",
|
||||
device->pad, device->sad);
|
||||
|
|
@ -1129,8 +1144,8 @@ static int increment_open_device_count(struct gpib_board *board, struct list_hea
|
|||
}
|
||||
}
|
||||
|
||||
/* otherwise we need to allocate a new gpib_status_queue_t */
|
||||
device = kmalloc(sizeof(gpib_status_queue_t), GFP_ATOMIC);
|
||||
/* otherwise we need to allocate a new struct gpib_status_queue */
|
||||
device = kmalloc(sizeof(struct gpib_status_queue), GFP_ATOMIC);
|
||||
if (!device)
|
||||
return -ENOMEM;
|
||||
init_gpib_status_queue(device);
|
||||
|
|
@ -1148,11 +1163,11 @@ static int increment_open_device_count(struct gpib_board *board, struct list_hea
|
|||
static int subtract_open_device_count(struct gpib_board *board, struct list_head *head,
|
||||
unsigned int pad, int sad, unsigned int count)
|
||||
{
|
||||
gpib_status_queue_t *device;
|
||||
struct gpib_status_queue *device;
|
||||
struct list_head *list_ptr;
|
||||
|
||||
for (list_ptr = head->next; list_ptr != head; list_ptr = list_ptr->next) {
|
||||
device = list_entry(list_ptr, gpib_status_queue_t, list);
|
||||
device = list_entry(list_ptr, struct gpib_status_queue, list);
|
||||
if (gpib_address_equal(device->pad, device->sad, pad, sad)) {
|
||||
dev_dbg(board->gpib_dev, "decrementing open count for pad %i, sad %i\n",
|
||||
device->pad, device->sad);
|
||||
|
|
@ -1180,13 +1195,13 @@ static inline int decrement_open_device_count(struct gpib_board *board, struct l
|
|||
return subtract_open_device_count(board, head, pad, sad, 1);
|
||||
}
|
||||
|
||||
static int cleanup_open_devices(gpib_file_private_t *file_priv, struct gpib_board *board)
|
||||
static int cleanup_open_devices(struct gpib_file_private *file_priv, struct gpib_board *board)
|
||||
{
|
||||
int retval = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < GPIB_MAX_NUM_DESCRIPTORS; i++) {
|
||||
gpib_descriptor_t *desc;
|
||||
struct gpib_descriptor *desc;
|
||||
|
||||
desc = file_priv->descriptors[i];
|
||||
if (!desc)
|
||||
|
|
@ -1207,9 +1222,9 @@ static int cleanup_open_devices(gpib_file_private_t *file_priv, struct gpib_boar
|
|||
|
||||
static int open_dev_ioctl(struct file *filep, struct gpib_board *board, unsigned long arg)
|
||||
{
|
||||
open_dev_ioctl_t open_dev_cmd;
|
||||
struct gpib_open_dev_ioctl open_dev_cmd;
|
||||
int retval;
|
||||
gpib_file_private_t *file_priv = filep->private_data;
|
||||
struct gpib_file_private *file_priv = filep->private_data;
|
||||
int i;
|
||||
|
||||
retval = copy_from_user(&open_dev_cmd, (void __user *)arg, sizeof(open_dev_cmd));
|
||||
|
|
@ -1225,7 +1240,7 @@ static int open_dev_ioctl(struct file *filep, struct gpib_board *board, unsigned
|
|||
mutex_unlock(&file_priv->descriptors_mutex);
|
||||
return -ERANGE;
|
||||
}
|
||||
file_priv->descriptors[i] = kmalloc(sizeof(gpib_descriptor_t), GFP_KERNEL);
|
||||
file_priv->descriptors[i] = kmalloc(sizeof(struct gpib_descriptor), GFP_KERNEL);
|
||||
if (!file_priv->descriptors[i]) {
|
||||
mutex_unlock(&file_priv->descriptors_mutex);
|
||||
return -ENOMEM;
|
||||
|
|
@ -1242,7 +1257,8 @@ static int open_dev_ioctl(struct file *filep, struct gpib_board *board, unsigned
|
|||
if (retval < 0)
|
||||
return retval;
|
||||
|
||||
/* clear stuck srq state, since we may be able to find service request on
|
||||
/*
|
||||
* clear stuck srq state, since we may be able to find service request on
|
||||
* the new device
|
||||
*/
|
||||
atomic_set(&board->stuck_srq, 0);
|
||||
|
|
@ -1257,8 +1273,8 @@ static int open_dev_ioctl(struct file *filep, struct gpib_board *board, unsigned
|
|||
|
||||
static int close_dev_ioctl(struct file *filep, struct gpib_board *board, unsigned long arg)
|
||||
{
|
||||
close_dev_ioctl_t cmd;
|
||||
gpib_file_private_t *file_priv = filep->private_data;
|
||||
struct gpib_close_dev_ioctl cmd;
|
||||
struct gpib_file_private *file_priv = filep->private_data;
|
||||
int retval;
|
||||
|
||||
retval = copy_from_user(&cmd, (void __user *)arg, sizeof(cmd));
|
||||
|
|
@ -1284,7 +1300,7 @@ static int close_dev_ioctl(struct file *filep, struct gpib_board *board, unsigne
|
|||
|
||||
static int serial_poll_ioctl(struct gpib_board *board, unsigned long arg)
|
||||
{
|
||||
serial_poll_ioctl_t serial_cmd;
|
||||
struct gpib_serial_poll_ioctl serial_cmd;
|
||||
int retval;
|
||||
|
||||
retval = copy_from_user(&serial_cmd, (void __user *)arg, sizeof(serial_cmd));
|
||||
|
|
@ -1303,12 +1319,12 @@ static int serial_poll_ioctl(struct gpib_board *board, unsigned long arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int wait_ioctl(gpib_file_private_t *file_priv, struct gpib_board *board,
|
||||
static int wait_ioctl(struct gpib_file_private *file_priv, struct gpib_board *board,
|
||||
unsigned long arg)
|
||||
{
|
||||
wait_ioctl_t wait_cmd;
|
||||
struct gpib_wait_ioctl wait_cmd;
|
||||
int retval;
|
||||
gpib_descriptor_t *desc;
|
||||
struct gpib_descriptor *desc;
|
||||
|
||||
retval = copy_from_user(&wait_cmd, (void __user *)arg, sizeof(wait_cmd));
|
||||
if (retval)
|
||||
|
|
@ -1348,7 +1364,7 @@ static int parallel_poll_ioctl(struct gpib_board *board, unsigned long arg)
|
|||
|
||||
static int online_ioctl(struct gpib_board *board, unsigned long arg)
|
||||
{
|
||||
online_ioctl_t online_cmd;
|
||||
struct gpib_online_ioctl online_cmd;
|
||||
int retval;
|
||||
void __user *init_data = NULL;
|
||||
|
||||
|
|
@ -1430,12 +1446,12 @@ static int line_status_ioctl(struct gpib_board *board, unsigned long arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int pad_ioctl(struct gpib_board *board, gpib_file_private_t *file_priv,
|
||||
static int pad_ioctl(struct gpib_board *board, struct gpib_file_private *file_priv,
|
||||
unsigned long arg)
|
||||
{
|
||||
pad_ioctl_t cmd;
|
||||
struct gpib_pad_ioctl cmd;
|
||||
int retval;
|
||||
gpib_descriptor_t *desc;
|
||||
struct gpib_descriptor *desc;
|
||||
|
||||
retval = copy_from_user(&cmd, (void __user *)arg, sizeof(cmd));
|
||||
if (retval)
|
||||
|
|
@ -1466,12 +1482,12 @@ static int pad_ioctl(struct gpib_board *board, gpib_file_private_t *file_priv,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int sad_ioctl(struct gpib_board *board, gpib_file_private_t *file_priv,
|
||||
static int sad_ioctl(struct gpib_board *board, struct gpib_file_private *file_priv,
|
||||
unsigned long arg)
|
||||
{
|
||||
sad_ioctl_t cmd;
|
||||
struct gpib_sad_ioctl cmd;
|
||||
int retval;
|
||||
gpib_descriptor_t *desc;
|
||||
struct gpib_descriptor *desc;
|
||||
|
||||
retval = copy_from_user(&cmd, (void __user *)arg, sizeof(cmd));
|
||||
if (retval)
|
||||
|
|
@ -1503,7 +1519,7 @@ static int sad_ioctl(struct gpib_board *board, gpib_file_private_t *file_priv,
|
|||
|
||||
static int eos_ioctl(struct gpib_board *board, unsigned long arg)
|
||||
{
|
||||
eos_ioctl_t eos_cmd;
|
||||
struct gpib_eos_ioctl eos_cmd;
|
||||
int retval;
|
||||
|
||||
retval = copy_from_user(&eos_cmd, (void __user *)arg, sizeof(eos_cmd));
|
||||
|
|
@ -1527,11 +1543,11 @@ static int request_service_ioctl(struct gpib_board *board, unsigned long arg)
|
|||
|
||||
static int request_service2_ioctl(struct gpib_board *board, unsigned long arg)
|
||||
{
|
||||
request_service2_t request_service2_cmd;
|
||||
struct gpib_request_service2 request_service2_cmd;
|
||||
int retval;
|
||||
|
||||
retval = copy_from_user(&request_service2_cmd, (void __user *)arg,
|
||||
sizeof(request_service2_t));
|
||||
sizeof(struct gpib_request_service2));
|
||||
if (retval)
|
||||
return -EFAULT;
|
||||
|
||||
|
|
@ -1539,7 +1555,7 @@ static int request_service2_ioctl(struct gpib_board *board, unsigned long arg)
|
|||
request_service2_cmd.new_reason_for_service);
|
||||
}
|
||||
|
||||
static int iobase_ioctl(gpib_board_config_t *config, unsigned long arg)
|
||||
static int iobase_ioctl(struct gpib_board_config *config, unsigned long arg)
|
||||
{
|
||||
u64 base_addr;
|
||||
int retval;
|
||||
|
|
@ -1558,7 +1574,7 @@ static int iobase_ioctl(gpib_board_config_t *config, unsigned long arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int irq_ioctl(gpib_board_config_t *config, unsigned long arg)
|
||||
static int irq_ioctl(struct gpib_board_config *config, unsigned long arg)
|
||||
{
|
||||
unsigned int irq;
|
||||
int retval;
|
||||
|
|
@ -1575,7 +1591,7 @@ static int irq_ioctl(gpib_board_config_t *config, unsigned long arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int dma_ioctl(gpib_board_config_t *config, unsigned long arg)
|
||||
static int dma_ioctl(struct gpib_board_config *config, unsigned long arg)
|
||||
{
|
||||
unsigned int dma_channel;
|
||||
int retval;
|
||||
|
|
@ -1592,12 +1608,12 @@ static int dma_ioctl(gpib_board_config_t *config, unsigned long arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int autospoll_ioctl(struct gpib_board *board, gpib_file_private_t *file_priv,
|
||||
static int autospoll_ioctl(struct gpib_board *board, struct gpib_file_private *file_priv,
|
||||
unsigned long arg)
|
||||
{
|
||||
autospoll_ioctl_t enable;
|
||||
short enable;
|
||||
int retval;
|
||||
gpib_descriptor_t *desc;
|
||||
struct gpib_descriptor *desc;
|
||||
|
||||
retval = copy_from_user(&enable, (void __user *)arg, sizeof(enable));
|
||||
if (retval)
|
||||
|
|
@ -1630,7 +1646,7 @@ static int autospoll_ioctl(struct gpib_board *board, gpib_file_private_t *file_p
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int mutex_ioctl(struct gpib_board *board, gpib_file_private_t *file_priv,
|
||||
static int mutex_ioctl(struct gpib_board *board, struct gpib_file_private *file_priv,
|
||||
unsigned long arg)
|
||||
{
|
||||
int retval, lock_mutex;
|
||||
|
|
@ -1687,7 +1703,7 @@ static int timeout_ioctl(struct gpib_board *board, unsigned long arg)
|
|||
|
||||
static int ppc_ioctl(struct gpib_board *board, unsigned long arg)
|
||||
{
|
||||
ppoll_config_ioctl_t cmd;
|
||||
struct gpib_ppoll_config_ioctl cmd;
|
||||
int retval;
|
||||
|
||||
retval = copy_from_user(&cmd, (void __user *)arg, sizeof(cmd));
|
||||
|
|
@ -1713,7 +1729,7 @@ static int ppc_ioctl(struct gpib_board *board, unsigned long arg)
|
|||
|
||||
static int set_local_ppoll_mode_ioctl(struct gpib_board *board, unsigned long arg)
|
||||
{
|
||||
local_ppoll_mode_ioctl_t cmd;
|
||||
short cmd;
|
||||
int retval;
|
||||
|
||||
retval = copy_from_user(&cmd, (void __user *)arg, sizeof(cmd));
|
||||
|
|
@ -1730,7 +1746,7 @@ static int set_local_ppoll_mode_ioctl(struct gpib_board *board, unsigned long ar
|
|||
|
||||
static int get_local_ppoll_mode_ioctl(struct gpib_board *board, unsigned long arg)
|
||||
{
|
||||
local_ppoll_mode_ioctl_t cmd;
|
||||
short cmd;
|
||||
int retval;
|
||||
|
||||
cmd = board->local_ppoll_mode;
|
||||
|
|
@ -1757,7 +1773,7 @@ static int query_board_rsv_ioctl(struct gpib_board *board, unsigned long arg)
|
|||
|
||||
static int board_info_ioctl(const struct gpib_board *board, unsigned long arg)
|
||||
{
|
||||
board_info_ioctl_t info;
|
||||
struct gpib_board_info_ioctl info;
|
||||
int retval;
|
||||
|
||||
info.pad = board->pad;
|
||||
|
|
@ -1790,9 +1806,9 @@ static int interface_clear_ioctl(struct gpib_board *board, unsigned long arg)
|
|||
return ibsic(board, usec_duration);
|
||||
}
|
||||
|
||||
static int select_pci_ioctl(gpib_board_config_t *config, unsigned long arg)
|
||||
static int select_pci_ioctl(struct gpib_board_config *config, unsigned long arg)
|
||||
{
|
||||
select_pci_ioctl_t selection;
|
||||
struct gpib_select_pci_ioctl selection;
|
||||
int retval;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
|
|
@ -1808,19 +1824,20 @@ static int select_pci_ioctl(gpib_board_config_t *config, unsigned long arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int select_device_path_ioctl(gpib_board_config_t *config, unsigned long arg)
|
||||
static int select_device_path_ioctl(struct gpib_board_config *config, unsigned long arg)
|
||||
{
|
||||
select_device_path_ioctl_t *selection;
|
||||
struct gpib_select_device_path_ioctl *selection;
|
||||
int retval;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
selection = vmalloc(sizeof(select_device_path_ioctl_t));
|
||||
selection = vmalloc(sizeof(struct gpib_select_device_path_ioctl));
|
||||
if (!selection)
|
||||
return -ENOMEM;
|
||||
|
||||
retval = copy_from_user(selection, (void __user *)arg, sizeof(select_device_path_ioctl_t));
|
||||
retval = copy_from_user(selection, (void __user *)arg,
|
||||
sizeof(struct gpib_select_device_path_ioctl));
|
||||
if (retval) {
|
||||
vfree(selection);
|
||||
return -EFAULT;
|
||||
|
|
@ -1836,16 +1853,16 @@ static int select_device_path_ioctl(gpib_board_config_t *config, unsigned long a
|
|||
return 0;
|
||||
}
|
||||
|
||||
unsigned int num_gpib_events(const gpib_event_queue_t *queue)
|
||||
unsigned int num_gpib_events(const struct gpib_event_queue *queue)
|
||||
{
|
||||
return queue->num_events;
|
||||
}
|
||||
|
||||
static int push_gpib_event_nolock(struct gpib_board *board, short event_type)
|
||||
{
|
||||
gpib_event_queue_t *queue = &board->event_queue;
|
||||
struct gpib_event_queue *queue = &board->event_queue;
|
||||
struct list_head *head = &queue->event_head;
|
||||
gpib_event_t *event;
|
||||
struct gpib_event *event;
|
||||
static const unsigned int max_num_events = 1024;
|
||||
int retval;
|
||||
|
||||
|
|
@ -1858,7 +1875,7 @@ static int push_gpib_event_nolock(struct gpib_board *board, short event_type)
|
|||
return retval;
|
||||
}
|
||||
|
||||
event = kmalloc(sizeof(gpib_event_t), GFP_ATOMIC);
|
||||
event = kmalloc(sizeof(struct gpib_event), GFP_ATOMIC);
|
||||
if (!event) {
|
||||
queue->dropped_event = 1;
|
||||
dev_err(board->gpib_dev, "failed to allocate memory for event\n");
|
||||
|
|
@ -1888,23 +1905,24 @@ int push_gpib_event(struct gpib_board *board, short event_type)
|
|||
retval = push_gpib_event_nolock(board, event_type);
|
||||
spin_unlock_irqrestore(&board->event_queue.lock, flags);
|
||||
|
||||
if (event_type == EventDevTrg)
|
||||
if (event_type == EVENT_DEV_TRG)
|
||||
board->status |= DTAS;
|
||||
if (event_type == EventDevClr)
|
||||
if (event_type == EVENT_DEV_CLR)
|
||||
board->status |= DCAS;
|
||||
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL(push_gpib_event);
|
||||
|
||||
static int pop_gpib_event_nolock(struct gpib_board *board, gpib_event_queue_t *queue, short *event_type)
|
||||
static int pop_gpib_event_nolock(struct gpib_board *board,
|
||||
struct gpib_event_queue *queue, short *event_type)
|
||||
{
|
||||
struct list_head *head = &queue->event_head;
|
||||
struct list_head *front = head->next;
|
||||
gpib_event_t *event;
|
||||
struct gpib_event *event;
|
||||
|
||||
if (num_gpib_events(queue) == 0) {
|
||||
*event_type = EventNone;
|
||||
*event_type = EVENT_NONE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1916,7 +1934,7 @@ static int pop_gpib_event_nolock(struct gpib_board *board, gpib_event_queue_t *q
|
|||
return -EPIPE;
|
||||
}
|
||||
|
||||
event = list_entry(front, gpib_event_t, list);
|
||||
event = list_entry(front, struct gpib_event, list);
|
||||
*event_type = event->event_type;
|
||||
|
||||
list_del(front);
|
||||
|
|
@ -1931,7 +1949,7 @@ static int pop_gpib_event_nolock(struct gpib_board *board, gpib_event_queue_t *q
|
|||
}
|
||||
|
||||
// pop event from front of event queue
|
||||
int pop_gpib_event(struct gpib_board *board, gpib_event_queue_t *queue, short *event_type)
|
||||
int pop_gpib_event(struct gpib_board *board, struct gpib_event_queue *queue, short *event_type)
|
||||
{
|
||||
unsigned long flags;
|
||||
int retval;
|
||||
|
|
@ -1944,7 +1962,7 @@ int pop_gpib_event(struct gpib_board *board, gpib_event_queue_t *queue, short *e
|
|||
|
||||
static int event_ioctl(struct gpib_board *board, unsigned long arg)
|
||||
{
|
||||
event_ioctl_t user_event;
|
||||
short user_event;
|
||||
int retval;
|
||||
short event;
|
||||
|
||||
|
|
@ -1963,21 +1981,19 @@ static int event_ioctl(struct gpib_board *board, unsigned long arg)
|
|||
|
||||
static int request_system_control_ioctl(struct gpib_board *board, unsigned long arg)
|
||||
{
|
||||
rsc_ioctl_t request_control;
|
||||
int request_control;
|
||||
int retval;
|
||||
|
||||
retval = copy_from_user(&request_control, (void __user *)arg, sizeof(request_control));
|
||||
if (retval)
|
||||
return -EFAULT;
|
||||
|
||||
ibrsc(board, request_control);
|
||||
|
||||
return 0;
|
||||
return ibrsc(board, request_control);
|
||||
}
|
||||
|
||||
static int t1_delay_ioctl(struct gpib_board *board, unsigned long arg)
|
||||
{
|
||||
t1_delay_ioctl_t cmd;
|
||||
unsigned int cmd;
|
||||
unsigned int delay;
|
||||
int retval;
|
||||
|
||||
|
|
@ -2011,7 +2027,7 @@ struct gpib_board board_array[GPIB_MAX_NUM_BOARDS];
|
|||
|
||||
LIST_HEAD(registered_drivers);
|
||||
|
||||
void init_gpib_descriptor(gpib_descriptor_t *desc)
|
||||
void init_gpib_descriptor(struct gpib_descriptor *desc)
|
||||
{
|
||||
desc->pad = 0;
|
||||
desc->sad = -1;
|
||||
|
|
@ -2020,9 +2036,9 @@ void init_gpib_descriptor(gpib_descriptor_t *desc)
|
|||
atomic_set(&desc->io_in_progress, 0);
|
||||
}
|
||||
|
||||
int gpib_register_driver(gpib_interface_t *interface, struct module *provider_module)
|
||||
int gpib_register_driver(struct gpib_interface *interface, struct module *provider_module)
|
||||
{
|
||||
struct gpib_interface_list_struct *entry;
|
||||
struct gpib_interface_list *entry;
|
||||
|
||||
entry = kmalloc(sizeof(*entry), GFP_KERNEL);
|
||||
if (!entry)
|
||||
|
|
@ -2036,7 +2052,7 @@ int gpib_register_driver(gpib_interface_t *interface, struct module *provider_mo
|
|||
}
|
||||
EXPORT_SYMBOL(gpib_register_driver);
|
||||
|
||||
void gpib_unregister_driver(gpib_interface_t *interface)
|
||||
void gpib_unregister_driver(struct gpib_interface *interface)
|
||||
{
|
||||
int i;
|
||||
struct list_head *list_ptr;
|
||||
|
|
@ -2053,9 +2069,9 @@ void gpib_unregister_driver(gpib_interface_t *interface)
|
|||
}
|
||||
}
|
||||
for (list_ptr = registered_drivers.next; list_ptr != ®istered_drivers;) {
|
||||
gpib_interface_list_t *entry;
|
||||
struct gpib_interface_list *entry;
|
||||
|
||||
entry = list_entry(list_ptr, gpib_interface_list_t, list);
|
||||
entry = list_entry(list_ptr, struct gpib_interface_list, list);
|
||||
list_ptr = list_ptr->next;
|
||||
if (entry->interface == interface) {
|
||||
list_del(&entry->list);
|
||||
|
|
@ -2065,9 +2081,9 @@ void gpib_unregister_driver(gpib_interface_t *interface)
|
|||
}
|
||||
EXPORT_SYMBOL(gpib_unregister_driver);
|
||||
|
||||
static void init_gpib_board_config(gpib_board_config_t *config)
|
||||
static void init_gpib_board_config(struct gpib_board_config *config)
|
||||
{
|
||||
memset(config, 0, sizeof(gpib_board_config_t));
|
||||
memset(config, 0, sizeof(struct gpib_board_config));
|
||||
config->pci_bus = -1;
|
||||
config->pci_slot = -1;
|
||||
}
|
||||
|
|
@ -2143,7 +2159,7 @@ static void init_board_array(struct gpib_board *board_array, unsigned int length
|
|||
}
|
||||
}
|
||||
|
||||
void init_gpib_status_queue(gpib_status_queue_t *device)
|
||||
void init_gpib_status_queue(struct gpib_status_queue *device)
|
||||
{
|
||||
INIT_LIST_HEAD(&device->list);
|
||||
INIT_LIST_HEAD(&device->status_bytes);
|
||||
|
|
@ -2208,7 +2224,7 @@ int gpib_match_device_path(struct device *dev, const char *device_path_in)
|
|||
}
|
||||
EXPORT_SYMBOL(gpib_match_device_path);
|
||||
|
||||
struct pci_dev *gpib_pci_get_device(const gpib_board_config_t *config, unsigned int vendor_id,
|
||||
struct pci_dev *gpib_pci_get_device(const struct gpib_board_config *config, unsigned int vendor_id,
|
||||
unsigned int device_id, struct pci_dev *from)
|
||||
{
|
||||
struct pci_dev *pci_device = from;
|
||||
|
|
@ -2227,7 +2243,7 @@ struct pci_dev *gpib_pci_get_device(const gpib_board_config_t *config, unsigned
|
|||
}
|
||||
EXPORT_SYMBOL(gpib_pci_get_device);
|
||||
|
||||
struct pci_dev *gpib_pci_get_subsys(const gpib_board_config_t *config, unsigned int vendor_id,
|
||||
struct pci_dev *gpib_pci_get_subsys(const struct gpib_board_config *config, unsigned int vendor_id,
|
||||
unsigned int device_id, unsigned int ss_vendor,
|
||||
unsigned int ss_device,
|
||||
struct pci_dev *from)
|
||||
|
|
|
|||
|
|
@ -33,9 +33,10 @@ int ibcac(struct gpib_board *board, int sync, int fallback_to_async)
|
|||
return 0;
|
||||
|
||||
if (sync && (status & LACS) == 0)
|
||||
/* tcs (take control synchronously) can only possibly work when
|
||||
* controller is listener. Error code also needs to be -ETIMEDOUT
|
||||
* or it will giveout without doing fallback.
|
||||
/*
|
||||
* tcs (take control synchronously) can only possibly work when
|
||||
* controller is listener. Error code also needs to be -ETIMEDOUT
|
||||
* or it will giveout without doing fallback.
|
||||
*/
|
||||
retval = -ETIMEDOUT;
|
||||
else
|
||||
|
|
@ -50,7 +51,8 @@ int ibcac(struct gpib_board *board, int sync, int fallback_to_async)
|
|||
return retval;
|
||||
}
|
||||
|
||||
/* After ATN is asserted, it should cause any connected devices
|
||||
/*
|
||||
* After ATN is asserted, it should cause any connected devices
|
||||
* to start listening for command bytes and leave acceptor idle state.
|
||||
* So if ATN is asserted and neither NDAC or NRFD are asserted,
|
||||
* then there are no devices and ibcmd should error out immediately.
|
||||
|
|
@ -96,7 +98,7 @@ static int check_for_command_acceptors(struct gpib_board *board)
|
|||
* must be called to initialize the GPIB and enable
|
||||
* the interface to leave the controller idle state.
|
||||
*/
|
||||
int ibcmd(struct gpib_board *board, uint8_t *buf, size_t length, size_t *bytes_written)
|
||||
int ibcmd(struct gpib_board *board, u8 *buf, size_t length, size_t *bytes_written)
|
||||
{
|
||||
ssize_t ret = 0;
|
||||
int status;
|
||||
|
|
@ -218,7 +220,8 @@ int ibonline(struct gpib_board *board)
|
|||
board->interface->detach(board);
|
||||
return retval;
|
||||
}
|
||||
/* nios2nommu on 2.6.11 uclinux kernel has weird problems
|
||||
/*
|
||||
* nios2nommu on 2.6.11 uclinux kernel has weird problems
|
||||
* with autospoll thread causing huge slowdowns
|
||||
*/
|
||||
#ifndef CONFIG_NIOS2
|
||||
|
|
@ -297,7 +300,7 @@ int iblines(const struct gpib_board *board, short *lines)
|
|||
* calling ibcmd.
|
||||
*/
|
||||
|
||||
int ibrd(struct gpib_board *board, uint8_t *buf, size_t length, int *end_flag, size_t *nbytes)
|
||||
int ibrd(struct gpib_board *board, u8 *buf, size_t length, int *end_flag, size_t *nbytes)
|
||||
{
|
||||
ssize_t ret = 0;
|
||||
int retval;
|
||||
|
|
@ -313,7 +316,8 @@ int ibrd(struct gpib_board *board, uint8_t *buf, size_t length, int *end_flag, s
|
|||
if (retval < 0)
|
||||
return retval;
|
||||
}
|
||||
/* XXX resetting timer here could cause timeouts take longer than they should,
|
||||
/*
|
||||
* XXX resetting timer here could cause timeouts take longer than they should,
|
||||
* since read_ioctl calls this
|
||||
* function in a loop, there is probably a similar problem with writes/commands
|
||||
*/
|
||||
|
|
@ -343,7 +347,7 @@ ibrd_out:
|
|||
* 1. Prior to conducting the poll the interface is placed
|
||||
* in the controller active state.
|
||||
*/
|
||||
int ibrpp(struct gpib_board *board, uint8_t *result)
|
||||
int ibrpp(struct gpib_board *board, u8 *result)
|
||||
{
|
||||
int retval = 0;
|
||||
|
||||
|
|
@ -358,7 +362,7 @@ int ibrpp(struct gpib_board *board, uint8_t *result)
|
|||
return retval;
|
||||
}
|
||||
|
||||
int ibppc(struct gpib_board *board, uint8_t configuration)
|
||||
int ibppc(struct gpib_board *board, u8 configuration)
|
||||
{
|
||||
configuration &= 0x1f;
|
||||
board->interface->parallel_poll_configure(board, configuration);
|
||||
|
|
@ -367,7 +371,7 @@ int ibppc(struct gpib_board *board, uint8_t configuration)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int ibrsv2(struct gpib_board *board, uint8_t status_byte, int new_reason_for_service)
|
||||
int ibrsv2(struct gpib_board *board, u8 status_byte, int new_reason_for_service)
|
||||
{
|
||||
int board_status = ibstatus(board);
|
||||
const unsigned int MSS = status_byte & request_service_bit;
|
||||
|
|
@ -418,12 +422,21 @@ int ibsic(struct gpib_board *board, unsigned int usec_duration)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* FIXME make int */
|
||||
void ibrsc(struct gpib_board *board, int request_control)
|
||||
int ibrsc(struct gpib_board *board, int request_control)
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (!board->interface->request_system_control)
|
||||
return -EPERM;
|
||||
|
||||
retval = board->interface->request_system_control(board, request_control);
|
||||
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
board->master = request_control != 0;
|
||||
if (board->interface->request_system_control)
|
||||
board->interface->request_system_control(board, request_control);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -506,15 +519,16 @@ int ibstatus(struct gpib_board *board)
|
|||
return general_ibstatus(board, NULL, 0, 0, NULL);
|
||||
}
|
||||
|
||||
int general_ibstatus(struct gpib_board *board, const gpib_status_queue_t *device,
|
||||
int clear_mask, int set_mask, gpib_descriptor_t *desc)
|
||||
int general_ibstatus(struct gpib_board *board, const struct gpib_status_queue *device,
|
||||
int clear_mask, int set_mask, struct gpib_descriptor *desc)
|
||||
{
|
||||
int status = 0;
|
||||
short line_status;
|
||||
|
||||
if (board->private_data) {
|
||||
status = board->interface->update_status(board, clear_mask);
|
||||
/* XXX should probably stop having drivers use TIMO bit in
|
||||
/*
|
||||
* XXX should probably stop having drivers use TIMO bit in
|
||||
* board->status to avoid confusion
|
||||
*/
|
||||
status &= ~TIMO;
|
||||
|
|
@ -573,8 +587,8 @@ static void init_wait_info(struct wait_info *winfo)
|
|||
timer_setup_on_stack(&winfo->timer, wait_timeout, 0);
|
||||
}
|
||||
|
||||
static int wait_satisfied(struct wait_info *winfo, gpib_status_queue_t *status_queue,
|
||||
int wait_mask, int *status, gpib_descriptor_t *desc)
|
||||
static int wait_satisfied(struct wait_info *winfo, struct gpib_status_queue *status_queue,
|
||||
int wait_mask, int *status, struct gpib_descriptor *desc)
|
||||
{
|
||||
struct gpib_board *board = winfo->board;
|
||||
int temp_status;
|
||||
|
|
@ -623,10 +637,10 @@ static void remove_wait_timer(struct wait_info *winfo)
|
|||
* no condition is waited for.
|
||||
*/
|
||||
int ibwait(struct gpib_board *board, int wait_mask, int clear_mask, int set_mask,
|
||||
int *status, unsigned long usec_timeout, gpib_descriptor_t *desc)
|
||||
int *status, unsigned long usec_timeout, struct gpib_descriptor *desc)
|
||||
{
|
||||
int retval = 0;
|
||||
gpib_status_queue_t *status_queue;
|
||||
struct gpib_status_queue *status_queue;
|
||||
struct wait_info winfo;
|
||||
|
||||
if (desc->is_board)
|
||||
|
|
@ -677,7 +691,7 @@ int ibwait(struct gpib_board *board, int wait_mask, int clear_mask, int set_mask
|
|||
* well as the interface board itself must be
|
||||
* addressed by calling ibcmd.
|
||||
*/
|
||||
int ibwrt(struct gpib_board *board, uint8_t *buf, size_t cnt, int send_eoi, size_t *bytes_written)
|
||||
int ibwrt(struct gpib_board *board, u8 *buf, size_t cnt, int send_eoi, size_t *bytes_written)
|
||||
{
|
||||
int ret = 0;
|
||||
int retval;
|
||||
|
|
|
|||
|
|
@ -22,10 +22,13 @@
|
|||
int gpib_allocate_board(struct gpib_board *board);
|
||||
void gpib_deallocate_board(struct gpib_board *board);
|
||||
|
||||
unsigned int num_status_bytes(const gpib_status_queue_t *dev);
|
||||
int push_status_byte(struct gpib_board *board, gpib_status_queue_t *device, uint8_t poll_byte);
|
||||
int pop_status_byte(struct gpib_board *board, gpib_status_queue_t *device, uint8_t *poll_byte);
|
||||
gpib_status_queue_t *get_gpib_status_queue(struct gpib_board *board, unsigned int pad, int sad);
|
||||
unsigned int num_status_bytes(const struct gpib_status_queue *dev);
|
||||
int push_status_byte(struct gpib_board *board, struct gpib_status_queue *device,
|
||||
u8 poll_byte);
|
||||
int pop_status_byte(struct gpib_board *board, struct gpib_status_queue *device,
|
||||
u8 *poll_byte);
|
||||
struct gpib_status_queue *get_gpib_status_queue(struct gpib_board *board,
|
||||
unsigned int pad, int sad);
|
||||
int get_serial_poll_byte(struct gpib_board *board, unsigned int pad, int sad,
|
||||
unsigned int usec_timeout, uint8_t *poll_byte);
|
||||
unsigned int usec_timeout, u8 *poll_byte);
|
||||
int autopoll_all_devices(struct gpib_board *board);
|
||||
|
|
|
|||
|
|
@ -24,15 +24,17 @@
|
|||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("GPIB Driver for Fluke cda devices");
|
||||
|
||||
static int fluke_attach_holdoff_all(struct gpib_board *board, const gpib_board_config_t *config);
|
||||
static int fluke_attach_holdoff_end(struct gpib_board *board, const gpib_board_config_t *config);
|
||||
static int fluke_attach_holdoff_all(struct gpib_board *board,
|
||||
const struct gpib_board_config *config);
|
||||
static int fluke_attach_holdoff_end(struct gpib_board *board,
|
||||
const struct gpib_board_config *config);
|
||||
static void fluke_detach(struct gpib_board *board);
|
||||
static int fluke_config_dma(struct gpib_board *board, int output);
|
||||
static irqreturn_t fluke_gpib_internal_interrupt(struct gpib_board *board);
|
||||
|
||||
static struct platform_device *fluke_gpib_pdev;
|
||||
|
||||
static uint8_t fluke_locking_read_byte(struct nec7210_priv *nec_priv, unsigned int register_number)
|
||||
static u8 fluke_locking_read_byte(struct nec7210_priv *nec_priv, unsigned int register_number)
|
||||
{
|
||||
u8 retval;
|
||||
unsigned long flags;
|
||||
|
|
@ -43,7 +45,7 @@ static uint8_t fluke_locking_read_byte(struct nec7210_priv *nec_priv, unsigned i
|
|||
return retval;
|
||||
}
|
||||
|
||||
static void fluke_locking_write_byte(struct nec7210_priv *nec_priv, uint8_t byte,
|
||||
static void fluke_locking_write_byte(struct nec7210_priv *nec_priv, u8 byte,
|
||||
unsigned int register_number)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
|
@ -54,7 +56,7 @@ static void fluke_locking_write_byte(struct nec7210_priv *nec_priv, uint8_t byte
|
|||
}
|
||||
|
||||
// wrappers for interface functions
|
||||
static int fluke_read(struct gpib_board *board, uint8_t *buffer, size_t length, int *end,
|
||||
static int fluke_read(struct gpib_board *board, u8 *buffer, size_t length, int *end,
|
||||
size_t *bytes_read)
|
||||
{
|
||||
struct fluke_priv *priv = board->private_data;
|
||||
|
|
@ -62,7 +64,7 @@ static int fluke_read(struct gpib_board *board, uint8_t *buffer, size_t length,
|
|||
return nec7210_read(board, &priv->nec7210_priv, buffer, length, end, bytes_read);
|
||||
}
|
||||
|
||||
static int fluke_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int fluke_write(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int send_eoi, size_t *bytes_written)
|
||||
{
|
||||
struct fluke_priv *priv = board->private_data;
|
||||
|
|
@ -70,7 +72,7 @@ static int fluke_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
|||
return nec7210_write(board, &priv->nec7210_priv, buffer, length, send_eoi, bytes_written);
|
||||
}
|
||||
|
||||
static int fluke_command(struct gpib_board *board, uint8_t *buffer,
|
||||
static int fluke_command(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, size_t *bytes_written)
|
||||
{
|
||||
struct fluke_priv *priv = board->private_data;
|
||||
|
|
@ -92,12 +94,12 @@ static int fluke_go_to_standby(struct gpib_board *board)
|
|||
return nec7210_go_to_standby(board, &priv->nec7210_priv);
|
||||
}
|
||||
|
||||
static void fluke_request_system_control(struct gpib_board *board, int request_control)
|
||||
static int fluke_request_system_control(struct gpib_board *board, int request_control)
|
||||
{
|
||||
struct fluke_priv *priv = board->private_data;
|
||||
struct nec7210_priv *nec_priv = &priv->nec7210_priv;
|
||||
|
||||
nec7210_request_system_control(board, nec_priv, request_control);
|
||||
return nec7210_request_system_control(board, nec_priv, request_control);
|
||||
}
|
||||
|
||||
static void fluke_interface_clear(struct gpib_board *board, int assert)
|
||||
|
|
@ -114,7 +116,7 @@ static void fluke_remote_enable(struct gpib_board *board, int enable)
|
|||
nec7210_remote_enable(board, &priv->nec7210_priv, enable);
|
||||
}
|
||||
|
||||
static int fluke_enable_eos(struct gpib_board *board, uint8_t eos_byte, int compare_8_bits)
|
||||
static int fluke_enable_eos(struct gpib_board *board, u8 eos_byte, int compare_8_bits)
|
||||
{
|
||||
struct fluke_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -149,14 +151,14 @@ static int fluke_secondary_address(struct gpib_board *board, unsigned int addres
|
|||
return nec7210_secondary_address(board, &priv->nec7210_priv, address, enable);
|
||||
}
|
||||
|
||||
static int fluke_parallel_poll(struct gpib_board *board, uint8_t *result)
|
||||
static int fluke_parallel_poll(struct gpib_board *board, u8 *result)
|
||||
{
|
||||
struct fluke_priv *priv = board->private_data;
|
||||
|
||||
return nec7210_parallel_poll(board, &priv->nec7210_priv, result);
|
||||
}
|
||||
|
||||
static void fluke_parallel_poll_configure(struct gpib_board *board, uint8_t configuration)
|
||||
static void fluke_parallel_poll_configure(struct gpib_board *board, u8 configuration)
|
||||
{
|
||||
struct fluke_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -170,14 +172,14 @@ static void fluke_parallel_poll_response(struct gpib_board *board, int ist)
|
|||
nec7210_parallel_poll_response(board, &priv->nec7210_priv, ist);
|
||||
}
|
||||
|
||||
static void fluke_serial_poll_response(struct gpib_board *board, uint8_t status)
|
||||
static void fluke_serial_poll_response(struct gpib_board *board, u8 status)
|
||||
{
|
||||
struct fluke_priv *priv = board->private_data;
|
||||
|
||||
nec7210_serial_poll_response(board, &priv->nec7210_priv, status);
|
||||
}
|
||||
|
||||
static uint8_t fluke_serial_poll_status(struct gpib_board *board)
|
||||
static u8 fluke_serial_poll_status(struct gpib_board *board)
|
||||
{
|
||||
struct fluke_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -254,7 +256,8 @@ static int lacs_or_read_ready(struct gpib_board *board)
|
|||
return retval;
|
||||
}
|
||||
|
||||
/* Wait until it is possible for a read to do something useful. This
|
||||
/*
|
||||
* Wait until it is possible for a read to do something useful. This
|
||||
* is not essential, it only exists to prevent RFD holdoff from being released pointlessly.
|
||||
*/
|
||||
static int wait_for_read(struct gpib_board *board)
|
||||
|
|
@ -276,7 +279,8 @@ static int wait_for_read(struct gpib_board *board)
|
|||
return retval;
|
||||
}
|
||||
|
||||
/* Check if the SH state machine is in SGNS. We check twice since there is a very small chance
|
||||
/*
|
||||
* Check if the SH state machine is in SGNS. We check twice since there is a very small chance
|
||||
* we could be blowing through SGNS from SIDS to SDYS if there is already a
|
||||
* byte available in the handshake state machine. We are interested
|
||||
* in the case where the handshake is stuck in SGNS due to no byte being
|
||||
|
|
@ -310,7 +314,8 @@ static int source_handshake_is_sids_or_sgns(struct fluke_priv *e_priv)
|
|||
(source_handshake_bits == SOURCE_HANDSHAKE_SIDS_BITS);
|
||||
}
|
||||
|
||||
/* Wait until the gpib chip is ready to accept a data out byte.
|
||||
/*
|
||||
* Wait until the gpib chip is ready to accept a data out byte.
|
||||
* If the chip is SGNS it is probably waiting for a a byte to
|
||||
* be written to it.
|
||||
*/
|
||||
|
|
@ -371,7 +376,7 @@ static void fluke_dma_callback(void *arg)
|
|||
spin_unlock_irqrestore(&board->spinlock, flags);
|
||||
}
|
||||
|
||||
static int fluke_dma_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int fluke_dma_write(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
struct fluke_priv *e_priv = board->private_data;
|
||||
|
|
@ -441,7 +446,8 @@ static int fluke_dma_write(struct gpib_board *board, uint8_t *buffer, size_t len
|
|||
if (test_bit(DMA_WRITE_IN_PROGRESS_BN, &nec_priv->state))
|
||||
fluke_dma_callback(board);
|
||||
|
||||
/* if everything went fine, try to wait until last byte is actually
|
||||
/*
|
||||
* if everything went fine, try to wait until last byte is actually
|
||||
* transmitted across gpib (but don't try _too_ hard)
|
||||
*/
|
||||
if (retval == 0)
|
||||
|
|
@ -456,7 +462,7 @@ cleanup:
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int fluke_accel_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int fluke_accel_write(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int send_eoi, size_t *bytes_written)
|
||||
{
|
||||
struct fluke_priv *e_priv = board->private_data;
|
||||
|
|
@ -508,7 +514,8 @@ static int fluke_accel_write(struct gpib_board *board, uint8_t *buffer, size_t l
|
|||
if (WARN_ON_ONCE(remainder != 1))
|
||||
return -EFAULT;
|
||||
|
||||
/* wait until we are sure we will be able to write the data byte
|
||||
/*
|
||||
* wait until we are sure we will be able to write the data byte
|
||||
* into the chip before we send AUX_SEOI. This prevents a timeout
|
||||
* scenerio where we send AUX_SEOI but then timeout without getting
|
||||
* any bytes into the gpib chip. This will result in the first byte
|
||||
|
|
@ -539,12 +546,14 @@ static int fluke_get_dma_residue(struct dma_chan *chan, dma_cookie_t cookie)
|
|||
return result;
|
||||
}
|
||||
dmaengine_tx_status(chan, cookie, &state);
|
||||
// hardware doesn't support resume, so dont call this
|
||||
// method unless the dma transfer is done.
|
||||
/*
|
||||
* hardware doesn't support resume, so dont call this
|
||||
* method unless the dma transfer is done.
|
||||
*/
|
||||
return state.residue;
|
||||
}
|
||||
|
||||
static int fluke_dma_read(struct gpib_board *board, uint8_t *buffer,
|
||||
static int fluke_dma_read(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, int *end, size_t *bytes_read)
|
||||
{
|
||||
struct fluke_priv *e_priv = board->private_data;
|
||||
|
|
@ -608,7 +617,8 @@ static int fluke_dma_read(struct gpib_board *board, uint8_t *buffer,
|
|||
if (test_bit(DEV_CLEAR_BN, &nec_priv->state))
|
||||
retval = -EINTR;
|
||||
|
||||
/* If we woke up because of end, wait until the dma transfer has pulled
|
||||
/*
|
||||
* If we woke up because of end, wait until the dma transfer has pulled
|
||||
* the data byte associated with the end before we cancel the dma transfer.
|
||||
*/
|
||||
if (test_bit(RECEIVED_END_BN, &nec_priv->state)) {
|
||||
|
|
@ -625,7 +635,8 @@ static int fluke_dma_read(struct gpib_board *board, uint8_t *buffer,
|
|||
|
||||
// stop the dma transfer
|
||||
nec7210_set_reg_bits(nec_priv, IMR2, HR_DMAI, 0);
|
||||
/* delay a little just to make sure any bytes in dma controller's fifo get
|
||||
/*
|
||||
* delay a little just to make sure any bytes in dma controller's fifo get
|
||||
* written to memory before we disable it
|
||||
*/
|
||||
usleep_range(10, 15);
|
||||
|
|
@ -641,14 +652,17 @@ static int fluke_dma_read(struct gpib_board *board, uint8_t *buffer,
|
|||
dma_unmap_single(board->dev, bus_address, length, DMA_FROM_DEVICE);
|
||||
memcpy(buffer, e_priv->dma_buffer, *bytes_read);
|
||||
|
||||
/* If we got an end interrupt, figure out if it was
|
||||
/*
|
||||
* If we got an end interrupt, figure out if it was
|
||||
* associated with the last byte we dma'd or with a
|
||||
* byte still sitting on the cb7210.
|
||||
*/
|
||||
spin_lock_irqsave(&board->spinlock, flags);
|
||||
if (test_bit(READ_READY_BN, &nec_priv->state) == 0) {
|
||||
// There is no byte sitting on the cb7210. If we
|
||||
// saw an end interrupt, we need to deal with it now
|
||||
/*
|
||||
* There is no byte sitting on the cb7210. If we
|
||||
* saw an end interrupt, we need to deal with it now
|
||||
*/
|
||||
if (test_and_clear_bit(RECEIVED_END_BN, &nec_priv->state))
|
||||
*end = 1;
|
||||
}
|
||||
|
|
@ -657,7 +671,7 @@ static int fluke_dma_read(struct gpib_board *board, uint8_t *buffer,
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int fluke_accel_read(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int fluke_accel_read(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int *end, size_t *bytes_read)
|
||||
{
|
||||
struct fluke_priv *e_priv = board->private_data;
|
||||
|
|
@ -698,7 +712,7 @@ static int fluke_accel_read(struct gpib_board *board, uint8_t *buffer, size_t le
|
|||
return retval;
|
||||
}
|
||||
|
||||
static gpib_interface_t fluke_unaccel_interface = {
|
||||
static struct gpib_interface fluke_unaccel_interface = {
|
||||
.name = "fluke_unaccel",
|
||||
.attach = fluke_attach_holdoff_all,
|
||||
.detach = fluke_detach,
|
||||
|
|
@ -725,7 +739,8 @@ static gpib_interface_t fluke_unaccel_interface = {
|
|||
.return_to_local = fluke_return_to_local,
|
||||
};
|
||||
|
||||
/* fluke_hybrid uses dma for writes but not for reads. Added
|
||||
/*
|
||||
* fluke_hybrid uses dma for writes but not for reads. Added
|
||||
* to deal with occasional corruption of bytes seen when doing dma
|
||||
* reads. From looking at the cb7210 vhdl, I believe the corruption
|
||||
* is due to a hardware bug triggered by the cpu reading a cb7210
|
||||
|
|
@ -733,7 +748,7 @@ static gpib_interface_t fluke_unaccel_interface = {
|
|||
* register just as the dma controller is also doing a read.
|
||||
*/
|
||||
|
||||
static gpib_interface_t fluke_hybrid_interface = {
|
||||
static struct gpib_interface fluke_hybrid_interface = {
|
||||
.name = "fluke_hybrid",
|
||||
.attach = fluke_attach_holdoff_all,
|
||||
.detach = fluke_detach,
|
||||
|
|
@ -760,7 +775,7 @@ static gpib_interface_t fluke_hybrid_interface = {
|
|||
.return_to_local = fluke_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t fluke_interface = {
|
||||
static struct gpib_interface fluke_interface = {
|
||||
.name = "fluke",
|
||||
.attach = fluke_attach_holdoff_end,
|
||||
.detach = fluke_detach,
|
||||
|
|
@ -802,7 +817,7 @@ irqreturn_t fluke_gpib_internal_interrupt(struct gpib_board *board)
|
|||
status2 = read_byte(nec_priv, ISR2);
|
||||
|
||||
if (status0 & FLUKE_IFCI_BIT) {
|
||||
push_gpib_event(board, EventIFC);
|
||||
push_gpib_event(board, EVENT_IFC);
|
||||
retval = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
|
@ -914,7 +929,8 @@ static int fluke_init(struct fluke_priv *e_priv, struct gpib_board *board, int h
|
|||
|
||||
nec7210_board_reset(nec_priv, board);
|
||||
write_byte(nec_priv, AUX_LO_SPEED, AUXMR);
|
||||
/* set clock register for driving frequency
|
||||
/*
|
||||
* set clock register for driving frequency
|
||||
* ICR should be set to clock in megahertz (1-15) and to zero
|
||||
* for clocks faster than 15 MHz (max 20MHz)
|
||||
*/
|
||||
|
|
@ -933,7 +949,8 @@ static int fluke_init(struct fluke_priv *e_priv, struct gpib_board *board, int h
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* This function is passed to dma_request_channel() in order to
|
||||
/*
|
||||
* This function is passed to dma_request_channel() in order to
|
||||
* select the pl330 dma channel which has been hardwired to
|
||||
* the gpib controller.
|
||||
*/
|
||||
|
|
@ -943,7 +960,7 @@ static bool gpib_dma_channel_filter(struct dma_chan *chan, void *filter_param)
|
|||
return chan->chan_id == 0;
|
||||
}
|
||||
|
||||
static int fluke_attach_impl(struct gpib_board *board, const gpib_board_config_t *config,
|
||||
static int fluke_attach_impl(struct gpib_board *board, const struct gpib_board_config *config,
|
||||
unsigned int handshake_mode)
|
||||
{
|
||||
struct fluke_priv *e_priv;
|
||||
|
|
@ -1024,10 +1041,8 @@ static int fluke_attach_impl(struct gpib_board *board, const gpib_board_config_t
|
|||
}
|
||||
|
||||
irq = platform_get_irq(fluke_gpib_pdev, 0);
|
||||
if (irq < 0) {
|
||||
dev_err(&fluke_gpib_pdev->dev, "failed to obtain IRQ\n");
|
||||
if (irq < 0)
|
||||
return -EBUSY;
|
||||
}
|
||||
retval = request_irq(irq, fluke_gpib_interrupt, isr_flags, fluke_gpib_pdev->name, board);
|
||||
if (retval) {
|
||||
dev_err(&fluke_gpib_pdev->dev,
|
||||
|
|
@ -1042,19 +1057,21 @@ static int fluke_attach_impl(struct gpib_board *board, const gpib_board_config_t
|
|||
e_priv->dma_channel = dma_request_channel(dma_cap, gpib_dma_channel_filter, NULL);
|
||||
if (!e_priv->dma_channel) {
|
||||
dev_err(board->gpib_dev, "failed to allocate a dma channel.\n");
|
||||
// we don't error out here because unaccel interface will still
|
||||
// work without dma
|
||||
/*
|
||||
* we don't error out here because unaccel interface will still
|
||||
* work without dma
|
||||
*/
|
||||
}
|
||||
|
||||
return fluke_init(e_priv, board, handshake_mode);
|
||||
}
|
||||
|
||||
int fluke_attach_holdoff_all(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
int fluke_attach_holdoff_all(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
return fluke_attach_impl(board, config, HR_HLDA);
|
||||
}
|
||||
|
||||
int fluke_attach_holdoff_end(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
int fluke_attach_holdoff_end(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
return fluke_attach_impl(board, config, HR_HLDE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -55,8 +55,10 @@ enum state1_bits {
|
|||
SOURCE_HANDSHAKE_MASK = 0x7
|
||||
};
|
||||
|
||||
// we customized the cb7210 vhdl to give the "data in" status
|
||||
// on the unused bit 7 of the address0 register.
|
||||
/*
|
||||
* we customized the cb7210 vhdl to give the "data in" status
|
||||
* on the unused bit 7 of the address0 register.
|
||||
*/
|
||||
enum cb7210_address0 {
|
||||
DATA_IN_STATUS = 0x80
|
||||
};
|
||||
|
|
@ -67,8 +69,8 @@ static inline int cb7210_page_in_bits(unsigned int page)
|
|||
}
|
||||
|
||||
// don't use without locking nec_priv->register_page_lock
|
||||
static inline uint8_t fluke_read_byte_nolock(struct nec7210_priv *nec_priv,
|
||||
int register_num)
|
||||
static inline u8 fluke_read_byte_nolock(struct nec7210_priv *nec_priv,
|
||||
int register_num)
|
||||
{
|
||||
u8 retval;
|
||||
|
||||
|
|
@ -77,14 +79,14 @@ static inline uint8_t fluke_read_byte_nolock(struct nec7210_priv *nec_priv,
|
|||
}
|
||||
|
||||
// don't use without locking nec_priv->register_page_lock
|
||||
static inline void fluke_write_byte_nolock(struct nec7210_priv *nec_priv, uint8_t data,
|
||||
static inline void fluke_write_byte_nolock(struct nec7210_priv *nec_priv, u8 data,
|
||||
int register_num)
|
||||
{
|
||||
writel(data, nec_priv->mmiobase + register_num * nec_priv->offset);
|
||||
}
|
||||
|
||||
static inline uint8_t fluke_paged_read_byte(struct fluke_priv *e_priv,
|
||||
unsigned int register_num, unsigned int page)
|
||||
static inline u8 fluke_paged_read_byte(struct fluke_priv *e_priv,
|
||||
unsigned int register_num, unsigned int page)
|
||||
{
|
||||
struct nec7210_priv *nec_priv = &e_priv->nec7210_priv;
|
||||
u8 retval;
|
||||
|
|
@ -99,7 +101,7 @@ static inline uint8_t fluke_paged_read_byte(struct fluke_priv *e_priv,
|
|||
return retval;
|
||||
}
|
||||
|
||||
static inline void fluke_paged_write_byte(struct fluke_priv *e_priv, uint8_t data,
|
||||
static inline void fluke_paged_write_byte(struct fluke_priv *e_priv, u8 data,
|
||||
unsigned int register_num, unsigned int page)
|
||||
{
|
||||
struct nec7210_priv *nec_priv = &e_priv->nec7210_priv;
|
||||
|
|
@ -124,11 +126,12 @@ enum bus_status_bits {
|
|||
};
|
||||
|
||||
enum cb7210_aux_cmds {
|
||||
/* AUX_RTL2 is an undocumented aux command which causes cb7210 to assert
|
||||
* (and keep asserted) local rtl message. This is used in conjunction
|
||||
* with the (stupid) cb7210 implementation
|
||||
* of the normal nec7210 AUX_RTL aux command, which
|
||||
* causes the rtl message to toggle between on and off.
|
||||
/*
|
||||
* AUX_RTL2 is an undocumented aux command which causes cb7210 to assert
|
||||
* (and keep asserted) local rtl message. This is used in conjunction
|
||||
* with the (stupid) cb7210 implementation
|
||||
* of the normal nec7210 AUX_RTL aux command, which
|
||||
* causes the rtl message to toggle between on and off.
|
||||
*/
|
||||
AUX_RTL2 = 0xd,
|
||||
AUX_NBAF = 0xe, // new byte available false (also clears seoi)
|
||||
|
|
|
|||
|
|
@ -32,13 +32,15 @@ MODULE_DESCRIPTION("GPIB Driver for fmh_gpib_core");
|
|||
MODULE_AUTHOR("Frank Mori Hess <fmh6jj@gmail.com>");
|
||||
|
||||
static irqreturn_t fmh_gpib_interrupt(int irq, void *arg);
|
||||
static int fmh_gpib_attach_holdoff_all(struct gpib_board *board, const gpib_board_config_t *config);
|
||||
static int fmh_gpib_attach_holdoff_end(struct gpib_board *board, const gpib_board_config_t *config);
|
||||
static int fmh_gpib_attach_holdoff_all(struct gpib_board *board,
|
||||
const struct gpib_board_config *config);
|
||||
static int fmh_gpib_attach_holdoff_end(struct gpib_board *board,
|
||||
const struct gpib_board_config *config);
|
||||
static void fmh_gpib_detach(struct gpib_board *board);
|
||||
static int fmh_gpib_pci_attach_holdoff_all(struct gpib_board *board,
|
||||
const gpib_board_config_t *config);
|
||||
const struct gpib_board_config *config);
|
||||
static int fmh_gpib_pci_attach_holdoff_end(struct gpib_board *board,
|
||||
const gpib_board_config_t *config);
|
||||
const struct gpib_board_config *config);
|
||||
static void fmh_gpib_pci_detach(struct gpib_board *board);
|
||||
static int fmh_gpib_config_dma(struct gpib_board *board, int output);
|
||||
static irqreturn_t fmh_gpib_internal_interrupt(struct gpib_board *board);
|
||||
|
|
@ -46,7 +48,7 @@ static struct platform_driver fmh_gpib_platform_driver;
|
|||
static struct pci_driver fmh_gpib_pci_driver;
|
||||
|
||||
// wrappers for interface functions
|
||||
static int fmh_gpib_read(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int fmh_gpib_read(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int *end, size_t *bytes_read)
|
||||
{
|
||||
struct fmh_priv *priv = board->private_data;
|
||||
|
|
@ -54,7 +56,7 @@ static int fmh_gpib_read(struct gpib_board *board, uint8_t *buffer, size_t lengt
|
|||
return nec7210_read(board, &priv->nec7210_priv, buffer, length, end, bytes_read);
|
||||
}
|
||||
|
||||
static int fmh_gpib_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int fmh_gpib_write(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int send_eoi, size_t *bytes_written)
|
||||
{
|
||||
struct fmh_priv *priv = board->private_data;
|
||||
|
|
@ -62,7 +64,7 @@ static int fmh_gpib_write(struct gpib_board *board, uint8_t *buffer, size_t leng
|
|||
return nec7210_write(board, &priv->nec7210_priv, buffer, length, send_eoi, bytes_written);
|
||||
}
|
||||
|
||||
static int fmh_gpib_command(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int fmh_gpib_command(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
struct fmh_priv *priv = board->private_data;
|
||||
|
|
@ -84,12 +86,12 @@ static int fmh_gpib_go_to_standby(struct gpib_board *board)
|
|||
return nec7210_go_to_standby(board, &priv->nec7210_priv);
|
||||
}
|
||||
|
||||
static void fmh_gpib_request_system_control(struct gpib_board *board, int request_control)
|
||||
static int fmh_gpib_request_system_control(struct gpib_board *board, int request_control)
|
||||
{
|
||||
struct fmh_priv *priv = board->private_data;
|
||||
struct nec7210_priv *nec_priv = &priv->nec7210_priv;
|
||||
|
||||
nec7210_request_system_control(board, nec_priv, request_control);
|
||||
return nec7210_request_system_control(board, nec_priv, request_control);
|
||||
}
|
||||
|
||||
static void fmh_gpib_interface_clear(struct gpib_board *board, int assert)
|
||||
|
|
@ -106,7 +108,7 @@ static void fmh_gpib_remote_enable(struct gpib_board *board, int enable)
|
|||
nec7210_remote_enable(board, &priv->nec7210_priv, enable);
|
||||
}
|
||||
|
||||
static int fmh_gpib_enable_eos(struct gpib_board *board, uint8_t eos_byte, int compare_8_bits)
|
||||
static int fmh_gpib_enable_eos(struct gpib_board *board, u8 eos_byte, int compare_8_bits)
|
||||
{
|
||||
struct fmh_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -141,14 +143,14 @@ static int fmh_gpib_secondary_address(struct gpib_board *board, unsigned int add
|
|||
return nec7210_secondary_address(board, &priv->nec7210_priv, address, enable);
|
||||
}
|
||||
|
||||
static int fmh_gpib_parallel_poll(struct gpib_board *board, uint8_t *result)
|
||||
static int fmh_gpib_parallel_poll(struct gpib_board *board, u8 *result)
|
||||
{
|
||||
struct fmh_priv *priv = board->private_data;
|
||||
|
||||
return nec7210_parallel_poll(board, &priv->nec7210_priv, result);
|
||||
}
|
||||
|
||||
static void fmh_gpib_parallel_poll_configure(struct gpib_board *board, uint8_t configuration)
|
||||
static void fmh_gpib_parallel_poll_configure(struct gpib_board *board, u8 configuration)
|
||||
{
|
||||
struct fmh_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -169,7 +171,8 @@ static void fmh_gpib_local_parallel_poll_mode(struct gpib_board *board, int loca
|
|||
if (local) {
|
||||
write_byte(&priv->nec7210_priv, AUX_I_REG | LOCAL_PPOLL_MODE_BIT, AUXMR);
|
||||
} else {
|
||||
/* For fmh_gpib_core, remote parallel poll config mode is unaffected by the
|
||||
/*
|
||||
* For fmh_gpib_core, remote parallel poll config mode is unaffected by the
|
||||
* state of the disable bit of the parallel poll register (unlike the tnt4882).
|
||||
* So, we don't need to worry about that.
|
||||
*/
|
||||
|
|
@ -177,7 +180,7 @@ static void fmh_gpib_local_parallel_poll_mode(struct gpib_board *board, int loca
|
|||
}
|
||||
}
|
||||
|
||||
static void fmh_gpib_serial_poll_response2(struct gpib_board *board, uint8_t status,
|
||||
static void fmh_gpib_serial_poll_response2(struct gpib_board *board, u8 status,
|
||||
int new_reason_for_service)
|
||||
{
|
||||
struct fmh_priv *priv = board->private_data;
|
||||
|
|
@ -195,7 +198,8 @@ static void fmh_gpib_serial_poll_response2(struct gpib_board *board, uint8_t sta
|
|||
}
|
||||
|
||||
if (reqt) {
|
||||
/* It may seem like a race to issue reqt before updating
|
||||
/*
|
||||
* It may seem like a race to issue reqt before updating
|
||||
* the status byte, but it is not. The chip does not
|
||||
* issue the reqt until the SPMR is written to at
|
||||
* a later time.
|
||||
|
|
@ -204,7 +208,8 @@ static void fmh_gpib_serial_poll_response2(struct gpib_board *board, uint8_t sta
|
|||
} else if (reqf) {
|
||||
write_byte(&priv->nec7210_priv, AUX_REQF, AUXMR);
|
||||
}
|
||||
/* We need to always zero bit 6 of the status byte before writing it to
|
||||
/*
|
||||
* We need to always zero bit 6 of the status byte before writing it to
|
||||
* the SPMR to insure we are using
|
||||
* serial poll mode SP1, and not accidentally triggering mode SP3.
|
||||
*/
|
||||
|
|
@ -212,7 +217,7 @@ static void fmh_gpib_serial_poll_response2(struct gpib_board *board, uint8_t sta
|
|||
spin_unlock_irqrestore(&board->spinlock, flags);
|
||||
}
|
||||
|
||||
static uint8_t fmh_gpib_serial_poll_status(struct gpib_board *board)
|
||||
static u8 fmh_gpib_serial_poll_status(struct gpib_board *board)
|
||||
{
|
||||
struct fmh_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -333,7 +338,8 @@ static int wait_for_rx_fifo_half_full_or_end(struct gpib_board *board)
|
|||
return retval;
|
||||
}
|
||||
|
||||
/* Wait until the gpib chip is ready to accept a data out byte.
|
||||
/*
|
||||
* Wait until the gpib chip is ready to accept a data out byte.
|
||||
*/
|
||||
static int wait_for_data_out_ready(struct gpib_board *board)
|
||||
{
|
||||
|
|
@ -377,7 +383,8 @@ static void fmh_gpib_dma_callback(void *arg)
|
|||
spin_unlock_irqrestore(&board->spinlock, flags);
|
||||
}
|
||||
|
||||
/* returns true when all the bytes of a write have been transferred to
|
||||
/*
|
||||
* returns true when all the bytes of a write have been transferred to
|
||||
* the chip and successfully transferred out over the gpib bus.
|
||||
*/
|
||||
static int fmh_gpib_all_bytes_are_sent(struct fmh_priv *e_priv)
|
||||
|
|
@ -391,7 +398,7 @@ static int fmh_gpib_all_bytes_are_sent(struct fmh_priv *e_priv)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int fmh_gpib_dma_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int fmh_gpib_dma_write(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
struct fmh_priv *e_priv = board->private_data;
|
||||
|
|
@ -469,7 +476,7 @@ cleanup:
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int fmh_gpib_accel_write(struct gpib_board *board, uint8_t *buffer,
|
||||
static int fmh_gpib_accel_write(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, int send_eoi, size_t *bytes_written)
|
||||
{
|
||||
struct fmh_priv *e_priv = board->private_data;
|
||||
|
|
@ -523,7 +530,8 @@ static int fmh_gpib_accel_write(struct gpib_board *board, uint8_t *buffer,
|
|||
if (WARN_ON_ONCE(remainder != 1))
|
||||
return -EFAULT;
|
||||
|
||||
/* wait until we are sure we will be able to write the data byte
|
||||
/*
|
||||
* wait until we are sure we will be able to write the data byte
|
||||
* into the chip before we send AUX_SEOI. This prevents a timeout
|
||||
* scenario where we send AUX_SEOI but then timeout without getting
|
||||
* any bytes into the gpib chip. This will result in the first byte
|
||||
|
|
@ -554,8 +562,10 @@ static int fmh_gpib_get_dma_residue(struct dma_chan *chan, dma_cookie_t cookie)
|
|||
return result;
|
||||
}
|
||||
dmaengine_tx_status(chan, cookie, &state);
|
||||
// dma330 hardware doesn't support resume, so dont call this
|
||||
// method unless the dma transfer is done.
|
||||
/*
|
||||
* dma330 hardware doesn't support resume, so dont call this
|
||||
* method unless the dma transfer is done.
|
||||
*/
|
||||
return state.residue;
|
||||
}
|
||||
|
||||
|
|
@ -581,10 +591,11 @@ static int wait_for_tx_fifo_half_empty(struct gpib_board *board)
|
|||
return retval;
|
||||
}
|
||||
|
||||
/* supports writing a chunk of data whose length must fit into the hardware'd xfer counter,
|
||||
/*
|
||||
* supports writing a chunk of data whose length must fit into the hardware'd xfer counter,
|
||||
* called in a loop by fmh_gpib_fifo_write()
|
||||
*/
|
||||
static int fmh_gpib_fifo_write_countable(struct gpib_board *board, uint8_t *buffer,
|
||||
static int fmh_gpib_fifo_write_countable(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, int send_eoi, size_t *bytes_written)
|
||||
{
|
||||
struct fmh_priv *e_priv = board->private_data;
|
||||
|
|
@ -650,7 +661,7 @@ cleanup:
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int fmh_gpib_fifo_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int fmh_gpib_fifo_write(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int send_eoi, size_t *bytes_written)
|
||||
{
|
||||
struct fmh_priv *e_priv = board->private_data;
|
||||
|
|
@ -697,7 +708,7 @@ static int fmh_gpib_fifo_write(struct gpib_board *board, uint8_t *buffer, size_t
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int fmh_gpib_dma_read(struct gpib_board *board, uint8_t *buffer,
|
||||
static int fmh_gpib_dma_read(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, int *end, size_t *bytes_read)
|
||||
{
|
||||
struct fmh_priv *e_priv = board->private_data;
|
||||
|
|
@ -768,8 +779,10 @@ static int fmh_gpib_dma_read(struct gpib_board *board, uint8_t *buffer,
|
|||
// stop the dma transfer
|
||||
nec7210_set_reg_bits(nec_priv, IMR2, HR_DMAI, 0);
|
||||
fifos_write(e_priv, 0, FIFO_CONTROL_STATUS_REG);
|
||||
// give time for pl330 to transfer any in-flight data, since
|
||||
// pl330 will throw it away when dmaengine_pause is called.
|
||||
/*
|
||||
* give time for pl330 to transfer any in-flight data, since
|
||||
* pl330 will throw it away when dmaengine_pause is called.
|
||||
*/
|
||||
usleep_range(10, 15);
|
||||
residue = fmh_gpib_get_dma_residue(e_priv->dma_channel, dma_cookie);
|
||||
if (WARN_ON_ONCE(residue > length || residue < 0))
|
||||
|
|
@ -793,14 +806,17 @@ static int fmh_gpib_dma_read(struct gpib_board *board, uint8_t *buffer,
|
|||
buffer[(*bytes_read)++] = fifos_read(e_priv, FIFO_DATA_REG) & fifo_data_mask;
|
||||
}
|
||||
|
||||
/* If we got an end interrupt, figure out if it was
|
||||
/*
|
||||
* If we got an end interrupt, figure out if it was
|
||||
* associated with the last byte we dma'd or with a
|
||||
* byte still sitting on the cb7210.
|
||||
*/
|
||||
spin_lock_irqsave(&board->spinlock, flags);
|
||||
if (*bytes_read > 0 && test_bit(READ_READY_BN, &nec_priv->state) == 0) {
|
||||
// If there is no byte sitting on the cb7210 and we
|
||||
// saw an end, we need to deal with it now
|
||||
/*
|
||||
* If there is no byte sitting on the cb7210 and we
|
||||
* saw an end, we need to deal with it now
|
||||
*/
|
||||
if (test_and_clear_bit(RECEIVED_END_BN, &nec_priv->state))
|
||||
*end = 1;
|
||||
}
|
||||
|
|
@ -819,7 +835,8 @@ static void fmh_gpib_release_rfd_holdoff(struct gpib_board *board, struct fmh_pr
|
|||
|
||||
ext_status_1 = read_byte(nec_priv, EXT_STATUS_1_REG);
|
||||
|
||||
/* if there is an end byte sitting on the chip, don't release
|
||||
/*
|
||||
* if there is an end byte sitting on the chip, don't release
|
||||
* holdoff. We want it left set after we read out the end
|
||||
* byte.
|
||||
*/
|
||||
|
|
@ -828,7 +845,8 @@ static void fmh_gpib_release_rfd_holdoff(struct gpib_board *board, struct fmh_pr
|
|||
if (ext_status_1 & RFD_HOLDOFF_STATUS_BIT)
|
||||
write_byte(nec_priv, AUX_FH, AUXMR);
|
||||
|
||||
/* Check if an end byte raced in before we executed the AUX_FH command.
|
||||
/*
|
||||
* Check if an end byte raced in before we executed the AUX_FH command.
|
||||
* If it did, we want to make sure the rfd holdoff is in effect. The end
|
||||
* byte can arrive since
|
||||
* AUX_RFD_HOLDOFF_ASAP doesn't immediately force the acceptor handshake
|
||||
|
|
@ -846,7 +864,7 @@ static void fmh_gpib_release_rfd_holdoff(struct gpib_board *board, struct fmh_pr
|
|||
spin_unlock_irqrestore(&board->spinlock, flags);
|
||||
}
|
||||
|
||||
static int fmh_gpib_accel_read(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int fmh_gpib_accel_read(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int *end, size_t *bytes_read)
|
||||
{
|
||||
struct fmh_priv *e_priv = board->private_data;
|
||||
|
|
@ -893,10 +911,11 @@ static int fmh_gpib_accel_read(struct gpib_board *board, uint8_t *buffer, size_t
|
|||
return retval;
|
||||
}
|
||||
|
||||
/* Read a chunk of data whose length is within the limits of the hardware's
|
||||
/*
|
||||
* Read a chunk of data whose length is within the limits of the hardware's
|
||||
* xfer counter. Called in a loop from fmh_gpib_fifo_read().
|
||||
*/
|
||||
static int fmh_gpib_fifo_read_countable(struct gpib_board *board, uint8_t *buffer,
|
||||
static int fmh_gpib_fifo_read_countable(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, int *end, size_t *bytes_read)
|
||||
{
|
||||
struct fmh_priv *e_priv = board->private_data;
|
||||
|
|
@ -954,7 +973,7 @@ cleanup:
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int fmh_gpib_fifo_read(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int fmh_gpib_fifo_read(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int *end, size_t *bytes_read)
|
||||
{
|
||||
struct fmh_priv *e_priv = board->private_data;
|
||||
|
|
@ -969,7 +988,8 @@ static int fmh_gpib_fifo_read(struct gpib_board *board, uint8_t *buffer, size_t
|
|||
*end = 0;
|
||||
*bytes_read = 0;
|
||||
|
||||
/* Do a little prep with data in interrupt so that following wait_for_read()
|
||||
/*
|
||||
* Do a little prep with data in interrupt so that following wait_for_read()
|
||||
* will wake up if a data byte is received.
|
||||
*/
|
||||
nec7210_set_reg_bits(nec_priv, IMR1, HR_DIIE, HR_DIIE);
|
||||
|
|
@ -1011,7 +1031,7 @@ static int fmh_gpib_fifo_read(struct gpib_board *board, uint8_t *buffer, size_t
|
|||
return retval;
|
||||
}
|
||||
|
||||
static gpib_interface_t fmh_gpib_unaccel_interface = {
|
||||
static struct gpib_interface fmh_gpib_unaccel_interface = {
|
||||
.name = "fmh_gpib_unaccel",
|
||||
.attach = fmh_gpib_attach_holdoff_all,
|
||||
.detach = fmh_gpib_detach,
|
||||
|
|
@ -1039,7 +1059,7 @@ static gpib_interface_t fmh_gpib_unaccel_interface = {
|
|||
.return_to_local = fmh_gpib_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t fmh_gpib_interface = {
|
||||
static struct gpib_interface fmh_gpib_interface = {
|
||||
.name = "fmh_gpib",
|
||||
.attach = fmh_gpib_attach_holdoff_end,
|
||||
.detach = fmh_gpib_detach,
|
||||
|
|
@ -1067,7 +1087,7 @@ static gpib_interface_t fmh_gpib_interface = {
|
|||
.return_to_local = fmh_gpib_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t fmh_gpib_pci_interface = {
|
||||
static struct gpib_interface fmh_gpib_pci_interface = {
|
||||
.name = "fmh_gpib_pci",
|
||||
.attach = fmh_gpib_pci_attach_holdoff_end,
|
||||
.detach = fmh_gpib_pci_detach,
|
||||
|
|
@ -1095,7 +1115,7 @@ static gpib_interface_t fmh_gpib_pci_interface = {
|
|||
.return_to_local = fmh_gpib_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t fmh_gpib_pci_unaccel_interface = {
|
||||
static struct gpib_interface fmh_gpib_pci_unaccel_interface = {
|
||||
.name = "fmh_gpib_pci_unaccel",
|
||||
.attach = fmh_gpib_pci_attach_holdoff_all,
|
||||
.detach = fmh_gpib_pci_detach,
|
||||
|
|
@ -1136,7 +1156,7 @@ irqreturn_t fmh_gpib_internal_interrupt(struct gpib_board *board)
|
|||
fifo_status = fifos_read(priv, FIFO_CONTROL_STATUS_REG);
|
||||
|
||||
if (status0 & IFC_INTERRUPT_BIT) {
|
||||
push_gpib_event(board, EventIFC);
|
||||
push_gpib_event(board, EVENT_IFC);
|
||||
retval = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
|
@ -1166,7 +1186,8 @@ irqreturn_t fmh_gpib_internal_interrupt(struct gpib_board *board)
|
|||
clear_bit(RFD_HOLDOFF_BN, &nec_priv->state);
|
||||
|
||||
if (ext_status_1 & END_STATUS_BIT) {
|
||||
/* only set RECEIVED_END while there is still a data
|
||||
/*
|
||||
* only set RECEIVED_END while there is still a data
|
||||
* byte sitting in the chip, to avoid spuriously
|
||||
* setting it multiple times after it has been cleared
|
||||
* during a read.
|
||||
|
|
@ -1179,7 +1200,8 @@ irqreturn_t fmh_gpib_internal_interrupt(struct gpib_board *board)
|
|||
|
||||
if ((fifo_status & TX_FIFO_HALF_EMPTY_INTERRUPT_IS_ENABLED) &&
|
||||
(fifo_status & TX_FIFO_HALF_EMPTY)) {
|
||||
/* We really only want to clear the
|
||||
/*
|
||||
* We really only want to clear the
|
||||
* TX_FIFO_HALF_EMPTY_INTERRUPT_ENABLE bit in the
|
||||
* FIFO_CONTROL_STATUS_REG. Since we are not being
|
||||
* careful, this also has a side effect of disabling
|
||||
|
|
@ -1193,7 +1215,8 @@ irqreturn_t fmh_gpib_internal_interrupt(struct gpib_board *board)
|
|||
|
||||
if ((fifo_status & RX_FIFO_HALF_FULL_INTERRUPT_IS_ENABLED) &&
|
||||
(fifo_status & RX_FIFO_HALF_FULL)) {
|
||||
/* We really only want to clear the
|
||||
/*
|
||||
* We really only want to clear the
|
||||
* RX_FIFO_HALF_FULL_INTERRUPT_ENABLE bit in the
|
||||
* FIFO_CONTROL_STATUS_REG. Since we are not being
|
||||
* careful, this also has a side effect of disabling
|
||||
|
|
@ -1335,7 +1358,7 @@ static int fmh_gpib_init(struct fmh_priv *e_priv, struct gpib_board *board, int
|
|||
/* Match callback for driver_find_device */
|
||||
static int fmh_gpib_device_match(struct device *dev, const void *data)
|
||||
{
|
||||
const gpib_board_config_t *config = data;
|
||||
const struct gpib_board_config *config = data;
|
||||
|
||||
if (dev_get_drvdata(dev))
|
||||
return 0;
|
||||
|
|
@ -1351,7 +1374,7 @@ static int fmh_gpib_device_match(struct device *dev, const void *data)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int fmh_gpib_attach_impl(struct gpib_board *board, const gpib_board_config_t *config,
|
||||
static int fmh_gpib_attach_impl(struct gpib_board *board, const struct gpib_board_config *config,
|
||||
unsigned int handshake_mode, int acquire_dma)
|
||||
{
|
||||
struct fmh_priv *e_priv;
|
||||
|
|
@ -1424,10 +1447,8 @@ static int fmh_gpib_attach_impl(struct gpib_board *board, const gpib_board_confi
|
|||
(unsigned long)resource_size(e_priv->dma_port_res));
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0) {
|
||||
dev_err(board->dev, "request for IRQ failed\n");
|
||||
if (irq < 0)
|
||||
return -EBUSY;
|
||||
}
|
||||
retval = request_irq(irq, fmh_gpib_interrupt, IRQF_SHARED, pdev->name, board);
|
||||
if (retval) {
|
||||
dev_err(board->dev,
|
||||
|
|
@ -1444,7 +1465,8 @@ static int fmh_gpib_attach_impl(struct gpib_board *board, const gpib_board_confi
|
|||
return -EIO;
|
||||
}
|
||||
}
|
||||
/* in the future we might want to know the half-fifo size
|
||||
/*
|
||||
* in the future we might want to know the half-fifo size
|
||||
* (dma_burst_length) even when not using dma, so go ahead an
|
||||
* initialize it unconditionally.
|
||||
*/
|
||||
|
|
@ -1454,12 +1476,12 @@ static int fmh_gpib_attach_impl(struct gpib_board *board, const gpib_board_confi
|
|||
return fmh_gpib_init(e_priv, board, handshake_mode);
|
||||
}
|
||||
|
||||
int fmh_gpib_attach_holdoff_all(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
int fmh_gpib_attach_holdoff_all(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
return fmh_gpib_attach_impl(board, config, HR_HLDA, 0);
|
||||
}
|
||||
|
||||
int fmh_gpib_attach_holdoff_end(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
int fmh_gpib_attach_holdoff_end(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
return fmh_gpib_attach_impl(board, config, HR_HLDE, 1);
|
||||
}
|
||||
|
|
@ -1497,7 +1519,8 @@ void fmh_gpib_detach(struct gpib_board *board)
|
|||
fmh_gpib_generic_detach(board);
|
||||
}
|
||||
|
||||
static int fmh_gpib_pci_attach_impl(struct gpib_board *board, const gpib_board_config_t *config,
|
||||
static int fmh_gpib_pci_attach_impl(struct gpib_board *board,
|
||||
const struct gpib_board_config *config,
|
||||
unsigned int handshake_mode)
|
||||
{
|
||||
struct fmh_priv *e_priv;
|
||||
|
|
@ -1570,12 +1593,14 @@ static int fmh_gpib_pci_attach_impl(struct gpib_board *board, const gpib_board_c
|
|||
return fmh_gpib_init(e_priv, board, handshake_mode);
|
||||
}
|
||||
|
||||
int fmh_gpib_pci_attach_holdoff_all(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
int fmh_gpib_pci_attach_holdoff_all(struct gpib_board *board,
|
||||
const struct gpib_board_config *config)
|
||||
{
|
||||
return fmh_gpib_pci_attach_impl(board, config, HR_HLDA);
|
||||
}
|
||||
|
||||
int fmh_gpib_pci_attach_holdoff_end(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
int fmh_gpib_pci_attach_holdoff_end(struct gpib_board *board,
|
||||
const struct gpib_board_config *config)
|
||||
{
|
||||
int retval;
|
||||
struct fmh_priv *e_priv;
|
||||
|
|
@ -1631,7 +1656,6 @@ MODULE_DEVICE_TABLE(of, fmh_gpib_of_match);
|
|||
static struct platform_driver fmh_gpib_platform_driver = {
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = fmh_gpib_of_match,
|
||||
},
|
||||
.probe = &fmh_gpib_platform_probe
|
||||
|
|
|
|||
|
|
@ -124,13 +124,13 @@ static const unsigned int fifo_data_mask = 0x00ff;
|
|||
static const unsigned int fifo_xfer_counter_mask = 0x0fff;
|
||||
static const unsigned int fifo_max_burst_length_mask = 0x00ff;
|
||||
|
||||
static inline uint8_t gpib_cs_read_byte(struct nec7210_priv *nec_priv,
|
||||
unsigned int register_num)
|
||||
static inline u8 gpib_cs_read_byte(struct nec7210_priv *nec_priv,
|
||||
unsigned int register_num)
|
||||
{
|
||||
return readb(nec_priv->mmiobase + register_num * nec_priv->offset);
|
||||
}
|
||||
|
||||
static inline void gpib_cs_write_byte(struct nec7210_priv *nec_priv, uint8_t data,
|
||||
static inline void gpib_cs_write_byte(struct nec7210_priv *nec_priv, u8 data,
|
||||
unsigned int register_num)
|
||||
{
|
||||
writeb(data, nec_priv->mmiobase + register_num * nec_priv->offset);
|
||||
|
|
|
|||
|
|
@ -32,7 +32,8 @@
|
|||
#define ENABLE_IRQ(IRQ, TYPE) irq_set_irq_type(IRQ, TYPE)
|
||||
#define DISABLE_IRQ(IRQ) irq_set_irq_type(IRQ, IRQ_TYPE_NONE)
|
||||
|
||||
/* Debug print levels:
|
||||
/*
|
||||
* Debug print levels:
|
||||
* 0 = load/unload info and errors that make the driver fail;
|
||||
* 1 = + warnings for unforeseen events that may break the current
|
||||
* operation and lead to a timeout, but do not affect the
|
||||
|
|
@ -65,7 +66,6 @@
|
|||
#include <linux/gpio/machine.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
static int sn7516x_used = 1, sn7516x;
|
||||
module_param(sn7516x_used, int, 0660);
|
||||
|
|
@ -135,19 +135,14 @@ enum lines_t {
|
|||
#define SN7516X_PINS 4
|
||||
#define NUM_PINS (GPIB_PINS + SN7516X_PINS)
|
||||
|
||||
DEFINE_LED_TRIGGER(ledtrig_gpib);
|
||||
#define ACT_LED_ON do { \
|
||||
#define ACT_LED_ON do { \
|
||||
if (ACT_LED) \
|
||||
gpiod_direction_output(ACT_LED, 1); \
|
||||
else \
|
||||
led_trigger_event(ledtrig_gpib, LED_FULL); } \
|
||||
while (0)
|
||||
#define ACT_LED_OFF do { \
|
||||
gpiod_direction_output(ACT_LED, 1); \
|
||||
} while (0)
|
||||
#define ACT_LED_OFF do { \
|
||||
if (ACT_LED) \
|
||||
gpiod_direction_output(ACT_LED, 0); \
|
||||
else \
|
||||
led_trigger_event(ledtrig_gpib, LED_OFF); } \
|
||||
while (0)
|
||||
gpiod_direction_output(ACT_LED, 0); \
|
||||
} while (0)
|
||||
|
||||
static struct gpio_desc *all_descriptors[GPIB_PINS + SN7516X_PINS];
|
||||
|
||||
|
|
@ -311,7 +306,6 @@ struct bb_priv {
|
|||
int dav_seq;
|
||||
long all_irqs;
|
||||
int dav_idle;
|
||||
int atn_asserted;
|
||||
|
||||
enum talker_function_state talker_state;
|
||||
enum listener_function_state listener_state;
|
||||
|
|
@ -324,7 +318,7 @@ static void set_data_lines(u8 byte);
|
|||
static u8 get_data_lines(void);
|
||||
static void set_data_lines_input(void);
|
||||
static void set_data_lines_output(void);
|
||||
static inline int check_for_eos(struct bb_priv *priv, uint8_t byte);
|
||||
static inline int check_for_eos(struct bb_priv *priv, u8 byte);
|
||||
static void set_atn(struct gpib_board *board, int atn_asserted);
|
||||
|
||||
static inline void SET_DIR_WRITE(struct bb_priv *priv);
|
||||
|
|
@ -353,7 +347,7 @@ static char printable(char x)
|
|||
* *
|
||||
***************************************************************************/
|
||||
|
||||
static int bb_read(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int bb_read(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int *end, size_t *bytes_read)
|
||||
{
|
||||
struct bb_priv *priv = board->private_data;
|
||||
|
|
@ -491,7 +485,7 @@ dav_exit:
|
|||
* *
|
||||
***************************************************************************/
|
||||
|
||||
static int bb_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int bb_write(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int send_eoi, size_t *bytes_written)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
|
@ -522,7 +516,7 @@ static int bb_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
|||
gpiod_get_value(NRFD), gpiod_get_value(NDAC));
|
||||
|
||||
if (gpiod_get_value(NRFD) && gpiod_get_value(NDAC)) { /* check for listener */
|
||||
retval = -ENODEV;
|
||||
retval = -ENOTCONN;
|
||||
goto write_end;
|
||||
}
|
||||
|
||||
|
|
@ -619,7 +613,8 @@ static irqreturn_t bb_NRFD_interrupt(int irq, void *arg)
|
|||
goto nrfd_exit;
|
||||
}
|
||||
|
||||
if (priv->atn_asserted && priv->w_cnt >= priv->length) { // test for end of transfer
|
||||
if (priv->w_cnt >= priv->length) { // test for missed NDAC end of transfer
|
||||
dev_err(board->gpib_dev, "Unexpected NRFD exit\n");
|
||||
priv->write_done = 1;
|
||||
priv->w_busy = 0;
|
||||
wake_up_interruptible(&board->wait);
|
||||
|
|
@ -691,14 +686,14 @@ static irqreturn_t bb_NDAC_interrupt(int irq, void *arg)
|
|||
|
||||
dbg_printk(3, "accepted %zu\n", priv->w_cnt - 1);
|
||||
|
||||
if (!priv->atn_asserted && priv->w_cnt >= priv->length) { // test for end of transfer
|
||||
gpiod_set_value(DAV, 1); // Data not available
|
||||
priv->dav_tx = 1;
|
||||
priv->phase = 510;
|
||||
|
||||
if (priv->w_cnt >= priv->length) { // test for end of transfer
|
||||
priv->write_done = 1;
|
||||
priv->w_busy = 0;
|
||||
wake_up_interruptible(&board->wait);
|
||||
} else {
|
||||
gpiod_set_value(DAV, 1); // Data not available
|
||||
priv->dav_tx = 1;
|
||||
priv->phase = 510;
|
||||
}
|
||||
|
||||
ndac_exit:
|
||||
|
|
@ -728,7 +723,7 @@ static irqreturn_t bb_SRQ_interrupt(int irq, void *arg)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int bb_command(struct gpib_board *board, uint8_t *buffer,
|
||||
static int bb_command(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, size_t *bytes_written)
|
||||
{
|
||||
size_t ret;
|
||||
|
|
@ -855,6 +850,7 @@ static void set_atn(struct gpib_board *board, int atn_asserted)
|
|||
priv->listener_state = listener_addressed;
|
||||
if (priv->talker_state == talker_active)
|
||||
priv->talker_state = talker_addressed;
|
||||
SET_DIR_WRITE(priv); // need to be able to read bus NRFD/NDAC
|
||||
} else {
|
||||
if (priv->listener_state == listener_addressed) {
|
||||
priv->listener_state = listener_active;
|
||||
|
|
@ -864,14 +860,12 @@ static void set_atn(struct gpib_board *board, int atn_asserted)
|
|||
priv->talker_state = talker_active;
|
||||
}
|
||||
gpiod_direction_output(_ATN, !atn_asserted);
|
||||
priv->atn_asserted = atn_asserted;
|
||||
}
|
||||
|
||||
static int bb_take_control(struct gpib_board *board, int synchronous)
|
||||
{
|
||||
dbg_printk(2, "%d\n", synchronous);
|
||||
set_atn(board, 1);
|
||||
set_bit(CIC_NUM, &board->status);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -882,16 +876,24 @@ static int bb_go_to_standby(struct gpib_board *board)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void bb_request_system_control(struct gpib_board *board, int request_control)
|
||||
static int bb_request_system_control(struct gpib_board *board, int request_control)
|
||||
{
|
||||
struct bb_priv *priv = board->private_data;
|
||||
|
||||
dbg_printk(2, "%d\n", request_control);
|
||||
if (request_control) {
|
||||
set_bit(CIC_NUM, &board->status);
|
||||
// drive DAV & EOI false, enable NRFD & NDAC irqs
|
||||
SET_DIR_WRITE(board->private_data);
|
||||
} else {
|
||||
clear_bit(CIC_NUM, &board->status);
|
||||
}
|
||||
if (!request_control)
|
||||
return -EINVAL;
|
||||
|
||||
gpiod_direction_output(REN, 1); /* user space must enable REN if needed */
|
||||
gpiod_direction_output(IFC, 1); /* user space must toggle IFC if needed */
|
||||
if (sn7516x)
|
||||
gpiod_direction_output(DC, 0); /* enable ATN as output on SN75161/2 */
|
||||
|
||||
gpiod_direction_input(SRQ);
|
||||
|
||||
ENABLE_IRQ(priv->irq_SRQ, IRQ_TYPE_EDGE_FALLING);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void bb_interface_clear(struct gpib_board *board, int assert)
|
||||
|
|
@ -903,6 +905,7 @@ static void bb_interface_clear(struct gpib_board *board, int assert)
|
|||
gpiod_direction_output(IFC, 0);
|
||||
priv->talker_state = talker_idle;
|
||||
priv->listener_state = listener_idle;
|
||||
set_bit(CIC_NUM, &board->status);
|
||||
} else {
|
||||
gpiod_direction_output(IFC, 1);
|
||||
}
|
||||
|
|
@ -920,7 +923,7 @@ static void bb_remote_enable(struct gpib_board *board, int enable)
|
|||
}
|
||||
}
|
||||
|
||||
static int bb_enable_eos(struct gpib_board *board, uint8_t eos_byte, int compare_8_bits)
|
||||
static int bb_enable_eos(struct gpib_board *board, u8 eos_byte, int compare_8_bits)
|
||||
{
|
||||
struct bb_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -987,12 +990,12 @@ static int bb_secondary_address(struct gpib_board *board, unsigned int address,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int bb_parallel_poll(struct gpib_board *board, uint8_t *result)
|
||||
static int bb_parallel_poll(struct gpib_board *board, u8 *result)
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
static void bb_parallel_poll_configure(struct gpib_board *board, uint8_t config)
|
||||
static void bb_parallel_poll_configure(struct gpib_board *board, u8 config)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -1000,11 +1003,11 @@ static void bb_parallel_poll_response(struct gpib_board *board, int ist)
|
|||
{
|
||||
}
|
||||
|
||||
static void bb_serial_poll_response(struct gpib_board *board, uint8_t status)
|
||||
static void bb_serial_poll_response(struct gpib_board *board, u8 status)
|
||||
{
|
||||
}
|
||||
|
||||
static uint8_t bb_serial_poll_status(struct gpib_board *board)
|
||||
static u8 bb_serial_poll_status(struct gpib_board *board)
|
||||
{
|
||||
return 0; // -ENOENT;
|
||||
}
|
||||
|
|
@ -1120,8 +1123,7 @@ static void release_gpios(void)
|
|||
|
||||
static int allocate_gpios(struct gpib_board *board)
|
||||
{
|
||||
int j, retval = 0;
|
||||
bool error = false;
|
||||
int j;
|
||||
int table_index = 0;
|
||||
char name[256];
|
||||
struct gpio_desc *desc;
|
||||
|
|
@ -1132,8 +1134,8 @@ static int allocate_gpios(struct gpib_board *board)
|
|||
return -ENOENT;
|
||||
}
|
||||
|
||||
lookup_table = lookup_tables[0];
|
||||
lookup_table->dev_id = dev_name(board->gpib_dev);
|
||||
lookup_table = lookup_tables[table_index];
|
||||
lookup_table->dev_id = dev_name(board->gpib_dev);
|
||||
gpiod_add_lookup_table(lookup_table);
|
||||
dbg_printk(1, "Allocating gpios using table index %d\n", table_index);
|
||||
|
||||
|
|
@ -1150,30 +1152,26 @@ try_again:
|
|||
gpiod_remove_lookup_table(lookup_table);
|
||||
table_index++;
|
||||
lookup_table = lookup_tables[table_index];
|
||||
if (lookup_table) {
|
||||
dbg_printk(1, "Allocation failed, now using table_index %d\n",
|
||||
table_index);
|
||||
lookup_table->dev_id = dev_name(board->gpib_dev);
|
||||
gpiod_add_lookup_table(lookup_table);
|
||||
goto try_again;
|
||||
if (!lookup_table) {
|
||||
dev_err(board->gpib_dev, "Unable to obtain gpio descriptor for pin %d error %ld\n",
|
||||
gpios_vector[j], PTR_ERR(desc));
|
||||
goto alloc_gpios_fail;
|
||||
}
|
||||
dev_err(board->gpib_dev, "Unable to obtain gpio descriptor for pin %d error %ld\n",
|
||||
gpios_vector[j], PTR_ERR(desc));
|
||||
error = true;
|
||||
break;
|
||||
dbg_printk(1, "Allocation failed, now using table_index %d\n", table_index);
|
||||
lookup_table->dev_id = dev_name(board->gpib_dev);
|
||||
gpiod_add_lookup_table(lookup_table);
|
||||
goto try_again;
|
||||
}
|
||||
all_descriptors[j] = desc;
|
||||
}
|
||||
|
||||
if (error) { /* undo what already done */
|
||||
release_gpios();
|
||||
retval = -1;
|
||||
}
|
||||
if (lookup_table)
|
||||
gpiod_remove_lookup_table(lookup_table);
|
||||
// Initialize LED trigger
|
||||
led_trigger_register_simple("gpib", &ledtrig_gpib);
|
||||
return retval;
|
||||
gpiod_remove_lookup_table(lookup_table);
|
||||
|
||||
return 0;
|
||||
|
||||
alloc_gpios_fail:
|
||||
release_gpios();
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void bb_detach(struct gpib_board *board)
|
||||
|
|
@ -1184,8 +1182,6 @@ static void bb_detach(struct gpib_board *board)
|
|||
if (!board->private_data)
|
||||
return;
|
||||
|
||||
led_trigger_unregister_simple(ledtrig_gpib);
|
||||
|
||||
bb_free_irq(board, &priv->irq_DAV, NAME "_DAV");
|
||||
bb_free_irq(board, &priv->irq_NRFD, NAME "_NRFD");
|
||||
bb_free_irq(board, &priv->irq_NDAC, NAME "_NDAC");
|
||||
|
|
@ -1206,7 +1202,7 @@ static void bb_detach(struct gpib_board *board)
|
|||
free_private(board);
|
||||
}
|
||||
|
||||
static int bb_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int bb_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
struct bb_priv *priv;
|
||||
int retval = 0;
|
||||
|
|
@ -1245,7 +1241,6 @@ static int bb_attach(struct gpib_board *board, const gpib_board_config_t *config
|
|||
gpios_vector[&(D06) - &all_descriptors[0]] = YOGA_D06_pin_nr;
|
||||
gpios_vector[&(PE) - &all_descriptors[0]] = -1;
|
||||
gpios_vector[&(DC) - &all_descriptors[0]] = -1;
|
||||
gpios_vector[&(ACT_LED) - &all_descriptors[0]] = -1;
|
||||
} else {
|
||||
dev_err(board->gpib_dev, "Unrecognized pin map %s\n", pin_map);
|
||||
goto bb_attach_fail;
|
||||
|
|
@ -1256,7 +1251,8 @@ static int bb_attach(struct gpib_board *board, const gpib_board_config_t *config
|
|||
if (allocate_gpios(board))
|
||||
goto bb_attach_fail;
|
||||
|
||||
/* Configure SN7516X control lines.
|
||||
/*
|
||||
* Configure SN7516X control lines.
|
||||
* drive ATN, IFC and REN as outputs only when master
|
||||
* i.e. system controller. In this mode can only be the CIC
|
||||
* When not master then enable device mode ATN, IFC & REN as inputs
|
||||
|
|
@ -1266,6 +1262,10 @@ static int bb_attach(struct gpib_board *board, const gpib_board_config_t *config
|
|||
gpiod_direction_output(TE, 1);
|
||||
gpiod_direction_output(PE, 1);
|
||||
}
|
||||
/* Set main control lines to a known state */
|
||||
gpiod_direction_output(IFC, 1);
|
||||
gpiod_direction_output(REN, 1);
|
||||
gpiod_direction_output(_ATN, 1);
|
||||
|
||||
if (strcmp(PINMAP_2, pin_map) == 0) { /* YOGA: enable level shifters */
|
||||
gpiod_direction_output(YOGA_ENABLE, 1);
|
||||
|
|
@ -1293,8 +1293,6 @@ static int bb_attach(struct gpib_board *board, const gpib_board_config_t *config
|
|||
IRQF_TRIGGER_NONE))
|
||||
goto bb_attach_fail_r;
|
||||
|
||||
ENABLE_IRQ(priv->irq_SRQ, IRQ_TYPE_EDGE_FALLING);
|
||||
|
||||
dbg_printk(0, "attached board %d\n", board->minor);
|
||||
goto bb_attach_out;
|
||||
|
||||
|
|
@ -1306,7 +1304,7 @@ bb_attach_out:
|
|||
return retval;
|
||||
}
|
||||
|
||||
static gpib_interface_t bb_interface = {
|
||||
static struct gpib_interface bb_interface = {
|
||||
.name = NAME,
|
||||
.attach = bb_attach,
|
||||
.detach = bb_detach,
|
||||
|
|
@ -1364,7 +1362,7 @@ inline long usec_diff(struct timespec64 *a, struct timespec64 *b)
|
|||
(a->tv_nsec - b->tv_nsec) / 1000);
|
||||
}
|
||||
|
||||
static inline int check_for_eos(struct bb_priv *priv, uint8_t byte)
|
||||
static inline int check_for_eos(struct bb_priv *priv, u8 byte)
|
||||
{
|
||||
if (priv->eos_check)
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -4,8 +4,9 @@
|
|||
* copyright : (C) 2002 by Frank Mori Hess *
|
||||
***************************************************************************/
|
||||
|
||||
/*should enable ATN interrupts (and update board->status on occurrence),
|
||||
* implement recovery from bus errors (if necessary)
|
||||
/*
|
||||
* should enable ATN interrupts (and update board->status on occurrence),
|
||||
* implement recovery from bus errors (if necessary)
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
|
@ -24,12 +25,12 @@
|
|||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("GPIB driver for HP 82335 interface cards");
|
||||
|
||||
static int hp82335_attach(struct gpib_board *board, const gpib_board_config_t *config);
|
||||
static int hp82335_attach(struct gpib_board *board, const struct gpib_board_config *config);
|
||||
static void hp82335_detach(struct gpib_board *board);
|
||||
static irqreturn_t hp82335_interrupt(int irq, void *arg);
|
||||
|
||||
// wrappers for interface functions
|
||||
static int hp82335_read(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int hp82335_read(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int *end, size_t *bytes_read)
|
||||
{
|
||||
struct hp82335_priv *priv = board->private_data;
|
||||
|
|
@ -37,7 +38,7 @@ static int hp82335_read(struct gpib_board *board, uint8_t *buffer, size_t length
|
|||
return tms9914_read(board, &priv->tms9914_priv, buffer, length, end, bytes_read);
|
||||
}
|
||||
|
||||
static int hp82335_write(struct gpib_board *board, uint8_t *buffer, size_t length, int send_eoi,
|
||||
static int hp82335_write(struct gpib_board *board, u8 *buffer, size_t length, int send_eoi,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
struct hp82335_priv *priv = board->private_data;
|
||||
|
|
@ -45,7 +46,7 @@ static int hp82335_write(struct gpib_board *board, uint8_t *buffer, size_t lengt
|
|||
return tms9914_write(board, &priv->tms9914_priv, buffer, length, send_eoi, bytes_written);
|
||||
}
|
||||
|
||||
static int hp82335_command(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int hp82335_command(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
struct hp82335_priv *priv = board->private_data;
|
||||
|
|
@ -67,11 +68,11 @@ static int hp82335_go_to_standby(struct gpib_board *board)
|
|||
return tms9914_go_to_standby(board, &priv->tms9914_priv);
|
||||
}
|
||||
|
||||
static void hp82335_request_system_control(struct gpib_board *board, int request_control)
|
||||
static int hp82335_request_system_control(struct gpib_board *board, int request_control)
|
||||
{
|
||||
struct hp82335_priv *priv = board->private_data;
|
||||
|
||||
tms9914_request_system_control(board, &priv->tms9914_priv, request_control);
|
||||
return tms9914_request_system_control(board, &priv->tms9914_priv, request_control);
|
||||
}
|
||||
|
||||
static void hp82335_interface_clear(struct gpib_board *board, int assert)
|
||||
|
|
@ -88,7 +89,7 @@ static void hp82335_remote_enable(struct gpib_board *board, int enable)
|
|||
tms9914_remote_enable(board, &priv->tms9914_priv, enable);
|
||||
}
|
||||
|
||||
static int hp82335_enable_eos(struct gpib_board *board, uint8_t eos_byte, int compare_8_bits)
|
||||
static int hp82335_enable_eos(struct gpib_board *board, u8 eos_byte, int compare_8_bits)
|
||||
{
|
||||
struct hp82335_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -123,14 +124,14 @@ static int hp82335_secondary_address(struct gpib_board *board, unsigned int addr
|
|||
return tms9914_secondary_address(board, &priv->tms9914_priv, address, enable);
|
||||
}
|
||||
|
||||
static int hp82335_parallel_poll(struct gpib_board *board, uint8_t *result)
|
||||
static int hp82335_parallel_poll(struct gpib_board *board, u8 *result)
|
||||
{
|
||||
struct hp82335_priv *priv = board->private_data;
|
||||
|
||||
return tms9914_parallel_poll(board, &priv->tms9914_priv, result);
|
||||
}
|
||||
|
||||
static void hp82335_parallel_poll_configure(struct gpib_board *board, uint8_t config)
|
||||
static void hp82335_parallel_poll_configure(struct gpib_board *board, u8 config)
|
||||
{
|
||||
struct hp82335_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -144,14 +145,14 @@ static void hp82335_parallel_poll_response(struct gpib_board *board, int ist)
|
|||
tms9914_parallel_poll_response(board, &priv->tms9914_priv, ist);
|
||||
}
|
||||
|
||||
static void hp82335_serial_poll_response(struct gpib_board *board, uint8_t status)
|
||||
static void hp82335_serial_poll_response(struct gpib_board *board, u8 status)
|
||||
{
|
||||
struct hp82335_priv *priv = board->private_data;
|
||||
|
||||
tms9914_serial_poll_response(board, &priv->tms9914_priv, status);
|
||||
}
|
||||
|
||||
static uint8_t hp82335_serial_poll_status(struct gpib_board *board)
|
||||
static u8 hp82335_serial_poll_status(struct gpib_board *board)
|
||||
{
|
||||
struct hp82335_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -179,7 +180,7 @@ static void hp82335_return_to_local(struct gpib_board *board)
|
|||
tms9914_return_to_local(board, &priv->tms9914_priv);
|
||||
}
|
||||
|
||||
static gpib_interface_t hp82335_interface = {
|
||||
static struct gpib_interface hp82335_interface = {
|
||||
.name = "hp82335",
|
||||
.attach = hp82335_attach,
|
||||
.detach = hp82335_detach,
|
||||
|
|
@ -226,12 +227,12 @@ static inline unsigned int tms9914_to_hp82335_offset(unsigned int register_num)
|
|||
return 0x1ff8 + register_num;
|
||||
}
|
||||
|
||||
static uint8_t hp82335_read_byte(struct tms9914_priv *priv, unsigned int register_num)
|
||||
static u8 hp82335_read_byte(struct tms9914_priv *priv, unsigned int register_num)
|
||||
{
|
||||
return tms9914_iomem_read_byte(priv, tms9914_to_hp82335_offset(register_num));
|
||||
}
|
||||
|
||||
static void hp82335_write_byte(struct tms9914_priv *priv, uint8_t data, unsigned int register_num)
|
||||
static void hp82335_write_byte(struct tms9914_priv *priv, u8 data, unsigned int register_num)
|
||||
{
|
||||
tms9914_iomem_write_byte(priv, data, tms9914_to_hp82335_offset(register_num));
|
||||
}
|
||||
|
|
@ -243,7 +244,7 @@ static void hp82335_clear_interrupt(struct hp82335_priv *hp_priv)
|
|||
writeb(0, tms_priv->mmiobase + HPREG_INTR_CLEAR);
|
||||
}
|
||||
|
||||
static int hp82335_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int hp82335_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
struct hp82335_priv *hp_priv;
|
||||
struct tms9914_priv *tms_priv;
|
||||
|
|
|
|||
|
|
@ -25,11 +25,11 @@ MODULE_DESCRIPTION("GPIB driver for hp 82341a/b/c/d boards");
|
|||
static unsigned short read_and_clear_event_status(struct gpib_board *board);
|
||||
static void set_transfer_counter(struct hp_82341_priv *hp_priv, int count);
|
||||
static int read_transfer_counter(struct hp_82341_priv *hp_priv);
|
||||
static int hp_82341_write(struct gpib_board *board, uint8_t *buffer, size_t length, int send_eoi,
|
||||
static int hp_82341_write(struct gpib_board *board, u8 *buffer, size_t length, int send_eoi,
|
||||
size_t *bytes_written);
|
||||
static irqreturn_t hp_82341_interrupt(int irq, void *arg);
|
||||
|
||||
static int hp_82341_accel_read(struct gpib_board *board, uint8_t *buffer, size_t length, int *end,
|
||||
static int hp_82341_accel_read(struct gpib_board *board, u8 *buffer, size_t length, int *end,
|
||||
size_t *bytes_read)
|
||||
{
|
||||
struct hp_82341_priv *hp_priv = board->private_data;
|
||||
|
|
@ -51,11 +51,12 @@ static int hp_82341_accel_read(struct gpib_board *board, uint8_t *buffer, size_t
|
|||
return 0;
|
||||
//disable fifo for the moment
|
||||
outb(DIRECTION_GPIB_TO_HOST_BIT, hp_priv->iobase[3] + BUFFER_CONTROL_REG);
|
||||
// Handle corner case of board not in holdoff and one byte has slipped in already.
|
||||
// Also, board sometimes has problems (spurious 1 byte reads) when read fifo is
|
||||
// started up with board in
|
||||
// TACS under certain data holdoff conditions. Doing a 1 byte tms9914-style
|
||||
// read avoids these problems.
|
||||
/*
|
||||
* Handle corner case of board not in holdoff and one byte has slipped in already.
|
||||
* Also, board sometimes has problems (spurious 1 byte reads) when read fifo is
|
||||
* started up with board in TACS under certain data holdoff conditions.
|
||||
* Doing a 1 byte tms9914-style read avoids these problems.
|
||||
*/
|
||||
if (/*tms_priv->holdoff_active == 0 && */length > 1) {
|
||||
size_t num_bytes;
|
||||
|
||||
|
|
@ -172,7 +173,7 @@ static int restart_write_fifo(struct gpib_board *board, struct hp_82341_priv *hp
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int hp_82341_accel_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int hp_82341_accel_write(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int send_eoi, size_t *bytes_written)
|
||||
{
|
||||
struct hp_82341_priv *hp_priv = board->private_data;
|
||||
|
|
@ -250,12 +251,12 @@ static int hp_82341_accel_write(struct gpib_board *board, uint8_t *buffer, size_
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int hp_82341_attach(struct gpib_board *board, const gpib_board_config_t *config);
|
||||
static int hp_82341_attach(struct gpib_board *board, const struct gpib_board_config *config);
|
||||
|
||||
static void hp_82341_detach(struct gpib_board *board);
|
||||
|
||||
// wrappers for interface functions
|
||||
static int hp_82341_read(struct gpib_board *board, uint8_t *buffer, size_t length, int *end,
|
||||
static int hp_82341_read(struct gpib_board *board, u8 *buffer, size_t length, int *end,
|
||||
size_t *bytes_read)
|
||||
{
|
||||
struct hp_82341_priv *priv = board->private_data;
|
||||
|
|
@ -263,7 +264,7 @@ static int hp_82341_read(struct gpib_board *board, uint8_t *buffer, size_t lengt
|
|||
return tms9914_read(board, &priv->tms9914_priv, buffer, length, end, bytes_read);
|
||||
}
|
||||
|
||||
static int hp_82341_write(struct gpib_board *board, uint8_t *buffer, size_t length, int send_eoi,
|
||||
static int hp_82341_write(struct gpib_board *board, u8 *buffer, size_t length, int send_eoi,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
struct hp_82341_priv *priv = board->private_data;
|
||||
|
|
@ -271,7 +272,7 @@ static int hp_82341_write(struct gpib_board *board, uint8_t *buffer, size_t leng
|
|||
return tms9914_write(board, &priv->tms9914_priv, buffer, length, send_eoi, bytes_written);
|
||||
}
|
||||
|
||||
static int hp_82341_command(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int hp_82341_command(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
struct hp_82341_priv *priv = board->private_data;
|
||||
|
|
@ -293,7 +294,7 @@ static int hp_82341_go_to_standby(struct gpib_board *board)
|
|||
return tms9914_go_to_standby(board, &priv->tms9914_priv);
|
||||
}
|
||||
|
||||
static void hp_82341_request_system_control(struct gpib_board *board, int request_control)
|
||||
static int hp_82341_request_system_control(struct gpib_board *board, int request_control)
|
||||
{
|
||||
struct hp_82341_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -302,7 +303,7 @@ static void hp_82341_request_system_control(struct gpib_board *board, int reques
|
|||
else
|
||||
priv->mode_control_bits &= ~SYSTEM_CONTROLLER_BIT;
|
||||
outb(priv->mode_control_bits, priv->iobase[0] + MODE_CONTROL_STATUS_REG);
|
||||
tms9914_request_system_control(board, &priv->tms9914_priv, request_control);
|
||||
return tms9914_request_system_control(board, &priv->tms9914_priv, request_control);
|
||||
}
|
||||
|
||||
static void hp_82341_interface_clear(struct gpib_board *board, int assert)
|
||||
|
|
@ -319,7 +320,7 @@ static void hp_82341_remote_enable(struct gpib_board *board, int enable)
|
|||
tms9914_remote_enable(board, &priv->tms9914_priv, enable);
|
||||
}
|
||||
|
||||
static int hp_82341_enable_eos(struct gpib_board *board, uint8_t eos_byte, int compare_8_bits)
|
||||
static int hp_82341_enable_eos(struct gpib_board *board, u8 eos_byte, int compare_8_bits)
|
||||
{
|
||||
struct hp_82341_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -354,14 +355,14 @@ static int hp_82341_secondary_address(struct gpib_board *board, unsigned int add
|
|||
return tms9914_secondary_address(board, &priv->tms9914_priv, address, enable);
|
||||
}
|
||||
|
||||
static int hp_82341_parallel_poll(struct gpib_board *board, uint8_t *result)
|
||||
static int hp_82341_parallel_poll(struct gpib_board *board, u8 *result)
|
||||
{
|
||||
struct hp_82341_priv *priv = board->private_data;
|
||||
|
||||
return tms9914_parallel_poll(board, &priv->tms9914_priv, result);
|
||||
}
|
||||
|
||||
static void hp_82341_parallel_poll_configure(struct gpib_board *board, uint8_t config)
|
||||
static void hp_82341_parallel_poll_configure(struct gpib_board *board, u8 config)
|
||||
{
|
||||
struct hp_82341_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -375,14 +376,14 @@ static void hp_82341_parallel_poll_response(struct gpib_board *board, int ist)
|
|||
tms9914_parallel_poll_response(board, &priv->tms9914_priv, ist);
|
||||
}
|
||||
|
||||
static void hp_82341_serial_poll_response(struct gpib_board *board, uint8_t status)
|
||||
static void hp_82341_serial_poll_response(struct gpib_board *board, u8 status)
|
||||
{
|
||||
struct hp_82341_priv *priv = board->private_data;
|
||||
|
||||
tms9914_serial_poll_response(board, &priv->tms9914_priv, status);
|
||||
}
|
||||
|
||||
static uint8_t hp_82341_serial_poll_status(struct gpib_board *board)
|
||||
static u8 hp_82341_serial_poll_status(struct gpib_board *board)
|
||||
{
|
||||
struct hp_82341_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -410,7 +411,7 @@ static void hp_82341_return_to_local(struct gpib_board *board)
|
|||
tms9914_return_to_local(board, &priv->tms9914_priv);
|
||||
}
|
||||
|
||||
static gpib_interface_t hp_82341_unaccel_interface = {
|
||||
static struct gpib_interface hp_82341_unaccel_interface = {
|
||||
.name = "hp_82341_unaccel",
|
||||
.attach = hp_82341_attach,
|
||||
.detach = hp_82341_detach,
|
||||
|
|
@ -438,7 +439,7 @@ static gpib_interface_t hp_82341_unaccel_interface = {
|
|||
.return_to_local = hp_82341_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t hp_82341_interface = {
|
||||
static struct gpib_interface hp_82341_interface = {
|
||||
.name = "hp_82341",
|
||||
.attach = hp_82341_attach,
|
||||
.detach = hp_82341_detach,
|
||||
|
|
@ -479,12 +480,12 @@ static void hp_82341_free_private(struct gpib_board *board)
|
|||
board->private_data = NULL;
|
||||
}
|
||||
|
||||
static uint8_t hp_82341_read_byte(struct tms9914_priv *priv, unsigned int register_num)
|
||||
static u8 hp_82341_read_byte(struct tms9914_priv *priv, unsigned int register_num)
|
||||
{
|
||||
return inb(priv->iobase + register_num);
|
||||
}
|
||||
|
||||
static void hp_82341_write_byte(struct tms9914_priv *priv, uint8_t data, unsigned int register_num)
|
||||
static void hp_82341_write_byte(struct tms9914_priv *priv, u8 data, unsigned int register_num)
|
||||
{
|
||||
outb(data, priv->iobase + register_num);
|
||||
}
|
||||
|
|
@ -619,7 +620,8 @@ static int hp_82341_load_firmware_array(struct hp_82341_priv *hp_priv,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int hp_82341_load_firmware(struct hp_82341_priv *hp_priv, const gpib_board_config_t *config)
|
||||
static int hp_82341_load_firmware(struct hp_82341_priv *hp_priv,
|
||||
const struct gpib_board_config *config)
|
||||
{
|
||||
if (config->init_data_length == 0) {
|
||||
if (xilinx_done(hp_priv))
|
||||
|
|
@ -686,7 +688,7 @@ static int clear_xilinx(struct hp_82341_priv *hp_priv)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int hp_82341_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int hp_82341_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
struct hp_82341_priv *hp_priv;
|
||||
struct tms9914_priv *tms_priv;
|
||||
|
|
|
|||
|
|
@ -11,23 +11,23 @@
|
|||
|
||||
#include "gpib_types.h"
|
||||
#include "gpib_proto.h"
|
||||
#include "gpib_user.h"
|
||||
#include "gpib.h"
|
||||
#include "gpib_ioctl.h"
|
||||
|
||||
#include <linux/fs.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
int gpib_register_driver(gpib_interface_t *interface, struct module *mod);
|
||||
void gpib_unregister_driver(gpib_interface_t *interface);
|
||||
struct pci_dev *gpib_pci_get_device(const gpib_board_config_t *config, unsigned int vendor_id,
|
||||
int gpib_register_driver(struct gpib_interface *interface, struct module *mod);
|
||||
void gpib_unregister_driver(struct gpib_interface *interface);
|
||||
struct pci_dev *gpib_pci_get_device(const struct gpib_board_config *config, unsigned int vendor_id,
|
||||
unsigned int device_id, struct pci_dev *from);
|
||||
struct pci_dev *gpib_pci_get_subsys(const gpib_board_config_t *config, unsigned int vendor_id,
|
||||
struct pci_dev *gpib_pci_get_subsys(const struct gpib_board_config *config, unsigned int vendor_id,
|
||||
unsigned int device_id, unsigned int ss_vendor,
|
||||
unsigned int ss_device, struct pci_dev *from);
|
||||
unsigned int num_gpib_events(const gpib_event_queue_t *queue);
|
||||
unsigned int num_gpib_events(const struct gpib_event_queue *queue);
|
||||
int push_gpib_event(struct gpib_board *board, short event_type);
|
||||
int pop_gpib_event(struct gpib_board *board, gpib_event_queue_t *queue, short *event_type);
|
||||
int pop_gpib_event(struct gpib_board *board, struct gpib_event_queue *queue, short *event_type);
|
||||
int gpib_request_pseudo_irq(struct gpib_board *board, irqreturn_t (*handler)(int, void *));
|
||||
void gpib_free_pseudo_irq(struct gpib_board *board);
|
||||
int gpib_match_device_path(struct device *dev, const char *device_path_in);
|
||||
|
|
|
|||
|
|
@ -8,12 +8,8 @@
|
|||
int ibopen(struct inode *inode, struct file *filep);
|
||||
int ibclose(struct inode *inode, struct file *file);
|
||||
long ibioctl(struct file *filep, unsigned int cmd, unsigned long arg);
|
||||
int osInit(void);
|
||||
void osReset(void);
|
||||
void os_start_timer(struct gpib_board *board, unsigned int usec_timeout);
|
||||
void os_remove_timer(struct gpib_board *board);
|
||||
void osSendEOI(void);
|
||||
void osSendEOI(void);
|
||||
void init_gpib_board(struct gpib_board *board);
|
||||
static inline unsigned long usec_to_jiffies(unsigned int usec)
|
||||
{
|
||||
|
|
@ -23,34 +19,31 @@ static inline unsigned long usec_to_jiffies(unsigned int usec)
|
|||
};
|
||||
|
||||
int serial_poll_all(struct gpib_board *board, unsigned int usec_timeout);
|
||||
void init_gpib_descriptor(gpib_descriptor_t *desc);
|
||||
void init_gpib_descriptor(struct gpib_descriptor *desc);
|
||||
int dvrsp(struct gpib_board *board, unsigned int pad, int sad,
|
||||
unsigned int usec_timeout, uint8_t *result);
|
||||
int ibAPWait(struct gpib_board *board, int pad);
|
||||
int ibAPrsp(struct gpib_board *board, int padsad, char *spb);
|
||||
void ibAPE(struct gpib_board *board, int pad, int v);
|
||||
unsigned int usec_timeout, u8 *result);
|
||||
int ibcac(struct gpib_board *board, int sync, int fallback_to_async);
|
||||
int ibcmd(struct gpib_board *board, uint8_t *buf, size_t length, size_t *bytes_written);
|
||||
int ibcmd(struct gpib_board *board, u8 *buf, size_t length, size_t *bytes_written);
|
||||
int ibgts(struct gpib_board *board);
|
||||
int ibonline(struct gpib_board *board);
|
||||
int iboffline(struct gpib_board *board);
|
||||
int iblines(const struct gpib_board *board, short *lines);
|
||||
int ibrd(struct gpib_board *board, uint8_t *buf, size_t length, int *end_flag, size_t *bytes_read);
|
||||
int ibrpp(struct gpib_board *board, uint8_t *buf);
|
||||
int ibrsv2(struct gpib_board *board, uint8_t status_byte, int new_reason_for_service);
|
||||
void ibrsc(struct gpib_board *board, int request_control);
|
||||
int ibrd(struct gpib_board *board, u8 *buf, size_t length, int *end_flag, size_t *bytes_read);
|
||||
int ibrpp(struct gpib_board *board, u8 *buf);
|
||||
int ibrsv2(struct gpib_board *board, u8 status_byte, int new_reason_for_service);
|
||||
int ibrsc(struct gpib_board *board, int request_control);
|
||||
int ibsic(struct gpib_board *board, unsigned int usec_duration);
|
||||
int ibsre(struct gpib_board *board, int enable);
|
||||
int ibpad(struct gpib_board *board, unsigned int addr);
|
||||
int ibsad(struct gpib_board *board, int addr);
|
||||
int ibeos(struct gpib_board *board, int eos, int eosflags);
|
||||
int ibwait(struct gpib_board *board, int wait_mask, int clear_mask, int set_mask,
|
||||
int *status, unsigned long usec_timeout, gpib_descriptor_t *desc);
|
||||
int ibwrt(struct gpib_board *board, uint8_t *buf, size_t cnt, int send_eoi, size_t *bytes_written);
|
||||
int *status, unsigned long usec_timeout, struct gpib_descriptor *desc);
|
||||
int ibwrt(struct gpib_board *board, u8 *buf, size_t cnt, int send_eoi, size_t *bytes_written);
|
||||
int ibstatus(struct gpib_board *board);
|
||||
int general_ibstatus(struct gpib_board *board, const gpib_status_queue_t *device,
|
||||
int clear_mask, int set_mask, gpib_descriptor_t *desc);
|
||||
int general_ibstatus(struct gpib_board *board, const struct gpib_status_queue *device,
|
||||
int clear_mask, int set_mask, struct gpib_descriptor *desc);
|
||||
int io_timed_out(struct gpib_board *board);
|
||||
int ibppc(struct gpib_board *board, uint8_t configuration);
|
||||
int ibppc(struct gpib_board *board, u8 configuration);
|
||||
|
||||
#endif /* GPIB_PROTO_INCLUDED */
|
||||
|
|
|
|||
|
|
@ -8,12 +8,7 @@
|
|||
#define _GPIB_TYPES_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
/* gpib_interface_t defines the interface
|
||||
* between the board-specific details dealt with in the drivers
|
||||
* and generic interface provided by gpib-common.
|
||||
* This really should be in a different header file.
|
||||
*/
|
||||
#include "gpib_user.h"
|
||||
#include "gpib.h"
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/mutex.h>
|
||||
|
|
@ -22,11 +17,10 @@
|
|||
#include <linux/timer.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
typedef struct gpib_interface_struct gpib_interface_t;
|
||||
struct gpib_board;
|
||||
|
||||
/* config parameters that are only used by driver attach functions */
|
||||
typedef struct {
|
||||
struct gpib_board_config {
|
||||
/* firmware blob */
|
||||
void *init_data;
|
||||
int init_data_length;
|
||||
|
|
@ -37,11 +31,13 @@ typedef struct {
|
|||
unsigned int ibirq;
|
||||
/* dma channel to use for non-pnp cards (set by core, driver should make local copy) */
|
||||
unsigned int ibdma;
|
||||
/* pci bus of card, useful for distinguishing multiple identical pci cards
|
||||
/*
|
||||
* pci bus of card, useful for distinguishing multiple identical pci cards
|
||||
* (negative means don't care)
|
||||
*/
|
||||
int pci_bus;
|
||||
/* pci slot of card, useful for distinguishing multiple identical pci cards
|
||||
/*
|
||||
* pci slot of card, useful for distinguishing multiple identical pci cards
|
||||
* (negative means don't care)
|
||||
*/
|
||||
int pci_slot;
|
||||
|
|
@ -49,16 +45,23 @@ typedef struct {
|
|||
char *device_path;
|
||||
/* serial number of hardware to attach */
|
||||
char *serial_number;
|
||||
} gpib_board_config_t;
|
||||
};
|
||||
|
||||
struct gpib_interface_struct {
|
||||
/*
|
||||
* struct gpib_interface defines the interface
|
||||
* between the board-specific details dealt with in the drivers
|
||||
* and generic interface provided by gpib-common.
|
||||
* This really should be in a different header file.
|
||||
*/
|
||||
struct gpib_interface {
|
||||
/* name of board */
|
||||
char *name;
|
||||
/* attach() initializes board and allocates resources */
|
||||
int (*attach)(struct gpib_board *board, const gpib_board_config_t *config);
|
||||
int (*attach)(struct gpib_board *board, const struct gpib_board_config *config);
|
||||
/* detach() shuts down board and frees resources */
|
||||
void (*detach)(struct gpib_board *board);
|
||||
/* read() should read at most 'length' bytes from the bus into
|
||||
/*
|
||||
* read() should read at most 'length' bytes from the bus into
|
||||
* 'buffer'. It should return when it fills the buffer or
|
||||
* encounters an END (EOI and or EOS if appropriate). It should set 'end'
|
||||
* to be nonzero if the read was terminated by an END, otherwise 'end'
|
||||
|
|
@ -68,76 +71,88 @@ struct gpib_interface_struct {
|
|||
* return indicates error.
|
||||
* nbytes returns number of bytes read
|
||||
*/
|
||||
int (*read)(struct gpib_board *board, uint8_t *buffer, size_t length, int *end,
|
||||
int (*read)(struct gpib_board *board, u8 *buffer, size_t length, int *end,
|
||||
size_t *bytes_read);
|
||||
/* write() should write 'length' bytes from buffer to the bus.
|
||||
/*
|
||||
* write() should write 'length' bytes from buffer to the bus.
|
||||
* If the boolean value send_eoi is nonzero, then EOI should
|
||||
* be sent along with the last byte. Returns number of bytes
|
||||
* written or negative value on error.
|
||||
*/
|
||||
int (*write)(struct gpib_board *board, uint8_t *buffer, size_t length, int send_eoi,
|
||||
int (*write)(struct gpib_board *board, u8 *buffer, size_t length, int send_eoi,
|
||||
size_t *bytes_written);
|
||||
/* command() writes the command bytes in 'buffer' to the bus
|
||||
/*
|
||||
* command() writes the command bytes in 'buffer' to the bus
|
||||
* Returns zero on success or negative value on error.
|
||||
*/
|
||||
int (*command)(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
int (*command)(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
size_t *bytes_written);
|
||||
/* Take control (assert ATN). If 'asyncronous' is nonzero, take
|
||||
/*
|
||||
* Take control (assert ATN). If 'asyncronous' is nonzero, take
|
||||
* control asyncronously (assert ATN immediately without waiting
|
||||
* for other processes to complete first). Should not return
|
||||
* until board becomes controller in charge. Returns zero no success,
|
||||
* nonzero on error.
|
||||
*/
|
||||
int (*take_control)(struct gpib_board *board, int asyncronous);
|
||||
/* De-assert ATN. Returns zero on success, nonzer on error.
|
||||
/*
|
||||
* De-assert ATN. Returns zero on success, nonzer on error.
|
||||
*/
|
||||
int (*go_to_standby)(struct gpib_board *board);
|
||||
/* request/release control of the IFC and REN lines (system controller) */
|
||||
void (*request_system_control)(struct gpib_board *board, int request_control);
|
||||
/* Asserts or de-asserts 'interface clear' (IFC) depending on
|
||||
int (*request_system_control)(struct gpib_board *board, int request_control);
|
||||
/*
|
||||
* Asserts or de-asserts 'interface clear' (IFC) depending on
|
||||
* boolean value of 'assert'
|
||||
*/
|
||||
void (*interface_clear)(struct gpib_board *board, int assert);
|
||||
/* Sends remote enable command if 'enable' is nonzero, disables remote mode
|
||||
/*
|
||||
* Sends remote enable command if 'enable' is nonzero, disables remote mode
|
||||
* if 'enable' is zero
|
||||
*/
|
||||
void (*remote_enable)(struct gpib_board *board, int enable);
|
||||
/* enable END for reads, when byte 'eos' is received. If
|
||||
/*
|
||||
* enable END for reads, when byte 'eos' is received. If
|
||||
* 'compare_8_bits' is nonzero, then all 8 bits are compared
|
||||
* with the eos bytes. Otherwise only the 7 least significant
|
||||
* bits are compared.
|
||||
*/
|
||||
int (*enable_eos)(struct gpib_board *board, uint8_t eos, int compare_8_bits);
|
||||
int (*enable_eos)(struct gpib_board *board, u8 eos, int compare_8_bits);
|
||||
/* disable END on eos byte (END on EOI only)*/
|
||||
void (*disable_eos)(struct gpib_board *board);
|
||||
/* configure parallel poll */
|
||||
void (*parallel_poll_configure)(struct gpib_board *board, uint8_t configuration);
|
||||
void (*parallel_poll_configure)(struct gpib_board *board, u8 configuration);
|
||||
/* conduct parallel poll */
|
||||
int (*parallel_poll)(struct gpib_board *board, uint8_t *result);
|
||||
int (*parallel_poll)(struct gpib_board *board, u8 *result);
|
||||
/* set/clear ist (individual status bit) */
|
||||
void (*parallel_poll_response)(struct gpib_board *board, int ist);
|
||||
/* select local parallel poll configuration mode PP2 versus remote PP1 */
|
||||
void (*local_parallel_poll_mode)(struct gpib_board *board, int local);
|
||||
/* Returns current status of the bus lines. Should be set to
|
||||
/*
|
||||
* Returns current status of the bus lines. Should be set to
|
||||
* NULL if your board does not have the ability to query the
|
||||
* state of the bus lines.
|
||||
*/
|
||||
int (*line_status)(const struct gpib_board *board);
|
||||
/* updates and returns the board's current status.
|
||||
/*
|
||||
* updates and returns the board's current status.
|
||||
* The meaning of the bits are specified in gpib_user.h
|
||||
* in the IBSTA section. The driver does not need to
|
||||
* worry about setting the CMPL, END, TIMO, or ERR bits.
|
||||
*/
|
||||
unsigned int (*update_status)(struct gpib_board *board, unsigned int clear_mask);
|
||||
/* Sets primary address 0-30 for gpib interface card.
|
||||
/*
|
||||
* Sets primary address 0-30 for gpib interface card.
|
||||
*/
|
||||
int (*primary_address)(struct gpib_board *board, unsigned int address);
|
||||
/* Sets and enables, or disables secondary address 0-30
|
||||
/*
|
||||
* Sets and enables, or disables secondary address 0-30
|
||||
* for gpib interface card.
|
||||
*/
|
||||
int (*secondary_address)(struct gpib_board *board, unsigned int address,
|
||||
int enable);
|
||||
/* Sets the byte the board should send in response to a serial poll.
|
||||
/*
|
||||
* Sets the byte the board should send in response to a serial poll.
|
||||
* This function should also start or stop requests for service via
|
||||
* IEEE 488.2 reqt/reqf, based on MSS (bit 6 of the status_byte).
|
||||
* If the more flexible serial_poll_response2 is implemented by the
|
||||
|
|
@ -149,8 +164,9 @@ struct gpib_interface_struct {
|
|||
* by IEEE 488.2 section 11.3.3.4.3 "Allowed Coupled Control of
|
||||
* STB, reqt, and reqf".
|
||||
*/
|
||||
void (*serial_poll_response)(struct gpib_board *board, uint8_t status_byte);
|
||||
/* Sets the byte the board should send in response to a serial poll.
|
||||
void (*serial_poll_response)(struct gpib_board *board, u8 status_byte);
|
||||
/*
|
||||
* Sets the byte the board should send in response to a serial poll.
|
||||
* This function should also request service via IEEE 488.2 reqt/reqf
|
||||
* based on MSS (bit 6 of the status_byte) and new_reason_for_service.
|
||||
* reqt should be set true if new_reason_for_service is true,
|
||||
|
|
@ -164,11 +180,12 @@ struct gpib_interface_struct {
|
|||
* If this method is left NULL by the driver, then the user library
|
||||
* function ibrsv2 will not work.
|
||||
*/
|
||||
void (*serial_poll_response2)(struct gpib_board *board, uint8_t status_byte,
|
||||
void (*serial_poll_response2)(struct gpib_board *board, u8 status_byte,
|
||||
int new_reason_for_service);
|
||||
/* returns the byte the board will send in response to a serial poll.
|
||||
/*
|
||||
* returns the byte the board will send in response to a serial poll.
|
||||
*/
|
||||
uint8_t (*serial_poll_status)(struct gpib_board *board);
|
||||
u8 (*serial_poll_status)(struct gpib_board *board);
|
||||
/* adjust T1 delay */
|
||||
int (*t1_delay)(struct gpib_board *board, unsigned int nano_sec);
|
||||
/* go to local mode */
|
||||
|
|
@ -179,14 +196,14 @@ struct gpib_interface_struct {
|
|||
unsigned skip_check_for_command_acceptors : 1;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct gpib_event_queue {
|
||||
struct list_head event_head;
|
||||
spinlock_t lock; // for access to event list
|
||||
unsigned int num_events;
|
||||
unsigned dropped_event : 1;
|
||||
} gpib_event_queue_t;
|
||||
};
|
||||
|
||||
static inline void init_event_queue(gpib_event_queue_t *queue)
|
||||
static inline void init_event_queue(struct gpib_event_queue *queue)
|
||||
{
|
||||
INIT_LIST_HEAD(&queue->event_head);
|
||||
queue->num_events = 0;
|
||||
|
|
@ -210,20 +227,22 @@ static inline void init_gpib_pseudo_irq(struct gpib_pseudo_irq *pseudo_irq)
|
|||
}
|
||||
|
||||
/* list so we can make a linked list of drivers */
|
||||
typedef struct gpib_interface_list_struct {
|
||||
struct gpib_interface_list {
|
||||
struct list_head list;
|
||||
gpib_interface_t *interface;
|
||||
struct gpib_interface *interface;
|
||||
struct module *module;
|
||||
} gpib_interface_list_t;
|
||||
};
|
||||
|
||||
/* One struct gpib_board is allocated for each physical board in the computer.
|
||||
/*
|
||||
* One struct gpib_board is allocated for each physical board in the computer.
|
||||
* It provides storage for variables local to each board, and interface
|
||||
* functions for performing operations on the board
|
||||
*/
|
||||
struct gpib_board {
|
||||
/* functions used by this board */
|
||||
gpib_interface_t *interface;
|
||||
/* Pointer to module whose use count we should increment when
|
||||
struct gpib_interface *interface;
|
||||
/*
|
||||
* Pointer to module whose use count we should increment when
|
||||
* interface is in use
|
||||
*/
|
||||
struct module *provider_module;
|
||||
|
|
@ -231,20 +250,24 @@ struct gpib_board {
|
|||
u8 *buffer;
|
||||
/* length of buffer */
|
||||
unsigned int buffer_length;
|
||||
/* Used to hold the board's current status (see update_status() above)
|
||||
/*
|
||||
* Used to hold the board's current status (see update_status() above)
|
||||
*/
|
||||
unsigned long status;
|
||||
/* Driver should only sleep on this wait queue. It is special in that the
|
||||
/*
|
||||
* Driver should only sleep on this wait queue. It is special in that the
|
||||
* core will wake this queue and set the TIMO bit in 'status' when the
|
||||
* watchdog timer times out.
|
||||
*/
|
||||
wait_queue_head_t wait;
|
||||
/* Lock that only allows one process to access this board at a time.
|
||||
/*
|
||||
* Lock that only allows one process to access this board at a time.
|
||||
* Has to be first in any locking order, since it can be locked over
|
||||
* multiple ioctls.
|
||||
*/
|
||||
struct mutex user_mutex;
|
||||
/* Mutex which compensates for removal of "big kernel lock" from kernel.
|
||||
/*
|
||||
* Mutex which compensates for removal of "big kernel lock" from kernel.
|
||||
* Should not be held for extended waits.
|
||||
*/
|
||||
struct mutex big_gpib_mutex;
|
||||
|
|
@ -259,7 +282,8 @@ struct gpib_board {
|
|||
struct device *dev;
|
||||
/* gpib_common device gpibN */
|
||||
struct device *gpib_dev;
|
||||
/* 'private_data' can be used as seen fit by the driver to
|
||||
/*
|
||||
* 'private_data' can be used as seen fit by the driver to
|
||||
* store additional variables for this board
|
||||
*/
|
||||
void *private_data;
|
||||
|
|
@ -284,34 +308,36 @@ struct gpib_board {
|
|||
/* autospoll kernel thread */
|
||||
struct task_struct *autospoll_task;
|
||||
/* queue for recording received trigger/clear/ifc events */
|
||||
gpib_event_queue_t event_queue;
|
||||
struct gpib_event_queue event_queue;
|
||||
/* minor number for this board's device file */
|
||||
int minor;
|
||||
/* struct to deal with polling mode*/
|
||||
struct gpib_pseudo_irq pseudo_irq;
|
||||
/* error dong autopoll */
|
||||
atomic_t stuck_srq;
|
||||
gpib_board_config_t config;
|
||||
struct gpib_board_config config;
|
||||
/* Flag that indicates whether board is system controller of the bus */
|
||||
unsigned master : 1;
|
||||
/* individual status bit */
|
||||
unsigned ist : 1;
|
||||
/* one means local parallel poll mode ieee 488.1 PP2 (or no parallel poll PP0),
|
||||
/*
|
||||
* one means local parallel poll mode ieee 488.1 PP2 (or no parallel poll PP0),
|
||||
* zero means remote parallel poll configuration mode ieee 488.1 PP1
|
||||
*/
|
||||
unsigned local_ppoll_mode : 1;
|
||||
};
|
||||
|
||||
/* element of event queue */
|
||||
typedef struct {
|
||||
struct gpib_event {
|
||||
struct list_head list;
|
||||
short event_type;
|
||||
} gpib_event_t;
|
||||
};
|
||||
|
||||
/* Each board has a list of gpib_status_queue_t to keep track of all open devices
|
||||
/*
|
||||
* Each board has a list of gpib_status_queue to keep track of all open devices
|
||||
* on the bus, so we know what address to poll when we get a service request
|
||||
*/
|
||||
typedef struct {
|
||||
struct gpib_status_queue {
|
||||
/* list_head so we can make a linked list of devices */
|
||||
struct list_head list;
|
||||
unsigned int pad; /* primary gpib address */
|
||||
|
|
@ -323,31 +349,31 @@ typedef struct {
|
|||
unsigned int reference_count;
|
||||
/* flags loss of status byte error due to limit on size of queue */
|
||||
unsigned dropped_byte : 1;
|
||||
} gpib_status_queue_t;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct gpib_status_byte {
|
||||
struct list_head list;
|
||||
u8 poll_byte;
|
||||
} status_byte_t;
|
||||
};
|
||||
|
||||
void init_gpib_status_queue(gpib_status_queue_t *device);
|
||||
void init_gpib_status_queue(struct gpib_status_queue *device);
|
||||
|
||||
/* Used to store device-descriptor-specific information */
|
||||
typedef struct {
|
||||
struct gpib_descriptor {
|
||||
unsigned int pad; /* primary gpib address */
|
||||
int sad; /* secondary gpib address (negative means disabled) */
|
||||
atomic_t io_in_progress;
|
||||
unsigned is_board : 1;
|
||||
unsigned autopoll_enabled : 1;
|
||||
} gpib_descriptor_t;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct gpib_file_private {
|
||||
atomic_t holding_mutex;
|
||||
gpib_descriptor_t *descriptors[GPIB_MAX_NUM_DESCRIPTORS];
|
||||
struct gpib_descriptor *descriptors[GPIB_MAX_NUM_DESCRIPTORS];
|
||||
/* locked while descriptors are being allocated/deallocated */
|
||||
struct mutex descriptors_mutex;
|
||||
unsigned got_module : 1;
|
||||
} gpib_file_private_t;
|
||||
};
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
//* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
/***************************************************************************
|
||||
* copyright : (C) 2002 by Frank Mori Hess
|
||||
|
|
@ -78,19 +78,19 @@ enum {
|
|||
};
|
||||
|
||||
// interface functions
|
||||
int nec7210_read(struct gpib_board *board, struct nec7210_priv *priv, uint8_t *buffer,
|
||||
int nec7210_read(struct gpib_board *board, struct nec7210_priv *priv, u8 *buffer,
|
||||
size_t length, int *end, size_t *bytes_read);
|
||||
int nec7210_write(struct gpib_board *board, struct nec7210_priv *priv, uint8_t *buffer,
|
||||
int nec7210_write(struct gpib_board *board, struct nec7210_priv *priv, u8 *buffer,
|
||||
size_t length, int send_eoi, size_t *bytes_written);
|
||||
int nec7210_command(struct gpib_board *board, struct nec7210_priv *priv, uint8_t *buffer,
|
||||
int nec7210_command(struct gpib_board *board, struct nec7210_priv *priv, u8 *buffer,
|
||||
size_t length, size_t *bytes_written);
|
||||
int nec7210_take_control(struct gpib_board *board, struct nec7210_priv *priv, int syncronous);
|
||||
int nec7210_go_to_standby(struct gpib_board *board, struct nec7210_priv *priv);
|
||||
void nec7210_request_system_control(struct gpib_board *board,
|
||||
struct nec7210_priv *priv, int request_control);
|
||||
int nec7210_request_system_control(struct gpib_board *board,
|
||||
struct nec7210_priv *priv, int request_control);
|
||||
void nec7210_interface_clear(struct gpib_board *board, struct nec7210_priv *priv, int assert);
|
||||
void nec7210_remote_enable(struct gpib_board *board, struct nec7210_priv *priv, int enable);
|
||||
int nec7210_enable_eos(struct gpib_board *board, struct nec7210_priv *priv, uint8_t eos_bytes,
|
||||
int nec7210_enable_eos(struct gpib_board *board, struct nec7210_priv *priv, u8 eos_bytes,
|
||||
int compare_8_bits);
|
||||
void nec7210_disable_eos(struct gpib_board *board, struct nec7210_priv *priv);
|
||||
unsigned int nec7210_update_status(struct gpib_board *board, struct nec7210_priv *priv,
|
||||
|
|
@ -100,14 +100,14 @@ int nec7210_primary_address(const struct gpib_board *board,
|
|||
struct nec7210_priv *priv, unsigned int address);
|
||||
int nec7210_secondary_address(const struct gpib_board *board, struct nec7210_priv *priv,
|
||||
unsigned int address, int enable);
|
||||
int nec7210_parallel_poll(struct gpib_board *board, struct nec7210_priv *priv, uint8_t *result);
|
||||
void nec7210_serial_poll_response(struct gpib_board *board, struct nec7210_priv *priv, uint8_t status);
|
||||
int nec7210_parallel_poll(struct gpib_board *board, struct nec7210_priv *priv, u8 *result);
|
||||
void nec7210_serial_poll_response(struct gpib_board *board,
|
||||
struct nec7210_priv *priv, u8 status);
|
||||
void nec7210_parallel_poll_configure(struct gpib_board *board,
|
||||
struct nec7210_priv *priv, unsigned int configuration);
|
||||
void nec7210_parallel_poll_response(struct gpib_board *board,
|
||||
struct nec7210_priv *priv, int ist);
|
||||
uint8_t nec7210_serial_poll_status(struct gpib_board *board,
|
||||
struct nec7210_priv *priv);
|
||||
u8 nec7210_serial_poll_status(struct gpib_board *board, struct nec7210_priv *priv);
|
||||
int nec7210_t1_delay(struct gpib_board *board,
|
||||
struct nec7210_priv *priv, unsigned int nano_sec);
|
||||
void nec7210_return_to_local(const struct gpib_board *board, struct nec7210_priv *priv);
|
||||
|
|
@ -119,18 +119,18 @@ unsigned int nec7210_set_reg_bits(struct nec7210_priv *priv, unsigned int reg,
|
|||
unsigned int mask, unsigned int bits);
|
||||
void nec7210_set_handshake_mode(struct gpib_board *board, struct nec7210_priv *priv, int mode);
|
||||
void nec7210_release_rfd_holdoff(struct gpib_board *board, struct nec7210_priv *priv);
|
||||
uint8_t nec7210_read_data_in(struct gpib_board *board, struct nec7210_priv *priv, int *end);
|
||||
u8 nec7210_read_data_in(struct gpib_board *board, struct nec7210_priv *priv, int *end);
|
||||
|
||||
// wrappers for io functions
|
||||
uint8_t nec7210_ioport_read_byte(struct nec7210_priv *priv, unsigned int register_num);
|
||||
void nec7210_ioport_write_byte(struct nec7210_priv *priv, uint8_t data, unsigned int register_num);
|
||||
uint8_t nec7210_iomem_read_byte(struct nec7210_priv *priv, unsigned int register_num);
|
||||
void nec7210_iomem_write_byte(struct nec7210_priv *priv, uint8_t data, unsigned int register_num);
|
||||
uint8_t nec7210_locking_ioport_read_byte(struct nec7210_priv *priv, unsigned int register_num);
|
||||
void nec7210_locking_ioport_write_byte(struct nec7210_priv *priv, uint8_t data,
|
||||
u8 nec7210_ioport_read_byte(struct nec7210_priv *priv, unsigned int register_num);
|
||||
void nec7210_ioport_write_byte(struct nec7210_priv *priv, u8 data, unsigned int register_num);
|
||||
u8 nec7210_iomem_read_byte(struct nec7210_priv *priv, unsigned int register_num);
|
||||
void nec7210_iomem_write_byte(struct nec7210_priv *priv, u8 data, unsigned int register_num);
|
||||
u8 nec7210_locking_ioport_read_byte(struct nec7210_priv *priv, unsigned int register_num);
|
||||
void nec7210_locking_ioport_write_byte(struct nec7210_priv *priv, u8 data,
|
||||
unsigned int register_num);
|
||||
uint8_t nec7210_locking_iomem_read_byte(struct nec7210_priv *priv, unsigned int register_num);
|
||||
void nec7210_locking_iomem_write_byte(struct nec7210_priv *priv, uint8_t data,
|
||||
u8 nec7210_locking_iomem_read_byte(struct nec7210_priv *priv, unsigned int register_num);
|
||||
void nec7210_locking_iomem_write_byte(struct nec7210_priv *priv, u8 data,
|
||||
unsigned int register_num);
|
||||
|
||||
// interrupt service routine
|
||||
|
|
|
|||
|
|
@ -17,7 +17,8 @@ enum nec7210_chipset {
|
|||
TNT5004, // NI (minor differences to TNT4882)
|
||||
};
|
||||
|
||||
/* nec7210 register numbers (might need to be multiplied by
|
||||
/*
|
||||
* nec7210 register numbers (might need to be multiplied by
|
||||
* a board-dependent offset to get actually io address offset)
|
||||
*/
|
||||
// write registers
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
//* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
/***************************************************************************
|
||||
* copyright : (C) 2002 by Frank Mori Hess
|
||||
|
|
@ -79,24 +79,25 @@ enum {
|
|||
};
|
||||
|
||||
// interface functions
|
||||
int tms9914_read(struct gpib_board *board, struct tms9914_priv *priv, uint8_t *buffer,
|
||||
int tms9914_read(struct gpib_board *board, struct tms9914_priv *priv, u8 *buffer,
|
||||
size_t length, int *end, size_t *bytes_read);
|
||||
int tms9914_write(struct gpib_board *board, struct tms9914_priv *priv, uint8_t *buffer,
|
||||
int tms9914_write(struct gpib_board *board, struct tms9914_priv *priv, u8 *buffer,
|
||||
size_t length, int send_eoi, size_t *bytes_written);
|
||||
int tms9914_command(struct gpib_board *board, struct tms9914_priv *priv, uint8_t *buffer,
|
||||
int tms9914_command(struct gpib_board *board, struct tms9914_priv *priv, u8 *buffer,
|
||||
size_t length, size_t *bytes_written);
|
||||
int tms9914_take_control(struct gpib_board *board, struct tms9914_priv *priv, int syncronous);
|
||||
/* alternate version of tms9914_take_control which works around buggy tcs
|
||||
/*
|
||||
* alternate version of tms9914_take_control which works around buggy tcs
|
||||
* implementation.
|
||||
*/
|
||||
int tms9914_take_control_workaround(struct gpib_board *board, struct tms9914_priv *priv,
|
||||
int syncronous);
|
||||
int tms9914_go_to_standby(struct gpib_board *board, struct tms9914_priv *priv);
|
||||
void tms9914_request_system_control(struct gpib_board *board, struct tms9914_priv *priv,
|
||||
int request_control);
|
||||
int tms9914_request_system_control(struct gpib_board *board, struct tms9914_priv *priv,
|
||||
int request_control);
|
||||
void tms9914_interface_clear(struct gpib_board *board, struct tms9914_priv *priv, int assert);
|
||||
void tms9914_remote_enable(struct gpib_board *board, struct tms9914_priv *priv, int enable);
|
||||
int tms9914_enable_eos(struct gpib_board *board, struct tms9914_priv *priv, uint8_t eos_bytes,
|
||||
int tms9914_enable_eos(struct gpib_board *board, struct tms9914_priv *priv, u8 eos_bytes,
|
||||
int compare_8_bits);
|
||||
void tms9914_disable_eos(struct gpib_board *board, struct tms9914_priv *priv);
|
||||
unsigned int tms9914_update_status(struct gpib_board *board, struct tms9914_priv *priv,
|
||||
|
|
@ -105,13 +106,14 @@ int tms9914_primary_address(struct gpib_board *board,
|
|||
struct tms9914_priv *priv, unsigned int address);
|
||||
int tms9914_secondary_address(struct gpib_board *board, struct tms9914_priv *priv,
|
||||
unsigned int address, int enable);
|
||||
int tms9914_parallel_poll(struct gpib_board *board, struct tms9914_priv *priv, uint8_t *result);
|
||||
int tms9914_parallel_poll(struct gpib_board *board, struct tms9914_priv *priv, u8 *result);
|
||||
void tms9914_parallel_poll_configure(struct gpib_board *board,
|
||||
struct tms9914_priv *priv, uint8_t config);
|
||||
struct tms9914_priv *priv, u8 config);
|
||||
void tms9914_parallel_poll_response(struct gpib_board *board,
|
||||
struct tms9914_priv *priv, int ist);
|
||||
void tms9914_serial_poll_response(struct gpib_board *board, struct tms9914_priv *priv, uint8_t status);
|
||||
uint8_t tms9914_serial_poll_status(struct gpib_board *board, struct tms9914_priv *priv);
|
||||
void tms9914_serial_poll_response(struct gpib_board *board,
|
||||
struct tms9914_priv *priv, u8 status);
|
||||
u8 tms9914_serial_poll_status(struct gpib_board *board, struct tms9914_priv *priv);
|
||||
int tms9914_line_status(const struct gpib_board *board, struct tms9914_priv *priv);
|
||||
unsigned int tms9914_t1_delay(struct gpib_board *board, struct tms9914_priv *priv,
|
||||
unsigned int nano_sec);
|
||||
|
|
@ -124,10 +126,10 @@ void tms9914_release_holdoff(struct tms9914_priv *priv);
|
|||
void tms9914_set_holdoff_mode(struct tms9914_priv *priv, enum tms9914_holdoff_mode mode);
|
||||
|
||||
// wrappers for io functions
|
||||
uint8_t tms9914_ioport_read_byte(struct tms9914_priv *priv, unsigned int register_num);
|
||||
void tms9914_ioport_write_byte(struct tms9914_priv *priv, uint8_t data, unsigned int register_num);
|
||||
uint8_t tms9914_iomem_read_byte(struct tms9914_priv *priv, unsigned int register_num);
|
||||
void tms9914_iomem_write_byte(struct tms9914_priv *priv, uint8_t data, unsigned int register_num);
|
||||
u8 tms9914_ioport_read_byte(struct tms9914_priv *priv, unsigned int register_num);
|
||||
void tms9914_ioport_write_byte(struct tms9914_priv *priv, u8 data, unsigned int register_num);
|
||||
u8 tms9914_iomem_read_byte(struct tms9914_priv *priv, unsigned int register_num);
|
||||
void tms9914_iomem_write_byte(struct tms9914_priv *priv, u8 data, unsigned int register_num);
|
||||
|
||||
// interrupt service routine
|
||||
irqreturn_t tms9914_interrupt(struct gpib_board *board, struct tms9914_priv *priv);
|
||||
|
|
@ -139,7 +141,8 @@ enum {
|
|||
ms9914_num_registers = 8,
|
||||
};
|
||||
|
||||
/* tms9914 register numbers (might need to be multiplied by
|
||||
/*
|
||||
* tms9914 register numbers (might need to be multiplied by
|
||||
* a board-dependent offset to get actually io address offset)
|
||||
*/
|
||||
// write registers
|
||||
|
|
|
|||
|
|
@ -35,44 +35,6 @@ struct ines_priv {
|
|||
u8 extend_mode_bits;
|
||||
};
|
||||
|
||||
// interface functions
|
||||
int ines_read(struct gpib_board *board, uint8_t *buffer, size_t length, int *end, size_t *bytes_read);
|
||||
int ines_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
int send_eoi, size_t *bytes_written);
|
||||
int ines_accel_read(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
int *end, size_t *bytes_read);
|
||||
int ines_accel_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
int send_eoi, size_t *bytes_written);
|
||||
int ines_command(struct gpib_board *board, uint8_t *buffer, size_t length, size_t *bytes_written);
|
||||
int ines_take_control(struct gpib_board *board, int synchronous);
|
||||
int ines_go_to_standby(struct gpib_board *board);
|
||||
void ines_request_system_control(struct gpib_board *board, int request_control);
|
||||
void ines_interface_clear(struct gpib_board *board, int assert);
|
||||
void ines_remote_enable(struct gpib_board *board, int enable);
|
||||
int ines_enable_eos(struct gpib_board *board, uint8_t eos_byte, int compare_8_bits);
|
||||
void ines_disable_eos(struct gpib_board *board);
|
||||
unsigned int ines_update_status(struct gpib_board *board, unsigned int clear_mask);
|
||||
int ines_primary_address(struct gpib_board *board, unsigned int address);
|
||||
int ines_secondary_address(struct gpib_board *board, unsigned int address, int enable);
|
||||
int ines_parallel_poll(struct gpib_board *board, uint8_t *result);
|
||||
void ines_parallel_poll_configure(struct gpib_board *board, uint8_t config);
|
||||
void ines_parallel_poll_response(struct gpib_board *board, int ist);
|
||||
void ines_serial_poll_response(struct gpib_board *board, uint8_t status);
|
||||
uint8_t ines_serial_poll_status(struct gpib_board *board);
|
||||
int ines_line_status(const struct gpib_board *board);
|
||||
int ines_t1_delay(struct gpib_board *board, unsigned int nano_sec);
|
||||
void ines_return_to_local(struct gpib_board *board);
|
||||
|
||||
// interrupt service routines
|
||||
irqreturn_t ines_pci_interrupt(int irq, void *arg);
|
||||
irqreturn_t ines_interrupt(struct gpib_board *board);
|
||||
|
||||
// utility functions
|
||||
void ines_free_private(struct gpib_board *board);
|
||||
int ines_generic_attach(struct gpib_board *board);
|
||||
void ines_online(struct ines_priv *priv, const struct gpib_board *board, int use_accel);
|
||||
void ines_set_xfer_counter(struct ines_priv *priv, unsigned int count);
|
||||
|
||||
/* inb/outb wrappers */
|
||||
static inline unsigned int ines_inb(struct ines_priv *priv, unsigned int register_number)
|
||||
{
|
||||
|
|
@ -87,11 +49,6 @@ static inline void ines_outb(struct ines_priv *priv, unsigned int value,
|
|||
register_number * priv->nec7210_priv.offset);
|
||||
}
|
||||
|
||||
// pcmcia init/cleanup
|
||||
|
||||
int ines_pcmcia_init_module(void);
|
||||
void ines_pcmcia_cleanup_module(void);
|
||||
|
||||
enum ines_regs {
|
||||
// read
|
||||
FIFO_STATUS = 0x8,
|
||||
|
|
|
|||
|
|
@ -25,7 +25,9 @@
|
|||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("GPIB driver for Ines iGPIB 72010");
|
||||
|
||||
int ines_line_status(const struct gpib_board *board)
|
||||
static irqreturn_t ines_interrupt(struct gpib_board *board);
|
||||
|
||||
static int ines_line_status(const struct gpib_board *board)
|
||||
{
|
||||
int status = VALID_ALL;
|
||||
int bcm_bits;
|
||||
|
|
@ -55,7 +57,7 @@ int ines_line_status(const struct gpib_board *board)
|
|||
return status;
|
||||
}
|
||||
|
||||
void ines_set_xfer_counter(struct ines_priv *priv, unsigned int count)
|
||||
static void ines_set_xfer_counter(struct ines_priv *priv, unsigned int count)
|
||||
{
|
||||
if (count > 0xffff) {
|
||||
pr_err("bug! tried to set xfer counter > 0xffff\n");
|
||||
|
|
@ -65,7 +67,7 @@ void ines_set_xfer_counter(struct ines_priv *priv, unsigned int count)
|
|||
ines_outb(priv, count & 0xff, XFER_COUNT_LOWER);
|
||||
}
|
||||
|
||||
int ines_t1_delay(struct gpib_board *board, unsigned int nano_sec)
|
||||
static int ines_t1_delay(struct gpib_board *board, unsigned int nano_sec)
|
||||
{
|
||||
struct ines_priv *ines_priv = board->private_data;
|
||||
struct nec7210_priv *nec_priv = &ines_priv->nec7210_priv;
|
||||
|
|
@ -95,7 +97,7 @@ static inline unsigned short num_in_fifo_bytes(struct ines_priv *ines_priv)
|
|||
return ines_inb(ines_priv, IN_FIFO_COUNT);
|
||||
}
|
||||
|
||||
static ssize_t pio_read(struct gpib_board *board, struct ines_priv *ines_priv, uint8_t *buffer,
|
||||
static ssize_t pio_read(struct gpib_board *board, struct ines_priv *ines_priv, u8 *buffer,
|
||||
size_t length, size_t *nbytes)
|
||||
{
|
||||
ssize_t retval = 0;
|
||||
|
|
@ -133,8 +135,8 @@ static ssize_t pio_read(struct gpib_board *board, struct ines_priv *ines_priv, u
|
|||
return retval;
|
||||
}
|
||||
|
||||
int ines_accel_read(struct gpib_board *board, uint8_t *buffer,
|
||||
size_t length, int *end, size_t *bytes_read)
|
||||
static int ines_accel_read(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, int *end, size_t *bytes_read)
|
||||
{
|
||||
ssize_t retval = 0;
|
||||
struct ines_priv *ines_priv = board->private_data;
|
||||
|
|
@ -213,8 +215,8 @@ static int ines_write_wait(struct gpib_board *board, struct ines_priv *ines_priv
|
|||
return 0;
|
||||
}
|
||||
|
||||
int ines_accel_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
int send_eoi, size_t *bytes_written)
|
||||
static int ines_accel_write(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int send_eoi, size_t *bytes_written)
|
||||
{
|
||||
size_t count = 0;
|
||||
ssize_t retval = 0;
|
||||
|
|
@ -264,7 +266,7 @@ int ines_accel_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
|||
return retval;
|
||||
}
|
||||
|
||||
irqreturn_t ines_pci_interrupt(int irq, void *arg)
|
||||
static irqreturn_t ines_pci_interrupt(int irq, void *arg)
|
||||
{
|
||||
struct gpib_board *board = arg;
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
|
@ -281,7 +283,7 @@ irqreturn_t ines_pci_interrupt(int irq, void *arg)
|
|||
return ines_interrupt(board);
|
||||
}
|
||||
|
||||
irqreturn_t ines_interrupt(struct gpib_board *board)
|
||||
static irqreturn_t ines_interrupt(struct gpib_board *board)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
struct nec7210_priv *nec_priv = &priv->nec7210_priv;
|
||||
|
|
@ -295,7 +297,7 @@ irqreturn_t ines_interrupt(struct gpib_board *board)
|
|||
isr3_bits = ines_inb(priv, ISR3);
|
||||
isr4_bits = ines_inb(priv, ISR4);
|
||||
if (isr3_bits & IFC_ACTIVE_BIT) {
|
||||
push_gpib_event(board, EventIFC);
|
||||
push_gpib_event(board, EVENT_IFC);
|
||||
wake++;
|
||||
}
|
||||
if (isr3_bits & FIFO_ERROR_BIT)
|
||||
|
|
@ -313,9 +315,9 @@ irqreturn_t ines_interrupt(struct gpib_board *board)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int ines_pci_attach(struct gpib_board *board, const gpib_board_config_t *config);
|
||||
static int ines_pci_accel_attach(struct gpib_board *board, const gpib_board_config_t *config);
|
||||
static int ines_isa_attach(struct gpib_board *board, const gpib_board_config_t *config);
|
||||
static int ines_pci_attach(struct gpib_board *board, const struct gpib_board_config *config);
|
||||
static int ines_pci_accel_attach(struct gpib_board *board, const struct gpib_board_config *config);
|
||||
static int ines_isa_attach(struct gpib_board *board, const struct gpib_board_config *config);
|
||||
|
||||
static void ines_pci_detach(struct gpib_board *board);
|
||||
static void ines_isa_detach(struct gpib_board *board);
|
||||
|
|
@ -393,8 +395,8 @@ static struct ines_pci_id pci_ids[] = {
|
|||
static const int num_pci_chips = ARRAY_SIZE(pci_ids);
|
||||
|
||||
// wrappers for interface functions
|
||||
int ines_read(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
int *end, size_t *bytes_read)
|
||||
static int ines_read(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int *end, size_t *bytes_read)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
struct nec7210_priv *nec_priv = &priv->nec7210_priv;
|
||||
|
|
@ -412,134 +414,134 @@ int ines_read(struct gpib_board *board, uint8_t *buffer, size_t length,
|
|||
return retval;
|
||||
}
|
||||
|
||||
int ines_write(struct gpib_board *board, uint8_t *buffer, size_t length, int send_eoi,
|
||||
size_t *bytes_written)
|
||||
static int ines_write(struct gpib_board *board, u8 *buffer, size_t length, int send_eoi,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
||||
return nec7210_write(board, &priv->nec7210_priv, buffer, length, send_eoi, bytes_written);
|
||||
}
|
||||
|
||||
int ines_command(struct gpib_board *board, uint8_t *buffer, size_t length, size_t *bytes_written)
|
||||
static int ines_command(struct gpib_board *board, u8 *buffer, size_t length, size_t *bytes_written)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
||||
return nec7210_command(board, &priv->nec7210_priv, buffer, length, bytes_written);
|
||||
}
|
||||
|
||||
int ines_take_control(struct gpib_board *board, int synchronous)
|
||||
static int ines_take_control(struct gpib_board *board, int synchronous)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
||||
return nec7210_take_control(board, &priv->nec7210_priv, synchronous);
|
||||
}
|
||||
|
||||
int ines_go_to_standby(struct gpib_board *board)
|
||||
static int ines_go_to_standby(struct gpib_board *board)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
||||
return nec7210_go_to_standby(board, &priv->nec7210_priv);
|
||||
}
|
||||
|
||||
void ines_request_system_control(struct gpib_board *board, int request_control)
|
||||
static int ines_request_system_control(struct gpib_board *board, int request_control)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
||||
nec7210_request_system_control(board, &priv->nec7210_priv, request_control);
|
||||
return nec7210_request_system_control(board, &priv->nec7210_priv, request_control);
|
||||
}
|
||||
|
||||
void ines_interface_clear(struct gpib_board *board, int assert)
|
||||
static void ines_interface_clear(struct gpib_board *board, int assert)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
||||
nec7210_interface_clear(board, &priv->nec7210_priv, assert);
|
||||
}
|
||||
|
||||
void ines_remote_enable(struct gpib_board *board, int enable)
|
||||
static void ines_remote_enable(struct gpib_board *board, int enable)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
||||
nec7210_remote_enable(board, &priv->nec7210_priv, enable);
|
||||
}
|
||||
|
||||
int ines_enable_eos(struct gpib_board *board, uint8_t eos_byte, int compare_8_bits)
|
||||
static int ines_enable_eos(struct gpib_board *board, u8 eos_byte, int compare_8_bits)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
||||
return nec7210_enable_eos(board, &priv->nec7210_priv, eos_byte, compare_8_bits);
|
||||
}
|
||||
|
||||
void ines_disable_eos(struct gpib_board *board)
|
||||
static void ines_disable_eos(struct gpib_board *board)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
||||
nec7210_disable_eos(board, &priv->nec7210_priv);
|
||||
}
|
||||
|
||||
unsigned int ines_update_status(struct gpib_board *board, unsigned int clear_mask)
|
||||
static unsigned int ines_update_status(struct gpib_board *board, unsigned int clear_mask)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
||||
return nec7210_update_status(board, &priv->nec7210_priv, clear_mask);
|
||||
}
|
||||
|
||||
int ines_primary_address(struct gpib_board *board, unsigned int address)
|
||||
static int ines_primary_address(struct gpib_board *board, unsigned int address)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
||||
return nec7210_primary_address(board, &priv->nec7210_priv, address);
|
||||
}
|
||||
|
||||
int ines_secondary_address(struct gpib_board *board, unsigned int address, int enable)
|
||||
static int ines_secondary_address(struct gpib_board *board, unsigned int address, int enable)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
||||
return nec7210_secondary_address(board, &priv->nec7210_priv, address, enable);
|
||||
}
|
||||
|
||||
int ines_parallel_poll(struct gpib_board *board, uint8_t *result)
|
||||
static int ines_parallel_poll(struct gpib_board *board, u8 *result)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
||||
return nec7210_parallel_poll(board, &priv->nec7210_priv, result);
|
||||
}
|
||||
|
||||
void ines_parallel_poll_configure(struct gpib_board *board, uint8_t config)
|
||||
static void ines_parallel_poll_configure(struct gpib_board *board, u8 config)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
||||
nec7210_parallel_poll_configure(board, &priv->nec7210_priv, config);
|
||||
}
|
||||
|
||||
void ines_parallel_poll_response(struct gpib_board *board, int ist)
|
||||
static void ines_parallel_poll_response(struct gpib_board *board, int ist)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
||||
nec7210_parallel_poll_response(board, &priv->nec7210_priv, ist);
|
||||
}
|
||||
|
||||
void ines_serial_poll_response(struct gpib_board *board, uint8_t status)
|
||||
static void ines_serial_poll_response(struct gpib_board *board, u8 status)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
||||
nec7210_serial_poll_response(board, &priv->nec7210_priv, status);
|
||||
}
|
||||
|
||||
uint8_t ines_serial_poll_status(struct gpib_board *board)
|
||||
static u8 ines_serial_poll_status(struct gpib_board *board)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
||||
return nec7210_serial_poll_status(board, &priv->nec7210_priv);
|
||||
}
|
||||
|
||||
void ines_return_to_local(struct gpib_board *board)
|
||||
static void ines_return_to_local(struct gpib_board *board)
|
||||
{
|
||||
struct ines_priv *priv = board->private_data;
|
||||
|
||||
nec7210_return_to_local(board, &priv->nec7210_priv);
|
||||
}
|
||||
|
||||
static gpib_interface_t ines_pci_unaccel_interface = {
|
||||
static struct gpib_interface ines_pci_unaccel_interface = {
|
||||
.name = "ines_pci_unaccel",
|
||||
.attach = ines_pci_attach,
|
||||
.detach = ines_pci_detach,
|
||||
|
|
@ -567,7 +569,7 @@ static gpib_interface_t ines_pci_unaccel_interface = {
|
|||
.return_to_local = ines_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t ines_pci_interface = {
|
||||
static struct gpib_interface ines_pci_interface = {
|
||||
.name = "ines_pci",
|
||||
.attach = ines_pci_accel_attach,
|
||||
.detach = ines_pci_detach,
|
||||
|
|
@ -595,7 +597,7 @@ static gpib_interface_t ines_pci_interface = {
|
|||
.return_to_local = ines_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t ines_pci_accel_interface = {
|
||||
static struct gpib_interface ines_pci_accel_interface = {
|
||||
.name = "ines_pci_accel",
|
||||
.attach = ines_pci_accel_attach,
|
||||
.detach = ines_pci_detach,
|
||||
|
|
@ -623,7 +625,7 @@ static gpib_interface_t ines_pci_accel_interface = {
|
|||
.return_to_local = ines_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t ines_isa_interface = {
|
||||
static struct gpib_interface ines_isa_interface = {
|
||||
.name = "ines_isa",
|
||||
.attach = ines_isa_attach,
|
||||
.detach = ines_isa_detach,
|
||||
|
|
@ -664,13 +666,13 @@ static int ines_allocate_private(struct gpib_board *board)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void ines_free_private(struct gpib_board *board)
|
||||
static void ines_free_private(struct gpib_board *board)
|
||||
{
|
||||
kfree(board->private_data);
|
||||
board->private_data = NULL;
|
||||
}
|
||||
|
||||
int ines_generic_attach(struct gpib_board *board)
|
||||
static int ines_generic_attach(struct gpib_board *board)
|
||||
{
|
||||
struct ines_priv *ines_priv;
|
||||
struct nec7210_priv *nec_priv;
|
||||
|
|
@ -690,7 +692,7 @@ int ines_generic_attach(struct gpib_board *board)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void ines_online(struct ines_priv *ines_priv, const struct gpib_board *board, int use_accel)
|
||||
static void ines_online(struct ines_priv *ines_priv, const struct gpib_board *board, int use_accel)
|
||||
{
|
||||
struct nec7210_priv *nec_priv = &ines_priv->nec7210_priv;
|
||||
|
||||
|
|
@ -724,7 +726,7 @@ void ines_online(struct ines_priv *ines_priv, const struct gpib_board *board, in
|
|||
nec7210_set_reg_bits(nec_priv, IMR1, HR_DOIE | HR_DIIE, 0);
|
||||
}
|
||||
|
||||
static int ines_common_pci_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int ines_common_pci_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
struct ines_priv *ines_priv;
|
||||
struct nec7210_priv *nec_priv;
|
||||
|
|
@ -852,7 +854,7 @@ static int ines_common_pci_attach(struct gpib_board *board, const gpib_board_con
|
|||
return 0;
|
||||
}
|
||||
|
||||
int ines_pci_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int ines_pci_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
struct ines_priv *ines_priv;
|
||||
int retval;
|
||||
|
|
@ -867,7 +869,7 @@ int ines_pci_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int ines_pci_accel_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int ines_pci_accel_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
struct ines_priv *ines_priv;
|
||||
int retval;
|
||||
|
|
@ -884,7 +886,7 @@ int ines_pci_accel_attach(struct gpib_board *board, const gpib_board_config_t *c
|
|||
|
||||
static const int ines_isa_iosize = 0x20;
|
||||
|
||||
int ines_isa_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int ines_isa_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
struct ines_priv *ines_priv;
|
||||
struct nec7210_priv *nec_priv;
|
||||
|
|
@ -915,7 +917,7 @@ int ines_isa_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void ines_pci_detach(struct gpib_board *board)
|
||||
static void ines_pci_detach(struct gpib_board *board)
|
||||
{
|
||||
struct ines_priv *ines_priv = board->private_data;
|
||||
struct nec7210_priv *nec_priv;
|
||||
|
|
@ -949,7 +951,7 @@ void ines_pci_detach(struct gpib_board *board)
|
|||
ines_free_private(board);
|
||||
}
|
||||
|
||||
void ines_isa_detach(struct gpib_board *board)
|
||||
static void ines_isa_detach(struct gpib_board *board)
|
||||
{
|
||||
struct ines_priv *ines_priv = board->private_data;
|
||||
struct nec7210_priv *nec_priv;
|
||||
|
|
@ -990,48 +992,49 @@ static struct pci_driver ines_pci_driver = {
|
|||
|
||||
static const int ines_pcmcia_iosize = 0x20;
|
||||
|
||||
/* The event() function is this driver's Card Services event handler.
|
||||
* It will be called by Card Services when an appropriate card status
|
||||
* event is received. The config() and release() entry points are
|
||||
* used to configure or release a socket, in response to card insertion
|
||||
* and ejection events. They are invoked from the gpib event
|
||||
* handler.
|
||||
/*
|
||||
* The event() function is this driver's Card Services event handler.
|
||||
* It will be called by Card Services when an appropriate card status
|
||||
* event is received. The config() and release() entry points are
|
||||
* used to configure or release a socket, in response to card insertion
|
||||
* and ejection events. They are invoked from the gpib event
|
||||
* handler.
|
||||
*/
|
||||
|
||||
static int ines_gpib_config(struct pcmcia_device *link);
|
||||
static void ines_gpib_release(struct pcmcia_device *link);
|
||||
static int ines_pcmcia_attach(struct gpib_board *board, const gpib_board_config_t *config);
|
||||
static int ines_pcmcia_accel_attach(struct gpib_board *board, const gpib_board_config_t *config);
|
||||
static int ines_pcmcia_attach(struct gpib_board *board, const struct gpib_board_config *config);
|
||||
static int ines_pcmcia_accel_attach(struct gpib_board *board,
|
||||
const struct gpib_board_config *config);
|
||||
static void ines_pcmcia_detach(struct gpib_board *board);
|
||||
static irqreturn_t ines_pcmcia_interrupt(int irq, void *arg);
|
||||
static int ines_common_pcmcia_attach(struct gpib_board *board);
|
||||
/*
|
||||
* A linked list of "instances" of the gpib device. Each actual
|
||||
* PCMCIA card corresponds to one device instance, and is described
|
||||
* by one dev_link_t structure (defined in ds.h).
|
||||
* PCMCIA card corresponds to one device instance, and is described
|
||||
* by one dev_link_t structure (defined in ds.h).
|
||||
*
|
||||
* You may not want to use a linked list for this -- for example, the
|
||||
* memory card driver uses an array of dev_link_t pointers, where minor
|
||||
* device numbers are used to derive the corresponding array index.
|
||||
* You may not want to use a linked list for this -- for example, the
|
||||
* memory card driver uses an array of dev_link_t pointers, where minor
|
||||
* device numbers are used to derive the corresponding array index.
|
||||
*/
|
||||
|
||||
static struct pcmcia_device *curr_dev;
|
||||
|
||||
/*
|
||||
* A dev_link_t structure has fields for most things that are needed
|
||||
* to keep track of a socket, but there will usually be some device
|
||||
* specific information that also needs to be kept track of. The
|
||||
* 'priv' pointer in a dev_link_t structure can be used to point to
|
||||
* a device-specific private data structure, like this.
|
||||
* A dev_link_t structure has fields for most things that are needed
|
||||
* to keep track of a socket, but there will usually be some device
|
||||
* specific information that also needs to be kept track of. The
|
||||
* 'priv' pointer in a dev_link_t structure can be used to point to
|
||||
* a device-specific private data structure, like this.
|
||||
*
|
||||
* A driver needs to provide a dev_node_t structure for each device
|
||||
* on a card. In some cases, there is only one device per card (for
|
||||
* example, ethernet cards, modems). In other cases, there may be
|
||||
* many actual or logical devices (SCSI adapters, memory cards with
|
||||
* multiple partitions). The dev_node_t structures need to be kept
|
||||
* in a linked list starting at the 'dev' field of a dev_link_t
|
||||
* structure. We allocate them in the card's private data structure,
|
||||
* because they generally can't be allocated dynamically.
|
||||
* A driver needs to provide a dev_node_t structure for each device
|
||||
* on a card. In some cases, there is only one device per card (for
|
||||
* example, ethernet cards, modems). In other cases, there may be
|
||||
* many actual or logical devices (SCSI adapters, memory cards with
|
||||
* multiple partitions). The dev_node_t structures need to be kept
|
||||
* in a linked list starting at the 'dev' field of a dev_link_t
|
||||
* structure. We allocate them in the card's private data structure,
|
||||
* because they generally can't be allocated dynamically.
|
||||
*/
|
||||
|
||||
struct local_info {
|
||||
|
|
@ -1042,13 +1045,13 @@ struct local_info {
|
|||
};
|
||||
|
||||
/*
|
||||
* gpib_attach() creates an "instance" of the driver, allocating
|
||||
* local data structures for one device. The device is registered
|
||||
* with Card Services.
|
||||
* gpib_attach() creates an "instance" of the driver, allocating
|
||||
* local data structures for one device. The device is registered
|
||||
* with Card Services.
|
||||
*
|
||||
* The dev_link structure is initialized, but we don't actually
|
||||
* configure the card at this point -- we wait until we receive a
|
||||
* card insertion event.
|
||||
* The dev_link structure is initialized, but we don't actually
|
||||
* configure the card at this point -- we wait until we receive a
|
||||
* card insertion event.
|
||||
*/
|
||||
static int ines_gpib_probe(struct pcmcia_device *link)
|
||||
{
|
||||
|
|
@ -1079,10 +1082,10 @@ static int ines_gpib_probe(struct pcmcia_device *link)
|
|||
}
|
||||
|
||||
/*
|
||||
* This deletes a driver "instance". The device is de-registered
|
||||
* with Card Services. If it has been released, all local data
|
||||
* structures are freed. Otherwise, the structures will be freed
|
||||
* when the device is released.
|
||||
* This deletes a driver "instance". The device is de-registered
|
||||
* with Card Services. If it has been released, all local data
|
||||
* structures are freed. Otherwise, the structures will be freed
|
||||
* when the device is released.
|
||||
*/
|
||||
static void ines_gpib_remove(struct pcmcia_device *link)
|
||||
{
|
||||
|
|
@ -1103,18 +1106,15 @@ static int ines_gpib_config_iteration(struct pcmcia_device *link, void *priv_dat
|
|||
}
|
||||
|
||||
/*
|
||||
* gpib_config() is scheduled to run after a CARD_INSERTION event
|
||||
* is received, to configure the PCMCIA socket, and to make the
|
||||
* device available to the system.
|
||||
* gpib_config() is scheduled to run after a CARD_INSERTION event
|
||||
* is received, to configure the PCMCIA socket, and to make the
|
||||
* device available to the system.
|
||||
*/
|
||||
static int ines_gpib_config(struct pcmcia_device *link)
|
||||
{
|
||||
struct local_info *dev;
|
||||
int retval;
|
||||
void __iomem *virt;
|
||||
|
||||
dev = link->priv;
|
||||
|
||||
retval = pcmcia_loop_config(link, &ines_gpib_config_iteration, NULL);
|
||||
if (retval) {
|
||||
dev_warn(&link->dev, "no configuration found\n");
|
||||
|
|
@ -1125,8 +1125,9 @@ static int ines_gpib_config(struct pcmcia_device *link)
|
|||
dev_dbg(&link->dev, "ines_cs: manufacturer: 0x%x card: 0x%x\n",
|
||||
link->manf_id, link->card_id);
|
||||
|
||||
/* for the ines card we have to setup the configuration registers in
|
||||
* attribute memory here
|
||||
/*
|
||||
* for the ines card we have to setup the configuration registers in
|
||||
* attribute memory here
|
||||
*/
|
||||
link->resource[2]->flags |= WIN_MEMORY_TYPE_AM | WIN_DATA_WIDTH_8 | WIN_ENABLE;
|
||||
link->resource[2]->end = 0x1000;
|
||||
|
|
@ -1159,9 +1160,9 @@ static int ines_gpib_config(struct pcmcia_device *link)
|
|||
} /* gpib_config */
|
||||
|
||||
/*
|
||||
* After a card is removed, gpib_release() will unregister the net
|
||||
* device, and release the PCMCIA configuration. If the device is
|
||||
* still open, this will be postponed until it is closed.
|
||||
* After a card is removed, gpib_release() will unregister the net
|
||||
* device, and release the PCMCIA configuration. If the device is
|
||||
* still open, this will be postponed until it is closed.
|
||||
*/
|
||||
|
||||
static void ines_gpib_release(struct pcmcia_device *link)
|
||||
|
|
@ -1210,12 +1211,12 @@ static struct pcmcia_driver ines_gpib_cs_driver = {
|
|||
.resume = ines_gpib_resume,
|
||||
};
|
||||
|
||||
void ines_pcmcia_cleanup_module(void)
|
||||
static void ines_pcmcia_cleanup_module(void)
|
||||
{
|
||||
pcmcia_unregister_driver(&ines_gpib_cs_driver);
|
||||
}
|
||||
|
||||
static gpib_interface_t ines_pcmcia_unaccel_interface = {
|
||||
static struct gpib_interface ines_pcmcia_unaccel_interface = {
|
||||
.name = "ines_pcmcia_unaccel",
|
||||
.attach = ines_pcmcia_attach,
|
||||
.detach = ines_pcmcia_detach,
|
||||
|
|
@ -1243,7 +1244,7 @@ static gpib_interface_t ines_pcmcia_unaccel_interface = {
|
|||
.return_to_local = ines_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t ines_pcmcia_accel_interface = {
|
||||
static struct gpib_interface ines_pcmcia_accel_interface = {
|
||||
.name = "ines_pcmcia_accel",
|
||||
.attach = ines_pcmcia_accel_attach,
|
||||
.detach = ines_pcmcia_detach,
|
||||
|
|
@ -1271,7 +1272,7 @@ static gpib_interface_t ines_pcmcia_accel_interface = {
|
|||
.return_to_local = ines_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t ines_pcmcia_interface = {
|
||||
static struct gpib_interface ines_pcmcia_interface = {
|
||||
.name = "ines_pcmcia",
|
||||
.attach = ines_pcmcia_accel_attach,
|
||||
.detach = ines_pcmcia_detach,
|
||||
|
|
@ -1299,14 +1300,14 @@ static gpib_interface_t ines_pcmcia_interface = {
|
|||
.return_to_local = ines_return_to_local,
|
||||
};
|
||||
|
||||
irqreturn_t ines_pcmcia_interrupt(int irq, void *arg)
|
||||
static irqreturn_t ines_pcmcia_interrupt(int irq, void *arg)
|
||||
{
|
||||
struct gpib_board *board = arg;
|
||||
|
||||
return ines_interrupt(board);
|
||||
}
|
||||
|
||||
int ines_common_pcmcia_attach(struct gpib_board *board)
|
||||
static int ines_common_pcmcia_attach(struct gpib_board *board)
|
||||
{
|
||||
struct ines_priv *ines_priv;
|
||||
struct nec7210_priv *nec_priv;
|
||||
|
|
@ -1345,7 +1346,7 @@ int ines_common_pcmcia_attach(struct gpib_board *board)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int ines_pcmcia_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int ines_pcmcia_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
struct ines_priv *ines_priv;
|
||||
int retval;
|
||||
|
|
@ -1360,7 +1361,8 @@ int ines_pcmcia_attach(struct gpib_board *board, const gpib_board_config_t *conf
|
|||
return 0;
|
||||
}
|
||||
|
||||
int ines_pcmcia_accel_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int ines_pcmcia_accel_attach(struct gpib_board *board,
|
||||
const struct gpib_board_config *config)
|
||||
{
|
||||
struct ines_priv *ines_priv;
|
||||
int retval;
|
||||
|
|
@ -1375,7 +1377,7 @@ int ines_pcmcia_accel_attach(struct gpib_board *board, const gpib_board_config_t
|
|||
return 0;
|
||||
}
|
||||
|
||||
void ines_pcmcia_detach(struct gpib_board *board)
|
||||
static void ines_pcmcia_detach(struct gpib_board *board)
|
||||
{
|
||||
struct ines_priv *ines_priv = board->private_data;
|
||||
struct nec7210_priv *nec_priv;
|
||||
|
|
@ -1484,7 +1486,7 @@ static void __exit ines_exit_module(void)
|
|||
gpib_unregister_driver(&ines_pci_unaccel_interface);
|
||||
gpib_unregister_driver(&ines_pci_accel_interface);
|
||||
gpib_unregister_driver(&ines_isa_interface);
|
||||
#ifdef GPIB__PCMCIA
|
||||
#ifdef CONFIG_GPIB_PCMCIA
|
||||
gpib_unregister_driver(&ines_pcmcia_interface);
|
||||
gpib_unregister_driver(&ines_pcmcia_unaccel_interface);
|
||||
gpib_unregister_driver(&ines_pcmcia_accel_interface);
|
||||
|
|
|
|||
|
|
@ -36,16 +36,16 @@ MODULE_LICENSE("GPL");
|
|||
MODULE_DESCRIPTION("GPIB driver for LPVO usb devices");
|
||||
|
||||
/*
|
||||
* Table of devices that work with this driver.
|
||||
* Table of devices that work with this driver.
|
||||
*
|
||||
* Currently, only one device is known to be used in the
|
||||
* lpvo_usb_gpib adapter (FTDI 0403:6001).
|
||||
* If your adapter uses a different chip, insert a line
|
||||
* in the following table with proper <Vendor-id>, <Product-id>.
|
||||
* Currently, only one device is known to be used in the
|
||||
* lpvo_usb_gpib adapter (FTDI 0403:6001).
|
||||
* If your adapter uses a different chip, insert a line
|
||||
* in the following table with proper <Vendor-id>, <Product-id>.
|
||||
*
|
||||
* To have your chip automatically handled by the driver,
|
||||
* update files "/usr/local/etc/modprobe.d/lpvo_usb_gpib.conf"
|
||||
* and /usr/local/etc/udev/rules.d/99-lpvo_usb_gpib.rules.
|
||||
* To have your chip automatically handled by the driver,
|
||||
* update files "/usr/local/etc/modprobe.d/lpvo_usb_gpib.conf"
|
||||
* and /usr/local/etc/udev/rules.d/99-lpvo_usb_gpib.rules.
|
||||
*
|
||||
*/
|
||||
|
||||
|
|
@ -56,18 +56,18 @@ static const struct usb_device_id skel_table[] = {
|
|||
MODULE_DEVICE_TABLE(usb, skel_table);
|
||||
|
||||
/*
|
||||
* *** Diagnostics and Debug ***
|
||||
* To enable the diagnostic and debug messages either compile with DEBUG set
|
||||
* or control via the dynamic debug mechanisms.
|
||||
* The module parameter "debug" controls the sending of debug messages to
|
||||
* syslog. By default it is set to 0
|
||||
* debug = 0: only attach/detach messages are sent
|
||||
* 1: every action is logged
|
||||
* 2: extended logging; each single exchanged byte is documented
|
||||
* (about twice the log volume of [1])
|
||||
* To switch debug level:
|
||||
* At module loading: modprobe lpvo_usb_gpib debug={0,1,2}
|
||||
* On the fly: echo {0,1,2} > /sys/modules/lpvo_usb_gpib/parameters/debug
|
||||
* *** Diagnostics and Debug ***
|
||||
* To enable the diagnostic and debug messages either compile with DEBUG set
|
||||
* or control via the dynamic debug mechanisms.
|
||||
* The module parameter "debug" controls the sending of debug messages to
|
||||
* syslog. By default it is set to 0
|
||||
* debug = 0: only attach/detach messages are sent
|
||||
* 1: every action is logged
|
||||
* 2: extended logging; each single exchanged byte is documented
|
||||
* (about twice the log volume of [1])
|
||||
* To switch debug level:
|
||||
* At module loading: modprobe lpvo_usb_gpib debug={0,1,2}
|
||||
* On the fly: echo {0,1,2} > /sys/modules/lpvo_usb_gpib/parameters/debug
|
||||
*/
|
||||
|
||||
static int debug;
|
||||
|
|
@ -169,10 +169,10 @@ static void show_status(struct gpib_board *board)
|
|||
}
|
||||
|
||||
/*
|
||||
* GLOBAL VARIABLES: required for
|
||||
* pairing among gpib minor and usb minor.
|
||||
* MAX_DEV is the max number of usb-gpib adapters; free
|
||||
* to change as you like, but no more than 32
|
||||
* GLOBAL VARIABLES: required for
|
||||
* pairing among gpib minor and usb minor.
|
||||
* MAX_DEV is the max number of usb-gpib adapters; free
|
||||
* to change as you like, but no more than 32
|
||||
*/
|
||||
|
||||
#define MAX_DEV 8
|
||||
|
|
@ -182,7 +182,7 @@ static int assigned_usb_minors; /* mask of filled slots */
|
|||
static struct mutex minors_lock; /* operations on usb_minors are to be protected */
|
||||
|
||||
/*
|
||||
* usb-skeleton prototypes
|
||||
* usb-skeleton prototypes
|
||||
*/
|
||||
|
||||
struct usb_skel;
|
||||
|
|
@ -192,7 +192,7 @@ static int skel_do_open(struct gpib_board *, int);
|
|||
static int skel_do_release(struct gpib_board *);
|
||||
|
||||
/*
|
||||
* usec_diff : take difference in MICROsec between two 'timespec'
|
||||
* usec_diff : take difference in MICROsec between two 'timespec'
|
||||
* (unix time in sec and NANOsec)
|
||||
*/
|
||||
|
||||
|
|
@ -203,7 +203,7 @@ static inline int usec_diff(struct timespec64 *a, struct timespec64 *b)
|
|||
}
|
||||
|
||||
/*
|
||||
* *** these routines are specific to the usb-gpib adapter ***
|
||||
* *** these routines are specific to the usb-gpib adapter ***
|
||||
*/
|
||||
|
||||
/**
|
||||
|
|
@ -262,13 +262,11 @@ static int send_command(struct gpib_board *board, char *msg, int leng)
|
|||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* set_control_line() - Set the value of a single gpib control line
|
||||
*
|
||||
* @board: the gpib_board_struct data area for this gpib interface
|
||||
* @line: line mask
|
||||
* @value: line new value (0/1)
|
||||
*
|
||||
*/
|
||||
|
||||
static int set_control_line(struct gpib_board *board, int line, int value)
|
||||
|
|
@ -368,7 +366,7 @@ static void set_timeout(struct gpib_board *board)
|
|||
}
|
||||
|
||||
/*
|
||||
* now the standard interface functions - attach and detach
|
||||
* now the standard interface functions - attach and detach
|
||||
*/
|
||||
|
||||
/**
|
||||
|
|
@ -384,7 +382,7 @@ static void set_timeout(struct gpib_board *board)
|
|||
* detach() will be called. Always.
|
||||
*/
|
||||
|
||||
static int usb_gpib_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int usb_gpib_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
int retval, j;
|
||||
u32 base = config->ibbase;
|
||||
|
|
@ -464,7 +462,8 @@ static int usb_gpib_attach(struct gpib_board *board, const gpib_board_config_t *
|
|||
if (retval != ACK)
|
||||
return -EIO;
|
||||
|
||||
/* We must setup debug mode because we need the extended instruction
|
||||
/*
|
||||
* We must setup debug mode because we need the extended instruction
|
||||
* set to cope with the Core (gpib_common) point of view
|
||||
*/
|
||||
|
||||
|
|
@ -473,7 +472,8 @@ static int usb_gpib_attach(struct gpib_board *board, const gpib_board_config_t *
|
|||
if (retval != ACK)
|
||||
return -EIO;
|
||||
|
||||
/* We must keep REN off after an IFC because so it is
|
||||
/*
|
||||
* We must keep REN off after an IFC because so it is
|
||||
* assumed by the Core
|
||||
*/
|
||||
|
||||
|
|
@ -654,7 +654,8 @@ static int usb_gpib_line_status(const struct gpib_board *board)
|
|||
|
||||
DIA_LOG(1, "%s\n", "request");
|
||||
|
||||
/* if we are on the wait queue (board->wait), do not hurry
|
||||
/*
|
||||
* if we are on the wait queue (board->wait), do not hurry
|
||||
* reading status line; instead, pause a little
|
||||
*/
|
||||
|
||||
|
|
@ -705,9 +706,10 @@ static int usb_gpib_line_status(const struct gpib_board *board)
|
|||
|
||||
/* parallel_poll */
|
||||
|
||||
static int usb_gpib_parallel_poll(struct gpib_board *board, uint8_t *result)
|
||||
static int usb_gpib_parallel_poll(struct gpib_board *board, u8 *result)
|
||||
{
|
||||
/* request parallel poll asserting ATN | EOI;
|
||||
/*
|
||||
* request parallel poll asserting ATN | EOI;
|
||||
* we suppose ATN already asserted
|
||||
*/
|
||||
|
||||
|
|
@ -909,15 +911,13 @@ static void usb_gpib_remote_enable(struct gpib_board *board, int enable)
|
|||
|
||||
/* request_system_control */
|
||||
|
||||
static void usb_gpib_request_system_control(struct gpib_board *board,
|
||||
int request_control)
|
||||
static int usb_gpib_request_system_control(struct gpib_board *board, int request_control)
|
||||
{
|
||||
if (request_control)
|
||||
set_bit(CIC_NUM, &board->status);
|
||||
else
|
||||
clear_bit(CIC_NUM, &board->status);
|
||||
if (!request_control)
|
||||
return -EINVAL;
|
||||
|
||||
DIA_LOG(1, "done with %d -> %lx\n", request_control, board->status);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* take_control */
|
||||
|
|
@ -997,7 +997,7 @@ static int usb_gpib_write(struct gpib_board *board,
|
|||
/* parallel_poll configure */
|
||||
|
||||
static void usb_gpib_parallel_poll_configure(struct gpib_board *board,
|
||||
uint8_t configuration)
|
||||
u8 configuration)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -1031,13 +1031,13 @@ static int usb_gpib_secondary_address(struct gpib_board *board,
|
|||
|
||||
/* serial_poll_response */
|
||||
|
||||
static void usb_gpib_serial_poll_response(struct gpib_board *board, uint8_t status)
|
||||
static void usb_gpib_serial_poll_response(struct gpib_board *board, u8 status)
|
||||
{
|
||||
}
|
||||
|
||||
/* serial_poll_status */
|
||||
|
||||
static uint8_t usb_gpib_serial_poll_status(struct gpib_board *board)
|
||||
static u8 usb_gpib_serial_poll_status(struct gpib_board *board)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1053,7 +1053,7 @@ static int usb_gpib_t1_delay(struct gpib_board *board, unsigned int nano_sec)
|
|||
* *** module dispatch table and init/exit functions ***
|
||||
*/
|
||||
|
||||
static gpib_interface_t usb_gpib_interface = {
|
||||
static struct gpib_interface usb_gpib_interface = {
|
||||
.name = NAME,
|
||||
.attach = usb_gpib_attach,
|
||||
.detach = usb_gpib_detach,
|
||||
|
|
@ -1083,13 +1083,13 @@ static gpib_interface_t usb_gpib_interface = {
|
|||
};
|
||||
|
||||
/*
|
||||
* usb_gpib_init_module(), usb_gpib_exit_module()
|
||||
* usb_gpib_init_module(), usb_gpib_exit_module()
|
||||
*
|
||||
* This functions are called every time a new device is detected
|
||||
* and registered or is removed and unregistered.
|
||||
* We must take note of created and destroyed usb minors to be used
|
||||
* when usb_gpib_attach() and usb_gpib_detach() will be called on
|
||||
* request by gpib_config.
|
||||
* This functions are called every time a new device is detected
|
||||
* and registered or is removed and unregistered.
|
||||
* We must take note of created and destroyed usb minors to be used
|
||||
* when usb_gpib_attach() and usb_gpib_detach() will be called on
|
||||
* request by gpib_config.
|
||||
*/
|
||||
|
||||
static int usb_gpib_init_module(struct usb_interface *interface)
|
||||
|
|
@ -1107,8 +1107,9 @@ static int usb_gpib_init_module(struct usb_interface *interface)
|
|||
goto exit;
|
||||
}
|
||||
} else {
|
||||
/* check if minor is already registered - maybe useless, but if
|
||||
* it happens the code is inconsistent somewhere
|
||||
/*
|
||||
* check if minor is already registered - maybe useless, but if
|
||||
* it happens the code is inconsistent somewhere
|
||||
*/
|
||||
|
||||
for (j = 0 ; j < MAX_DEV ; j++) {
|
||||
|
|
@ -1162,12 +1163,11 @@ exit:
|
|||
}
|
||||
|
||||
/*
|
||||
* Default latency time (16 msec) is too long.
|
||||
* We must use 1 msec (best); anyhow, no more than 5 msec.
|
||||
*
|
||||
* Defines and function taken and modified from the kernel tree
|
||||
* (see ftdi_sio.h and ftdi_sio.c).
|
||||
* Default latency time (16 msec) is too long.
|
||||
* We must use 1 msec (best); anyhow, no more than 5 msec.
|
||||
*
|
||||
* Defines and function taken and modified from the kernel tree
|
||||
* (see ftdi_sio.h and ftdi_sio.c).
|
||||
*/
|
||||
|
||||
#define FTDI_SIO_SET_LATENCY_TIMER 9 /* Set the latency timer */
|
||||
|
|
@ -1235,7 +1235,8 @@ static int write_latency_timer(struct usb_device *udev)
|
|||
/* private defines */
|
||||
|
||||
#define MAX_TRANSFER (PAGE_SIZE - 512)
|
||||
/* MAX_TRANSFER is chosen so that the VM is not stressed by
|
||||
/*
|
||||
* MAX_TRANSFER is chosen so that the VM is not stressed by
|
||||
* allocations > PAGE_SIZE and the number of packets in a page
|
||||
* is an integer 512 is the largest possible packet on EHCI
|
||||
*/
|
||||
|
|
@ -1280,7 +1281,7 @@ static void skel_delete(struct kref *kref)
|
|||
}
|
||||
|
||||
/*
|
||||
* skel_do_open() - to be called by usb_gpib_attach
|
||||
* skel_do_open() - to be called by usb_gpib_attach
|
||||
*/
|
||||
|
||||
static int skel_do_open(struct gpib_board *board, int subminor)
|
||||
|
|
@ -1317,7 +1318,7 @@ exit:
|
|||
}
|
||||
|
||||
/*
|
||||
* skel_do_release() - to be called by usb_gpib_detach
|
||||
* skel_do_release() - to be called by usb_gpib_detach
|
||||
*/
|
||||
|
||||
static int skel_do_release(struct gpib_board *board)
|
||||
|
|
@ -1340,7 +1341,7 @@ static int skel_do_release(struct gpib_board *board)
|
|||
}
|
||||
|
||||
/*
|
||||
* read functions
|
||||
* read functions
|
||||
*/
|
||||
|
||||
static void skel_read_bulk_callback(struct urb *urb)
|
||||
|
|
@ -1405,7 +1406,7 @@ static int skel_do_read_io(struct usb_skel *dev, size_t count)
|
|||
}
|
||||
|
||||
/*
|
||||
* skel_do_read() - read operations from lpvo_usb_gpib
|
||||
* skel_do_read() - read operations from lpvo_usb_gpib
|
||||
*/
|
||||
|
||||
static ssize_t skel_do_read(struct usb_skel *dev, char *buffer, size_t count)
|
||||
|
|
@ -1482,7 +1483,8 @@ retry:
|
|||
* all data has been used
|
||||
* actual IO needs to be done
|
||||
*/
|
||||
/* it seems that requests for less than dev->bulk_in_size
|
||||
/*
|
||||
* it seems that requests for less than dev->bulk_in_size
|
||||
* are not accepted
|
||||
*/
|
||||
rv = skel_do_read_io(dev, dev->bulk_in_size);
|
||||
|
|
@ -1496,7 +1498,8 @@ retry:
|
|||
* data is available - chunk tells us how much shall be copied
|
||||
*/
|
||||
|
||||
/* Condition dev->bulk_in_copied > 0 maybe will never happen. In case,
|
||||
/*
|
||||
* Condition dev->bulk_in_copied > 0 maybe will never happen. In case,
|
||||
* signal the event and copy using the original procedure, i.e., copy
|
||||
* first two bytes also
|
||||
*/
|
||||
|
|
@ -1551,7 +1554,7 @@ exit:
|
|||
}
|
||||
|
||||
/*
|
||||
* write functions
|
||||
* write functions
|
||||
*/
|
||||
|
||||
static void skel_write_bulk_callback(struct urb *urb)
|
||||
|
|
@ -1581,7 +1584,7 @@ static void skel_write_bulk_callback(struct urb *urb)
|
|||
}
|
||||
|
||||
/*
|
||||
* skel_do_write() - write operations from lpvo_usb_gpib
|
||||
* skel_do_write() - write operations from lpvo_usb_gpib
|
||||
*/
|
||||
|
||||
static ssize_t skel_do_write(struct usb_skel *dev, const char *buffer, size_t count)
|
||||
|
|
@ -1686,7 +1689,7 @@ exit:
|
|||
}
|
||||
|
||||
/*
|
||||
* services for the user space devices
|
||||
* services for the user space devices
|
||||
*/
|
||||
|
||||
#if USER_DEVICE /* conditional compilation of user space device */
|
||||
|
|
@ -1771,7 +1774,7 @@ static int skel_release(struct inode *inode, struct file *file)
|
|||
}
|
||||
|
||||
/*
|
||||
* user space access to read function
|
||||
* user space access to read function
|
||||
*/
|
||||
|
||||
static ssize_t skel_read(struct file *file, char __user *buffer, size_t count,
|
||||
|
|
@ -1800,7 +1803,7 @@ static ssize_t skel_read(struct file *file, char __user *buffer, size_t count,
|
|||
}
|
||||
|
||||
/*
|
||||
* user space access to write function
|
||||
* user space access to write function
|
||||
*/
|
||||
|
||||
static ssize_t skel_write(struct file *file, const char __user *user_buffer,
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@
|
|||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("GPIB library code for NEC uPD7210");
|
||||
|
||||
int nec7210_enable_eos(struct gpib_board *board, struct nec7210_priv *priv, uint8_t eos_byte,
|
||||
int nec7210_enable_eos(struct gpib_board *board, struct nec7210_priv *priv, u8 eos_byte,
|
||||
int compare_8_bits)
|
||||
{
|
||||
write_byte(priv, eos_byte, EOSR);
|
||||
|
|
@ -44,7 +44,7 @@ void nec7210_disable_eos(struct gpib_board *board, struct nec7210_priv *priv)
|
|||
}
|
||||
EXPORT_SYMBOL(nec7210_disable_eos);
|
||||
|
||||
int nec7210_parallel_poll(struct gpib_board *board, struct nec7210_priv *priv, uint8_t *result)
|
||||
int nec7210_parallel_poll(struct gpib_board *board, struct nec7210_priv *priv, u8 *result)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
|
@ -79,14 +79,15 @@ void nec7210_parallel_poll_response(struct gpib_board *board, struct nec7210_pri
|
|||
write_byte(priv, AUX_CPPF, AUXMR);
|
||||
}
|
||||
EXPORT_SYMBOL(nec7210_parallel_poll_response);
|
||||
/* This is really only adequate for chips that do a 488.2 style reqt/reqf
|
||||
/*
|
||||
* This is really only adequate for chips that do a 488.2 style reqt/reqf
|
||||
* based on bit 6 of the SPMR (see chapter 11.3.3 of 488.2). For simpler chips that simply
|
||||
* set rsv directly based on bit 6, we either need to do more hardware setup to expose
|
||||
* the 488.2 capability (for example with NI chips), or we need to implement the
|
||||
* 488.2 set srv state machine in the driver (if that is even viable).
|
||||
*/
|
||||
void nec7210_serial_poll_response(struct gpib_board *board,
|
||||
struct nec7210_priv *priv, uint8_t status)
|
||||
struct nec7210_priv *priv, u8 status)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
|
|
@ -103,7 +104,7 @@ void nec7210_serial_poll_response(struct gpib_board *board,
|
|||
}
|
||||
EXPORT_SYMBOL(nec7210_serial_poll_response);
|
||||
|
||||
uint8_t nec7210_serial_poll_status(struct gpib_board *board, struct nec7210_priv *priv)
|
||||
u8 nec7210_serial_poll_status(struct gpib_board *board, struct nec7210_priv *priv)
|
||||
{
|
||||
return read_byte(priv, SPSR);
|
||||
}
|
||||
|
|
@ -202,7 +203,8 @@ unsigned int nec7210_update_status_nolock(struct gpib_board *board, struct nec72
|
|||
set_bit(SPOLL_NUM, &board->status);
|
||||
}
|
||||
|
||||
/* we rely on the interrupt handler to set the
|
||||
/*
|
||||
* we rely on the interrupt handler to set the
|
||||
* rest of the status bits
|
||||
*/
|
||||
|
||||
|
|
@ -251,7 +253,7 @@ void nec7210_set_handshake_mode(struct gpib_board *board, struct nec7210_priv *p
|
|||
}
|
||||
EXPORT_SYMBOL(nec7210_set_handshake_mode);
|
||||
|
||||
uint8_t nec7210_read_data_in(struct gpib_board *board, struct nec7210_priv *priv, int *end)
|
||||
u8 nec7210_read_data_in(struct gpib_board *board, struct nec7210_priv *priv, int *end)
|
||||
{
|
||||
unsigned long flags;
|
||||
u8 data;
|
||||
|
|
@ -330,14 +332,15 @@ int nec7210_go_to_standby(struct gpib_board *board, struct nec7210_priv *priv)
|
|||
}
|
||||
EXPORT_SYMBOL(nec7210_go_to_standby);
|
||||
|
||||
void nec7210_request_system_control(struct gpib_board *board, struct nec7210_priv *priv,
|
||||
int request_control)
|
||||
int nec7210_request_system_control(struct gpib_board *board, struct nec7210_priv *priv,
|
||||
int request_control)
|
||||
{
|
||||
if (request_control == 0) {
|
||||
write_byte(priv, AUX_CREN, AUXMR);
|
||||
write_byte(priv, AUX_CIFC, AUXMR);
|
||||
write_byte(priv, AUX_DSC, AUXMR);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(nec7210_request_system_control);
|
||||
|
||||
|
|
@ -415,7 +418,7 @@ static inline short nec7210_atn_has_changed(struct gpib_board *board, struct nec
|
|||
return -1;
|
||||
}
|
||||
|
||||
int nec7210_command(struct gpib_board *board, struct nec7210_priv *priv, uint8_t
|
||||
int nec7210_command(struct gpib_board *board, struct nec7210_priv *priv, u8
|
||||
*buffer, size_t length, size_t *bytes_written)
|
||||
{
|
||||
int retval = 0;
|
||||
|
|
@ -464,7 +467,7 @@ int nec7210_command(struct gpib_board *board, struct nec7210_priv *priv, uint8_t
|
|||
}
|
||||
EXPORT_SYMBOL(nec7210_command);
|
||||
|
||||
static int pio_read(struct gpib_board *board, struct nec7210_priv *priv, uint8_t *buffer,
|
||||
static int pio_read(struct gpib_board *board, struct nec7210_priv *priv, u8 *buffer,
|
||||
size_t length, int *end, size_t *bytes_read)
|
||||
{
|
||||
ssize_t retval = 0;
|
||||
|
|
@ -482,7 +485,8 @@ static int pio_read(struct gpib_board *board, struct nec7210_priv *priv, uint8_t
|
|||
}
|
||||
if (test_bit(READ_READY_BN, &priv->state)) {
|
||||
if (*bytes_read == 0) {
|
||||
/* We set the handshake mode here because we know
|
||||
/*
|
||||
* We set the handshake mode here because we know
|
||||
* no new bytes will arrive (it has already arrived
|
||||
* and is awaiting being read out of the chip) while we are changing
|
||||
* modes. This ensures we can reliably keep track
|
||||
|
|
@ -568,7 +572,7 @@ static ssize_t __dma_read(struct gpib_board *board, struct nec7210_priv *priv, s
|
|||
return retval ? retval : count;
|
||||
}
|
||||
|
||||
static ssize_t dma_read(struct gpib_board *board, struct nec7210_priv *priv, uint8_t *buffer,
|
||||
static ssize_t dma_read(struct gpib_board *board, struct nec7210_priv *priv, u8 *buffer,
|
||||
size_t length)
|
||||
{
|
||||
size_t remain = length;
|
||||
|
|
@ -595,7 +599,7 @@ static ssize_t dma_read(struct gpib_board *board, struct nec7210_priv *priv, uin
|
|||
}
|
||||
#endif
|
||||
|
||||
int nec7210_read(struct gpib_board *board, struct nec7210_priv *priv, uint8_t *buffer,
|
||||
int nec7210_read(struct gpib_board *board, struct nec7210_priv *priv, u8 *buffer,
|
||||
size_t length, int *end, size_t *bytes_read)
|
||||
{
|
||||
ssize_t retval = 0;
|
||||
|
|
@ -642,7 +646,7 @@ static int pio_write_wait(struct gpib_board *board, struct nec7210_priv *priv,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int pio_write(struct gpib_board *board, struct nec7210_priv *priv, uint8_t *buffer,
|
||||
static int pio_write(struct gpib_board *board, struct nec7210_priv *priv, u8 *buffer,
|
||||
size_t length, size_t *bytes_written)
|
||||
{
|
||||
size_t last_count = 0;
|
||||
|
|
@ -662,7 +666,8 @@ static int pio_write(struct gpib_board *board, struct nec7210_priv *priv, uint8_
|
|||
if (retval == -EIO) {
|
||||
/* resend last byte on bus error */
|
||||
*bytes_written = last_count;
|
||||
/* we can get unrecoverable bus errors,
|
||||
/*
|
||||
* we can get unrecoverable bus errors,
|
||||
* so give up after a while
|
||||
*/
|
||||
bus_error_count++;
|
||||
|
|
@ -742,7 +747,7 @@ static ssize_t __dma_write(struct gpib_board *board, struct nec7210_priv *priv,
|
|||
return retval ? retval : length;
|
||||
}
|
||||
|
||||
static ssize_t dma_write(struct gpib_board *board, struct nec7210_priv *priv, uint8_t *buffer,
|
||||
static ssize_t dma_write(struct gpib_board *board, struct nec7210_priv *priv, u8 *buffer,
|
||||
size_t length)
|
||||
{
|
||||
size_t remain = length;
|
||||
|
|
@ -767,7 +772,7 @@ static ssize_t dma_write(struct gpib_board *board, struct nec7210_priv *priv, ui
|
|||
}
|
||||
#endif
|
||||
int nec7210_write(struct gpib_board *board, struct nec7210_priv *priv,
|
||||
uint8_t *buffer, size_t length, int send_eoi,
|
||||
u8 *buffer, size_t length, int send_eoi,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
int retval = 0;
|
||||
|
|
@ -805,7 +810,8 @@ int nec7210_write(struct gpib_board *board, struct nec7210_priv *priv,
|
|||
if (send_eoi) {
|
||||
size_t num_bytes;
|
||||
|
||||
/* We need to wait to make sure we will immediately be able to write the data byte
|
||||
/*
|
||||
* We need to wait to make sure we will immediately be able to write the data byte
|
||||
* into the chip before sending the associated AUX_SEOI command. This is really
|
||||
* only needed for length==1 since otherwise the earlier calls to pio_write
|
||||
* will have dont the wait already.
|
||||
|
|
@ -827,7 +833,7 @@ int nec7210_write(struct gpib_board *board, struct nec7210_priv *priv,
|
|||
EXPORT_SYMBOL(nec7210_write);
|
||||
|
||||
/*
|
||||
* interrupt service routine
|
||||
* interrupt service routine
|
||||
*/
|
||||
irqreturn_t nec7210_interrupt(struct gpib_board *board, struct nec7210_priv *priv)
|
||||
{
|
||||
|
|
@ -932,13 +938,13 @@ irqreturn_t nec7210_interrupt_have_status(struct gpib_board *board,
|
|||
|
||||
// ignore device clear events if we are controller in charge
|
||||
if ((address_status_bits & HR_CIC) == 0) {
|
||||
push_gpib_event(board, EventDevClr);
|
||||
push_gpib_event(board, EVENT_DEV_CLR);
|
||||
set_bit(DEV_CLEAR_BN, &priv->state);
|
||||
}
|
||||
}
|
||||
|
||||
if (status1 & HR_DET)
|
||||
push_gpib_event(board, EventDevTrg);
|
||||
push_gpib_event(board, EVENT_DEV_TRG);
|
||||
|
||||
// Addressing status has changed
|
||||
if (status2 & HR_ADSC)
|
||||
|
|
@ -1012,16 +1018,17 @@ EXPORT_SYMBOL(nec7210_board_online);
|
|||
|
||||
#ifdef CONFIG_HAS_IOPORT
|
||||
/* wrappers for io */
|
||||
uint8_t nec7210_ioport_read_byte(struct nec7210_priv *priv, unsigned int register_num)
|
||||
u8 nec7210_ioport_read_byte(struct nec7210_priv *priv, unsigned int register_num)
|
||||
{
|
||||
return inb(priv->iobase + register_num * priv->offset);
|
||||
}
|
||||
EXPORT_SYMBOL(nec7210_ioport_read_byte);
|
||||
|
||||
void nec7210_ioport_write_byte(struct nec7210_priv *priv, uint8_t data, unsigned int register_num)
|
||||
void nec7210_ioport_write_byte(struct nec7210_priv *priv, u8 data, unsigned int register_num)
|
||||
{
|
||||
if (register_num == AUXMR)
|
||||
/* locking makes absolutely sure noone accesses the
|
||||
/*
|
||||
* locking makes absolutely sure noone accesses the
|
||||
* AUXMR register faster than once per microsecond
|
||||
*/
|
||||
nec7210_locking_ioport_write_byte(priv, data, register_num);
|
||||
|
|
@ -1031,7 +1038,7 @@ void nec7210_ioport_write_byte(struct nec7210_priv *priv, uint8_t data, unsigned
|
|||
EXPORT_SYMBOL(nec7210_ioport_write_byte);
|
||||
|
||||
/* locking variants of io wrappers, for chips that page-in registers */
|
||||
uint8_t nec7210_locking_ioport_read_byte(struct nec7210_priv *priv, unsigned int register_num)
|
||||
u8 nec7210_locking_ioport_read_byte(struct nec7210_priv *priv, unsigned int register_num)
|
||||
{
|
||||
u8 retval;
|
||||
unsigned long flags;
|
||||
|
|
@ -1043,7 +1050,7 @@ uint8_t nec7210_locking_ioport_read_byte(struct nec7210_priv *priv, unsigned int
|
|||
}
|
||||
EXPORT_SYMBOL(nec7210_locking_ioport_read_byte);
|
||||
|
||||
void nec7210_locking_ioport_write_byte(struct nec7210_priv *priv, uint8_t data,
|
||||
void nec7210_locking_ioport_write_byte(struct nec7210_priv *priv, u8 data,
|
||||
unsigned int register_num)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
|
@ -1057,16 +1064,17 @@ void nec7210_locking_ioport_write_byte(struct nec7210_priv *priv, uint8_t data,
|
|||
EXPORT_SYMBOL(nec7210_locking_ioport_write_byte);
|
||||
#endif
|
||||
|
||||
uint8_t nec7210_iomem_read_byte(struct nec7210_priv *priv, unsigned int register_num)
|
||||
u8 nec7210_iomem_read_byte(struct nec7210_priv *priv, unsigned int register_num)
|
||||
{
|
||||
return readb(priv->mmiobase + register_num * priv->offset);
|
||||
}
|
||||
EXPORT_SYMBOL(nec7210_iomem_read_byte);
|
||||
|
||||
void nec7210_iomem_write_byte(struct nec7210_priv *priv, uint8_t data, unsigned int register_num)
|
||||
void nec7210_iomem_write_byte(struct nec7210_priv *priv, u8 data, unsigned int register_num)
|
||||
{
|
||||
if (register_num == AUXMR)
|
||||
/* locking makes absolutely sure noone accesses the
|
||||
/*
|
||||
* locking makes absolutely sure noone accesses the
|
||||
* AUXMR register faster than once per microsecond
|
||||
*/
|
||||
nec7210_locking_iomem_write_byte(priv, data, register_num);
|
||||
|
|
@ -1075,7 +1083,7 @@ void nec7210_iomem_write_byte(struct nec7210_priv *priv, uint8_t data, unsigned
|
|||
}
|
||||
EXPORT_SYMBOL(nec7210_iomem_write_byte);
|
||||
|
||||
uint8_t nec7210_locking_iomem_read_byte(struct nec7210_priv *priv, unsigned int register_num)
|
||||
u8 nec7210_locking_iomem_read_byte(struct nec7210_priv *priv, unsigned int register_num)
|
||||
{
|
||||
u8 retval;
|
||||
unsigned long flags;
|
||||
|
|
@ -1087,7 +1095,7 @@ uint8_t nec7210_locking_iomem_read_byte(struct nec7210_priv *priv, unsigned int
|
|||
}
|
||||
EXPORT_SYMBOL(nec7210_locking_iomem_read_byte);
|
||||
|
||||
void nec7210_locking_iomem_write_byte(struct nec7210_priv *priv, uint8_t data,
|
||||
void nec7210_locking_iomem_write_byte(struct nec7210_priv *priv, u8 data,
|
||||
unsigned int register_num)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
|
|
|||
|
|
@ -74,7 +74,8 @@ static unsigned short ni_usb_timeout_code(unsigned int usec)
|
|||
return 0xff;
|
||||
else if (usec <= 300000000)
|
||||
return 0x01;
|
||||
/* NI driver actually uses 0xff for timeout T1000s, which is a bug in their code.
|
||||
/*
|
||||
* NI driver actually uses 0xff for timeout T1000s, which is a bug in their code.
|
||||
* I've verified on a usb-b that a code of 0x2 is correct for a 1000 sec timeout
|
||||
*/
|
||||
else if (usec <= 1000000000)
|
||||
|
|
@ -232,7 +233,8 @@ static int ni_usb_nonblocking_receive_bulk_msg(struct ni_usb_priv *ni_priv,
|
|||
mutex_unlock(&ni_priv->bulk_transfer_lock);
|
||||
if (interruptible) {
|
||||
if (wait_for_completion_interruptible(&context->complete)) {
|
||||
/* If we got interrupted by a signal while
|
||||
/*
|
||||
* If we got interrupted by a signal while
|
||||
* waiting for the usb gpib to respond, we
|
||||
* should send a stop command so it will
|
||||
* finish up with whatever it was doing and
|
||||
|
|
@ -240,8 +242,9 @@ static int ni_usb_nonblocking_receive_bulk_msg(struct ni_usb_priv *ni_priv,
|
|||
*/
|
||||
ni_usb_stop(ni_priv);
|
||||
retval = -ERESTARTSYS;
|
||||
/* now do an uninterruptible wait, it shouldn't take long
|
||||
* for the board to respond now.
|
||||
/*
|
||||
* now do an uninterruptible wait, it shouldn't take long
|
||||
* for the board to respond now.
|
||||
*/
|
||||
wait_for_completion(&context->complete);
|
||||
}
|
||||
|
|
@ -586,7 +589,7 @@ static int ni_usb_write_registers(struct ni_usb_priv *ni_priv,
|
|||
}
|
||||
|
||||
// interface functions
|
||||
static int ni_usb_read(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int ni_usb_read(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int *end, size_t *bytes_read)
|
||||
{
|
||||
int retval, parse_retval;
|
||||
|
|
@ -684,7 +687,8 @@ static int ni_usb_read(struct gpib_board *board, uint8_t *buffer, size_t length,
|
|||
retval = 0;
|
||||
break;
|
||||
case NIUSB_ABORTED_ERROR:
|
||||
/* this is expected if ni_usb_receive_bulk_msg got
|
||||
/*
|
||||
* this is expected if ni_usb_receive_bulk_msg got
|
||||
* interrupted by a signal and returned -ERESTARTSYS
|
||||
*/
|
||||
break;
|
||||
|
|
@ -716,7 +720,7 @@ static int ni_usb_read(struct gpib_board *board, uint8_t *buffer, size_t length,
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int ni_usb_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int ni_usb_write(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int send_eoi, size_t *bytes_written)
|
||||
{
|
||||
int retval;
|
||||
|
|
@ -794,7 +798,8 @@ static int ni_usb_write(struct gpib_board *board, uint8_t *buffer, size_t length
|
|||
retval = 0;
|
||||
break;
|
||||
case NIUSB_ABORTED_ERROR:
|
||||
/* this is expected if ni_usb_receive_bulk_msg got
|
||||
/*
|
||||
* this is expected if ni_usb_receive_bulk_msg got
|
||||
* interrupted by a signal and returned -ERESTARTSYS
|
||||
*/
|
||||
break;
|
||||
|
|
@ -819,7 +824,7 @@ static int ni_usb_write(struct gpib_board *board, uint8_t *buffer, size_t length
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int ni_usb_command_chunk(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int ni_usb_command_chunk(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
size_t *command_bytes_written)
|
||||
{
|
||||
int retval;
|
||||
|
|
@ -893,7 +898,8 @@ static int ni_usb_command_chunk(struct gpib_board *board, uint8_t *buffer, size_
|
|||
case NIUSB_NO_ERROR:
|
||||
break;
|
||||
case NIUSB_ABORTED_ERROR:
|
||||
/* this is expected if ni_usb_receive_bulk_msg got
|
||||
/*
|
||||
* this is expected if ni_usb_receive_bulk_msg got
|
||||
* interrupted by a signal and returned -ERESTARTSYS
|
||||
*/
|
||||
break;
|
||||
|
|
@ -912,7 +918,7 @@ static int ni_usb_command_chunk(struct gpib_board *board, uint8_t *buffer, size_
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ni_usb_command(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int ni_usb_command(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
size_t count;
|
||||
|
|
@ -1049,7 +1055,7 @@ static int ni_usb_go_to_standby(struct gpib_board *board)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void ni_usb_request_system_control(struct gpib_board *board, int request_control)
|
||||
static int ni_usb_request_system_control(struct gpib_board *board, int request_control)
|
||||
{
|
||||
int retval;
|
||||
struct ni_usb_priv *ni_priv = board->private_data;
|
||||
|
|
@ -1059,7 +1065,7 @@ static void ni_usb_request_system_control(struct gpib_board *board, int request_
|
|||
unsigned int ibsta;
|
||||
|
||||
if (!ni_priv->bus_interface)
|
||||
return; // -ENODEV;
|
||||
return -ENODEV;
|
||||
usb_dev = interface_to_usbdev(ni_priv->bus_interface);
|
||||
if (request_control) {
|
||||
writes[i].device = NIUSB_SUBDEV_TNT4882;
|
||||
|
|
@ -1091,12 +1097,12 @@ static void ni_usb_request_system_control(struct gpib_board *board, int request_
|
|||
retval = ni_usb_write_registers(ni_priv, writes, i, &ibsta);
|
||||
if (retval < 0) {
|
||||
dev_err(&usb_dev->dev, "register write failed, retval=%i\n", retval);
|
||||
return; // retval;
|
||||
return retval;
|
||||
}
|
||||
if (!request_control)
|
||||
ni_priv->ren_state = 0;
|
||||
ni_usb_soft_update_status(board, ibsta, 0);
|
||||
return; // 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
//FIXME maybe the interface should have a "pulse interface clear" function that can return an error?
|
||||
|
|
@ -1176,7 +1182,7 @@ static void ni_usb_remote_enable(struct gpib_board *board, int enable)
|
|||
return;// 0;
|
||||
}
|
||||
|
||||
static int ni_usb_enable_eos(struct gpib_board *board, uint8_t eos_byte, int compare_8_bits)
|
||||
static int ni_usb_enable_eos(struct gpib_board *board, u8 eos_byte, int compare_8_bits)
|
||||
{
|
||||
struct ni_usb_priv *ni_priv = board->private_data;
|
||||
|
||||
|
|
@ -1192,8 +1198,9 @@ static int ni_usb_enable_eos(struct gpib_board *board, uint8_t eos_byte, int com
|
|||
static void ni_usb_disable_eos(struct gpib_board *board)
|
||||
{
|
||||
struct ni_usb_priv *ni_priv = board->private_data;
|
||||
/* adapter gets unhappy if you don't zero all the bits
|
||||
* for the eos mode and eos char (returns error 4 on reads).
|
||||
/*
|
||||
* adapter gets unhappy if you don't zero all the bits
|
||||
* for the eos mode and eos char (returns error 4 on reads).
|
||||
*/
|
||||
ni_priv->eos_mode = 0;
|
||||
ni_priv->eos_char = 0;
|
||||
|
|
@ -1334,7 +1341,7 @@ static int ni_usb_secondary_address(struct gpib_board *board, unsigned int addre
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ni_usb_parallel_poll(struct gpib_board *board, uint8_t *result)
|
||||
static int ni_usb_parallel_poll(struct gpib_board *board, u8 *result)
|
||||
{
|
||||
int retval;
|
||||
struct ni_usb_priv *ni_priv = board->private_data;
|
||||
|
|
@ -1389,7 +1396,7 @@ static int ni_usb_parallel_poll(struct gpib_board *board, uint8_t *result)
|
|||
return retval;
|
||||
}
|
||||
|
||||
static void ni_usb_parallel_poll_configure(struct gpib_board *board, uint8_t config)
|
||||
static void ni_usb_parallel_poll_configure(struct gpib_board *board, u8 config)
|
||||
{
|
||||
int retval;
|
||||
struct ni_usb_priv *ni_priv = board->private_data;
|
||||
|
|
@ -1467,7 +1474,7 @@ static void ni_usb_serial_poll_response(struct gpib_board *board, u8 status)
|
|||
return;// 0;
|
||||
}
|
||||
|
||||
static uint8_t ni_usb_serial_poll_status(struct gpib_board *board)
|
||||
static u8 ni_usb_serial_poll_status(struct gpib_board *board)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -2045,8 +2052,10 @@ static int ni_usb_hs_wait_for_ready(struct ni_usb_priv *ni_priv)
|
|||
unexpected = 1;
|
||||
}
|
||||
++j;
|
||||
// MC usb-488 (and sometimes NI-USB-HS?) sends 0x8 here; MC usb-488A sends 0x7 here
|
||||
// NI-USB-HS+ sends 0x0
|
||||
/*
|
||||
* MC usb-488 (and sometimes NI-USB-HS?) sends 0x8 here; MC usb-488A sends 0x7 here
|
||||
* NI-USB-HS+ sends 0x0
|
||||
*/
|
||||
if (buffer[j] != 0x1 && buffer[j] != 0x8 && buffer[j] != 0x7 && buffer[j] != 0x0) {
|
||||
// [3]
|
||||
dev_err(&usb_dev->dev, "unexpected data: buffer[%i]=0x%x, expected 0x0, 0x1, 0x7 or 0x8\n",
|
||||
|
|
@ -2127,7 +2136,8 @@ ready_out:
|
|||
return retval;
|
||||
}
|
||||
|
||||
/* This does some extra init for HS+ models, as observed on Windows. One of the
|
||||
/*
|
||||
* This does some extra init for HS+ models, as observed on Windows. One of the
|
||||
* control requests causes the LED to stop blinking.
|
||||
* I'm not sure what the other 2 requests do. None of these requests are actually required
|
||||
* for the adapter to work, maybe they do some init for the analyzer interface
|
||||
|
|
@ -2198,14 +2208,14 @@ static int ni_usb_hs_plus_extra_init(struct ni_usb_priv *ni_priv)
|
|||
}
|
||||
|
||||
static inline int ni_usb_device_match(struct usb_interface *interface,
|
||||
const gpib_board_config_t *config)
|
||||
const struct gpib_board_config *config)
|
||||
{
|
||||
if (gpib_match_device_path(&interface->dev, config->device_path) == 0)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int ni_usb_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int ni_usb_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
int retval;
|
||||
int i, index;
|
||||
|
|
@ -2343,8 +2353,10 @@ static void ni_usb_detach(struct gpib_board *board)
|
|||
struct ni_usb_priv *ni_priv;
|
||||
|
||||
mutex_lock(&ni_usb_hotplug_lock);
|
||||
// under windows, software unplug does chip_reset nec7210 aux command,
|
||||
// then writes 0x0 to address 0x10 of device 3
|
||||
/*
|
||||
* under windows, software unplug does chip_reset nec7210 aux command,
|
||||
* then writes 0x0 to address 0x10 of device 3
|
||||
*/
|
||||
ni_priv = board->private_data;
|
||||
if (ni_priv) {
|
||||
if (ni_priv->bus_interface) {
|
||||
|
|
@ -2361,7 +2373,7 @@ static void ni_usb_detach(struct gpib_board *board)
|
|||
mutex_unlock(&ni_usb_hotplug_lock);
|
||||
}
|
||||
|
||||
static gpib_interface_t ni_usb_gpib_interface = {
|
||||
static struct gpib_interface ni_usb_gpib_interface = {
|
||||
.name = "ni_usb_b",
|
||||
.attach = ni_usb_attach,
|
||||
.detach = ni_usb_detach,
|
||||
|
|
|
|||
|
|
@ -113,27 +113,37 @@ enum ni_usb_bulk_ids {
|
|||
|
||||
enum ni_usb_error_codes {
|
||||
NIUSB_NO_ERROR = 0,
|
||||
/* NIUSB_ABORTED_ERROR occurs when I/O is interrupted early by
|
||||
* doing a NI_USB_STOP_REQUEST on the control endpoint.
|
||||
/*
|
||||
* NIUSB_ABORTED_ERROR occurs when I/O is interrupted early by
|
||||
* doing a NI_USB_STOP_REQUEST on the control endpoint.
|
||||
*/
|
||||
NIUSB_ABORTED_ERROR = 1,
|
||||
// NIUSB_READ_ATN_ERROR occurs when you do a board read while
|
||||
// ATN is set
|
||||
/*
|
||||
* NIUSB_READ_ATN_ERROR occurs when you do a board read while
|
||||
* ATN is set
|
||||
*/
|
||||
NIUSB_ATN_STATE_ERROR = 2,
|
||||
// NIUSB_ADDRESSING_ERROR occurs when you do a board
|
||||
// read/write as CIC but are not in LACS/TACS
|
||||
/*
|
||||
* NIUSB_ADDRESSING_ERROR occurs when you do a board
|
||||
* read/write as CIC but are not in LACS/TACS
|
||||
*/
|
||||
NIUSB_ADDRESSING_ERROR = 3,
|
||||
/* NIUSB_EOSMODE_ERROR occurs on reads if any eos mode or char
|
||||
/*
|
||||
* NIUSB_EOSMODE_ERROR occurs on reads if any eos mode or char
|
||||
* bits are set when REOS is not set.
|
||||
* Have also seen error 4 if you try to send more than 16
|
||||
* command bytes at once on a usb-b.
|
||||
*/
|
||||
NIUSB_EOSMODE_ERROR = 4,
|
||||
// NIUSB_NO_BUS_ERROR occurs when you try to write a command
|
||||
// byte but there are no devices connected to the gpib bus
|
||||
/*
|
||||
* NIUSB_NO_BUS_ERROR occurs when you try to write a command
|
||||
* byte but there are no devices connected to the gpib bus
|
||||
*/
|
||||
NIUSB_NO_BUS_ERROR = 5,
|
||||
// NIUSB_NO_LISTENER_ERROR occurs when you do a board write as
|
||||
// CIC with no listener
|
||||
/*
|
||||
* NIUSB_NO_LISTENER_ERROR occurs when you do a board write as
|
||||
* CIC with no listener
|
||||
*/
|
||||
NIUSB_NO_LISTENER_ERROR = 8,
|
||||
// get NIUSB_TIMEOUT_ERROR on board read/write timeout
|
||||
NIUSB_TIMEOUT_ERROR = 10,
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ irqreturn_t pc2a_interrupt(int irq, void *arg)
|
|||
}
|
||||
|
||||
// wrappers for interface functions
|
||||
static int pc2_read(struct gpib_board *board, uint8_t *buffer, size_t length, int *end,
|
||||
static int pc2_read(struct gpib_board *board, u8 *buffer, size_t length, int *end,
|
||||
size_t *bytes_read)
|
||||
{
|
||||
struct pc2_priv *priv = board->private_data;
|
||||
|
|
@ -98,7 +98,7 @@ static int pc2_read(struct gpib_board *board, uint8_t *buffer, size_t length, in
|
|||
return nec7210_read(board, &priv->nec7210_priv, buffer, length, end, bytes_read);
|
||||
}
|
||||
|
||||
static int pc2_write(struct gpib_board *board, uint8_t *buffer, size_t length, int send_eoi,
|
||||
static int pc2_write(struct gpib_board *board, u8 *buffer, size_t length, int send_eoi,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
struct pc2_priv *priv = board->private_data;
|
||||
|
|
@ -106,7 +106,8 @@ static int pc2_write(struct gpib_board *board, uint8_t *buffer, size_t length, i
|
|||
return nec7210_write(board, &priv->nec7210_priv, buffer, length, send_eoi, bytes_written);
|
||||
}
|
||||
|
||||
static int pc2_command(struct gpib_board *board, uint8_t *buffer, size_t length, size_t *bytes_written)
|
||||
static int pc2_command(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, size_t *bytes_written)
|
||||
{
|
||||
struct pc2_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -127,11 +128,11 @@ static int pc2_go_to_standby(struct gpib_board *board)
|
|||
return nec7210_go_to_standby(board, &priv->nec7210_priv);
|
||||
}
|
||||
|
||||
static void pc2_request_system_control(struct gpib_board *board, int request_control)
|
||||
static int pc2_request_system_control(struct gpib_board *board, int request_control)
|
||||
{
|
||||
struct pc2_priv *priv = board->private_data;
|
||||
|
||||
nec7210_request_system_control(board, &priv->nec7210_priv, request_control);
|
||||
return nec7210_request_system_control(board, &priv->nec7210_priv, request_control);
|
||||
}
|
||||
|
||||
static void pc2_interface_clear(struct gpib_board *board, int assert)
|
||||
|
|
@ -148,7 +149,7 @@ static void pc2_remote_enable(struct gpib_board *board, int enable)
|
|||
nec7210_remote_enable(board, &priv->nec7210_priv, enable);
|
||||
}
|
||||
|
||||
static int pc2_enable_eos(struct gpib_board *board, uint8_t eos_byte, int compare_8_bits)
|
||||
static int pc2_enable_eos(struct gpib_board *board, u8 eos_byte, int compare_8_bits)
|
||||
{
|
||||
struct pc2_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -183,14 +184,14 @@ static int pc2_secondary_address(struct gpib_board *board, unsigned int address,
|
|||
return nec7210_secondary_address(board, &priv->nec7210_priv, address, enable);
|
||||
}
|
||||
|
||||
static int pc2_parallel_poll(struct gpib_board *board, uint8_t *result)
|
||||
static int pc2_parallel_poll(struct gpib_board *board, u8 *result)
|
||||
{
|
||||
struct pc2_priv *priv = board->private_data;
|
||||
|
||||
return nec7210_parallel_poll(board, &priv->nec7210_priv, result);
|
||||
}
|
||||
|
||||
static void pc2_parallel_poll_configure(struct gpib_board *board, uint8_t config)
|
||||
static void pc2_parallel_poll_configure(struct gpib_board *board, u8 config)
|
||||
{
|
||||
struct pc2_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -204,14 +205,14 @@ static void pc2_parallel_poll_response(struct gpib_board *board, int ist)
|
|||
nec7210_parallel_poll_response(board, &priv->nec7210_priv, ist);
|
||||
}
|
||||
|
||||
static void pc2_serial_poll_response(struct gpib_board *board, uint8_t status)
|
||||
static void pc2_serial_poll_response(struct gpib_board *board, u8 status)
|
||||
{
|
||||
struct pc2_priv *priv = board->private_data;
|
||||
|
||||
nec7210_serial_poll_response(board, &priv->nec7210_priv, status);
|
||||
}
|
||||
|
||||
static uint8_t pc2_serial_poll_status(struct gpib_board *board)
|
||||
static u8 pc2_serial_poll_status(struct gpib_board *board)
|
||||
{
|
||||
struct pc2_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -251,7 +252,7 @@ static void free_private(struct gpib_board *board)
|
|||
board->private_data = NULL;
|
||||
}
|
||||
|
||||
static int pc2_generic_attach(struct gpib_board *board, const gpib_board_config_t *config,
|
||||
static int pc2_generic_attach(struct gpib_board *board, const struct gpib_board_config *config,
|
||||
enum nec7210_chipset chipset)
|
||||
{
|
||||
struct pc2_priv *pc2_priv;
|
||||
|
|
@ -267,8 +268,9 @@ static int pc2_generic_attach(struct gpib_board *board, const gpib_board_config_
|
|||
nec_priv->type = chipset;
|
||||
|
||||
#ifndef PC2_DMA
|
||||
/* board->dev hasn't been initialized, so forget about DMA until this driver
|
||||
* is adapted to use isa_register_driver.
|
||||
/*
|
||||
* board->dev hasn't been initialized, so forget about DMA until this driver
|
||||
* is adapted to use isa_register_driver.
|
||||
*/
|
||||
if (config->ibdma)
|
||||
// driver needs to be adapted to use isa_register_driver to get a struct device*
|
||||
|
|
@ -294,7 +296,7 @@ static int pc2_generic_attach(struct gpib_board *board, const gpib_board_config_
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int pc2_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int pc2_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
int isr_flags = 0;
|
||||
struct pc2_priv *pc2_priv;
|
||||
|
|
@ -365,7 +367,7 @@ static void pc2_detach(struct gpib_board *board)
|
|||
free_private(board);
|
||||
}
|
||||
|
||||
static int pc2a_common_attach(struct gpib_board *board, const gpib_board_config_t *config,
|
||||
static int pc2a_common_attach(struct gpib_board *board, const struct gpib_board_config *config,
|
||||
unsigned int num_registers, enum nec7210_chipset chipset)
|
||||
{
|
||||
unsigned int i, j;
|
||||
|
|
@ -459,17 +461,17 @@ static int pc2a_common_attach(struct gpib_board *board, const gpib_board_config_
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int pc2a_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int pc2a_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
return pc2a_common_attach(board, config, pc2a_iosize, NEC7210);
|
||||
}
|
||||
|
||||
static int pc2a_cb7210_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int pc2a_cb7210_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
return pc2a_common_attach(board, config, pc2a_iosize, CB7210);
|
||||
}
|
||||
|
||||
static int pc2_2a_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int pc2_2a_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
return pc2a_common_attach(board, config, pc2_2a_iosize, NAT4882);
|
||||
}
|
||||
|
|
@ -517,7 +519,7 @@ static void pc2_2a_detach(struct gpib_board *board)
|
|||
pc2a_common_detach(board, pc2_2a_iosize);
|
||||
}
|
||||
|
||||
static gpib_interface_t pc2_interface = {
|
||||
static struct gpib_interface pc2_interface = {
|
||||
.name = "pcII",
|
||||
.attach = pc2_attach,
|
||||
.detach = pc2_detach,
|
||||
|
|
@ -545,7 +547,7 @@ static gpib_interface_t pc2_interface = {
|
|||
.return_to_local = pc2_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t pc2a_interface = {
|
||||
static struct gpib_interface pc2a_interface = {
|
||||
.name = "pcIIa",
|
||||
.attach = pc2a_attach,
|
||||
.detach = pc2a_detach,
|
||||
|
|
@ -573,7 +575,7 @@ static gpib_interface_t pc2a_interface = {
|
|||
.return_to_local = pc2_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t pc2a_cb7210_interface = {
|
||||
static struct gpib_interface pc2a_cb7210_interface = {
|
||||
.name = "pcIIa_cb7210",
|
||||
.attach = pc2a_cb7210_attach,
|
||||
.detach = pc2a_detach,
|
||||
|
|
@ -601,7 +603,7 @@ static gpib_interface_t pc2a_cb7210_interface = {
|
|||
.return_to_local = pc2_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t pc2_2a_interface = {
|
||||
static struct gpib_interface pc2_2a_interface = {
|
||||
.name = "pcII_IIa",
|
||||
.attach = pc2_2a_attach,
|
||||
.detach = pc2_2a_detach,
|
||||
|
|
|
|||
|
|
@ -53,7 +53,8 @@ int tms9914_take_control(struct gpib_board *board, struct tms9914_priv *priv, in
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(tms9914_take_control);
|
||||
|
||||
/* The agilent 82350B has a buggy implementation of tcs which interferes with the
|
||||
/*
|
||||
* The agilent 82350B has a buggy implementation of tcs which interferes with the
|
||||
* operation of tca. It appears to be based on the controller state machine
|
||||
* described in the TI 9900 TMS9914A data manual published in 1982. This
|
||||
* manual describes tcs as putting the controller into a CWAS
|
||||
|
|
@ -66,7 +67,8 @@ EXPORT_SYMBOL_GPL(tms9914_take_control);
|
|||
* The rest of the tms9914 based drivers still use tms9914_take_control
|
||||
* directly (which does issue tcs).
|
||||
*/
|
||||
int tms9914_take_control_workaround(struct gpib_board *board, struct tms9914_priv *priv, int synchronous)
|
||||
int tms9914_take_control_workaround(struct gpib_board *board,
|
||||
struct tms9914_priv *priv, int synchronous)
|
||||
{
|
||||
if (synchronous)
|
||||
return -ETIMEDOUT;
|
||||
|
|
@ -116,8 +118,8 @@ void tms9914_remote_enable(struct gpib_board *board, struct tms9914_priv *priv,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(tms9914_remote_enable);
|
||||
|
||||
void tms9914_request_system_control(struct gpib_board *board, struct tms9914_priv *priv,
|
||||
int request_control)
|
||||
int tms9914_request_system_control(struct gpib_board *board, struct tms9914_priv *priv,
|
||||
int request_control)
|
||||
{
|
||||
if (request_control) {
|
||||
write_byte(priv, AUX_RQC, AUXCR);
|
||||
|
|
@ -125,6 +127,7 @@ void tms9914_request_system_control(struct gpib_board *board, struct tms9914_pri
|
|||
clear_bit(CIC_NUM, &board->status);
|
||||
write_byte(priv, AUX_RLC, AUXCR);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tms9914_request_system_control);
|
||||
|
||||
|
|
@ -192,7 +195,7 @@ void tms9914_release_holdoff(struct tms9914_priv *priv)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(tms9914_release_holdoff);
|
||||
|
||||
int tms9914_enable_eos(struct gpib_board *board, struct tms9914_priv *priv, uint8_t eos_byte,
|
||||
int tms9914_enable_eos(struct gpib_board *board, struct tms9914_priv *priv, u8 eos_byte,
|
||||
int compare_8_bits)
|
||||
{
|
||||
priv->eos = eos_byte;
|
||||
|
|
@ -209,7 +212,7 @@ void tms9914_disable_eos(struct gpib_board *board, struct tms9914_priv *priv)
|
|||
}
|
||||
EXPORT_SYMBOL(tms9914_disable_eos);
|
||||
|
||||
int tms9914_parallel_poll(struct gpib_board *board, struct tms9914_priv *priv, uint8_t *result)
|
||||
int tms9914_parallel_poll(struct gpib_board *board, struct tms9914_priv *priv, u8 *result)
|
||||
{
|
||||
// execute parallel poll
|
||||
write_byte(priv, AUX_CS | AUX_RPP, AUXCR);
|
||||
|
|
@ -235,7 +238,7 @@ static void set_ppoll_reg(struct tms9914_priv *priv, int enable,
|
|||
}
|
||||
|
||||
void tms9914_parallel_poll_configure(struct gpib_board *board,
|
||||
struct tms9914_priv *priv, uint8_t config)
|
||||
struct tms9914_priv *priv, u8 config)
|
||||
{
|
||||
priv->ppoll_enable = (config & PPC_DISABLE) == 0;
|
||||
priv->ppoll_line = (config & PPC_DIO_MASK) + 1;
|
||||
|
|
@ -251,7 +254,8 @@ void tms9914_parallel_poll_response(struct gpib_board *board,
|
|||
}
|
||||
EXPORT_SYMBOL(tms9914_parallel_poll_response);
|
||||
|
||||
void tms9914_serial_poll_response(struct gpib_board *board, struct tms9914_priv *priv, uint8_t status)
|
||||
void tms9914_serial_poll_response(struct gpib_board *board,
|
||||
struct tms9914_priv *priv, u8 status)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
|
|
@ -266,7 +270,7 @@ void tms9914_serial_poll_response(struct gpib_board *board, struct tms9914_priv
|
|||
}
|
||||
EXPORT_SYMBOL(tms9914_serial_poll_response);
|
||||
|
||||
uint8_t tms9914_serial_poll_status(struct gpib_board *board, struct tms9914_priv *priv)
|
||||
u8 tms9914_serial_poll_status(struct gpib_board *board, struct tms9914_priv *priv)
|
||||
{
|
||||
u8 status;
|
||||
unsigned long flags;
|
||||
|
|
@ -279,7 +283,8 @@ uint8_t tms9914_serial_poll_status(struct gpib_board *board, struct tms9914_priv
|
|||
}
|
||||
EXPORT_SYMBOL(tms9914_serial_poll_status);
|
||||
|
||||
int tms9914_primary_address(struct gpib_board *board, struct tms9914_priv *priv, unsigned int address)
|
||||
int tms9914_primary_address(struct gpib_board *board,
|
||||
struct tms9914_priv *priv, unsigned int address)
|
||||
{
|
||||
// put primary address in address0
|
||||
write_byte(priv, address & ADDRESS_MASK, ADR);
|
||||
|
|
@ -321,7 +326,8 @@ static void update_talker_state(struct tms9914_priv *priv, unsigned int address_
|
|||
if (address_status_bits & HR_ATN)
|
||||
priv->talker_state = talker_addressed;
|
||||
else
|
||||
/* this could also be serial_poll_active, but the tms9914 provides no
|
||||
/*
|
||||
* this could also be serial_poll_active, but the tms9914 provides no
|
||||
* way to distinguish, so we'll assume talker_active
|
||||
*/
|
||||
priv->talker_state = talker_active;
|
||||
|
|
@ -416,7 +422,7 @@ int tms9914_line_status(const struct gpib_board *board, struct tms9914_priv *pri
|
|||
}
|
||||
EXPORT_SYMBOL(tms9914_line_status);
|
||||
|
||||
static int check_for_eos(struct tms9914_priv *priv, uint8_t byte)
|
||||
static int check_for_eos(struct tms9914_priv *priv, u8 byte)
|
||||
{
|
||||
static const u8 seven_bit_compare_mask = 0x7f;
|
||||
|
||||
|
|
@ -449,7 +455,8 @@ static int wait_for_read_byte(struct gpib_board *board, struct tms9914_priv *pri
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline uint8_t tms9914_read_data_in(struct gpib_board *board, struct tms9914_priv *priv, int *end)
|
||||
static inline u8 tms9914_read_data_in(struct gpib_board *board,
|
||||
struct tms9914_priv *priv, int *end)
|
||||
{
|
||||
unsigned long flags;
|
||||
u8 data;
|
||||
|
|
@ -480,7 +487,7 @@ static inline uint8_t tms9914_read_data_in(struct gpib_board *board, struct tms9
|
|||
return data;
|
||||
}
|
||||
|
||||
static int pio_read(struct gpib_board *board, struct tms9914_priv *priv, uint8_t *buffer,
|
||||
static int pio_read(struct gpib_board *board, struct tms9914_priv *priv, u8 *buffer,
|
||||
size_t length, int *end, size_t *bytes_read)
|
||||
{
|
||||
ssize_t retval = 0;
|
||||
|
|
@ -501,7 +508,7 @@ static int pio_read(struct gpib_board *board, struct tms9914_priv *priv, uint8_t
|
|||
return retval;
|
||||
}
|
||||
|
||||
int tms9914_read(struct gpib_board *board, struct tms9914_priv *priv, uint8_t *buffer,
|
||||
int tms9914_read(struct gpib_board *board, struct tms9914_priv *priv, u8 *buffer,
|
||||
size_t length, int *end, size_t *bytes_read)
|
||||
{
|
||||
ssize_t retval = 0;
|
||||
|
|
@ -561,7 +568,7 @@ static int pio_write_wait(struct gpib_board *board, struct tms9914_priv *priv)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int pio_write(struct gpib_board *board, struct tms9914_priv *priv, uint8_t *buffer,
|
||||
static int pio_write(struct gpib_board *board, struct tms9914_priv *priv, u8 *buffer,
|
||||
size_t length, size_t *bytes_written)
|
||||
{
|
||||
ssize_t retval = 0;
|
||||
|
|
@ -585,8 +592,8 @@ static int pio_write(struct gpib_board *board, struct tms9914_priv *priv, uint8_
|
|||
return length;
|
||||
}
|
||||
|
||||
int tms9914_write(struct gpib_board *board, struct tms9914_priv *priv, uint8_t *buffer, size_t length,
|
||||
int send_eoi, size_t *bytes_written)
|
||||
int tms9914_write(struct gpib_board *board, struct tms9914_priv *priv,
|
||||
u8 *buffer, size_t length, int send_eoi, size_t *bytes_written)
|
||||
{
|
||||
ssize_t retval = 0;
|
||||
|
||||
|
|
@ -620,7 +627,8 @@ int tms9914_write(struct gpib_board *board, struct tms9914_priv *priv, uint8_t *
|
|||
}
|
||||
EXPORT_SYMBOL(tms9914_write);
|
||||
|
||||
static void check_my_address_state(struct gpib_board *board, struct tms9914_priv *priv, int cmd_byte)
|
||||
static void check_my_address_state(struct gpib_board *board,
|
||||
struct tms9914_priv *priv, int cmd_byte)
|
||||
{
|
||||
if (cmd_byte == MLA(board->pad)) {
|
||||
priv->primary_listen_addressed = 1;
|
||||
|
|
@ -655,7 +663,7 @@ static void check_my_address_state(struct gpib_board *board, struct tms9914_priv
|
|||
}
|
||||
}
|
||||
|
||||
int tms9914_command(struct gpib_board *board, struct tms9914_priv *priv, uint8_t *buffer,
|
||||
int tms9914_command(struct gpib_board *board, struct tms9914_priv *priv, u8 *buffer,
|
||||
size_t length, size_t *bytes_written)
|
||||
{
|
||||
int retval = 0;
|
||||
|
|
@ -736,9 +744,10 @@ irqreturn_t tms9914_interrupt_have_status(struct gpib_board *board, struct tms99
|
|||
unsigned short command_byte = read_byte(priv, CPTR) & gpib_command_mask;
|
||||
|
||||
switch (command_byte) {
|
||||
case PPConfig:
|
||||
case PP_CONFIG:
|
||||
priv->ppoll_configure_state = 1;
|
||||
/* AUX_PTS generates another UNC interrupt on the next command byte
|
||||
/*
|
||||
* AUX_PTS generates another UNC interrupt on the next command byte
|
||||
* if it is in the secondary address group (such as PPE and PPD).
|
||||
*/
|
||||
write_byte(priv, AUX_PTS, AUXCR);
|
||||
|
|
@ -764,7 +773,7 @@ irqreturn_t tms9914_interrupt_have_status(struct gpib_board *board, struct tms99
|
|||
break;
|
||||
}
|
||||
|
||||
if (in_primary_command_group(command_byte) && command_byte != PPConfig)
|
||||
if (in_primary_command_group(command_byte) && command_byte != PP_CONFIG)
|
||||
priv->ppoll_configure_state = 0;
|
||||
}
|
||||
|
||||
|
|
@ -774,18 +783,18 @@ irqreturn_t tms9914_interrupt_have_status(struct gpib_board *board, struct tms99
|
|||
}
|
||||
|
||||
if (status1 & HR_IFC) {
|
||||
push_gpib_event(board, EventIFC);
|
||||
push_gpib_event(board, EVENT_IFC);
|
||||
clear_bit(CIC_NUM, &board->status);
|
||||
}
|
||||
|
||||
if (status1 & HR_GET) {
|
||||
push_gpib_event(board, EventDevTrg);
|
||||
push_gpib_event(board, EVENT_DEV_TRG);
|
||||
// clear dac holdoff
|
||||
write_byte(priv, AUX_VAL, AUXCR);
|
||||
}
|
||||
|
||||
if (status1 & HR_DCAS) {
|
||||
push_gpib_event(board, EventDevClr);
|
||||
push_gpib_event(board, EVENT_DEV_CLR);
|
||||
// clear dac holdoff
|
||||
write_byte(priv, AUX_VAL, AUXCR);
|
||||
set_bit(DEV_CLEAR_BN, &priv->state);
|
||||
|
|
@ -859,14 +868,14 @@ EXPORT_SYMBOL_GPL(tms9914_online);
|
|||
|
||||
#ifdef CONFIG_HAS_IOPORT
|
||||
// wrapper for inb
|
||||
uint8_t tms9914_ioport_read_byte(struct tms9914_priv *priv, unsigned int register_num)
|
||||
u8 tms9914_ioport_read_byte(struct tms9914_priv *priv, unsigned int register_num)
|
||||
{
|
||||
return inb(priv->iobase + register_num * priv->offset);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tms9914_ioport_read_byte);
|
||||
|
||||
// wrapper for outb
|
||||
void tms9914_ioport_write_byte(struct tms9914_priv *priv, uint8_t data, unsigned int register_num)
|
||||
void tms9914_ioport_write_byte(struct tms9914_priv *priv, u8 data, unsigned int register_num)
|
||||
{
|
||||
outb(data, priv->iobase + register_num * priv->offset);
|
||||
if (register_num == AUXCR)
|
||||
|
|
@ -876,14 +885,14 @@ EXPORT_SYMBOL_GPL(tms9914_ioport_write_byte);
|
|||
#endif
|
||||
|
||||
// wrapper for readb
|
||||
uint8_t tms9914_iomem_read_byte(struct tms9914_priv *priv, unsigned int register_num)
|
||||
u8 tms9914_iomem_read_byte(struct tms9914_priv *priv, unsigned int register_num)
|
||||
{
|
||||
return readb(priv->mmiobase + register_num * priv->offset);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tms9914_iomem_read_byte);
|
||||
|
||||
// wrapper for writeb
|
||||
void tms9914_iomem_write_byte(struct tms9914_priv *priv, uint8_t data, unsigned int register_num)
|
||||
void tms9914_iomem_write_byte(struct tms9914_priv *priv, u8 data, unsigned int register_num)
|
||||
{
|
||||
writeb(data, priv->mmiobase + register_num * priv->offset);
|
||||
if (register_num == AUXCR)
|
||||
|
|
|
|||
|
|
@ -236,7 +236,7 @@ static int fifo_xfer_done(struct tnt4882_priv *tnt_priv)
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int drain_fifo_words(struct tnt4882_priv *tnt_priv, uint8_t *buffer, int num_bytes)
|
||||
static int drain_fifo_words(struct tnt4882_priv *tnt_priv, u8 *buffer, int num_bytes)
|
||||
{
|
||||
int count = 0;
|
||||
struct nec7210_priv *nec_priv = &tnt_priv->nec7210_priv;
|
||||
|
|
@ -258,7 +258,8 @@ static void tnt4882_release_holdoff(struct gpib_board *board, struct tnt4882_pri
|
|||
|
||||
sasr_bits = tnt_readb(tnt_priv, SASR);
|
||||
|
||||
/*tnt4882 not in one-chip mode won't always release holdoff unless we
|
||||
/*
|
||||
* tnt4882 not in one-chip mode won't always release holdoff unless we
|
||||
* are in the right mode when release handshake command is given
|
||||
*/
|
||||
if (sasr_bits & AEHS_BIT) /* holding off due to holdoff on end mode*/ {
|
||||
|
|
@ -274,7 +275,7 @@ static void tnt4882_release_holdoff(struct gpib_board *board, struct tnt4882_pri
|
|||
}
|
||||
}
|
||||
|
||||
static int tnt4882_accel_read(struct gpib_board *board, uint8_t *buffer, size_t length, int *end,
|
||||
static int tnt4882_accel_read(struct gpib_board *board, u8 *buffer, size_t length, int *end,
|
||||
size_t *bytes_read)
|
||||
{
|
||||
size_t count = 0;
|
||||
|
|
@ -384,7 +385,8 @@ static int tnt4882_accel_read(struct gpib_board *board, uint8_t *buffer, size_t
|
|||
|
||||
nec7210_set_reg_bits(nec_priv, IMR1, HR_ENDIE, 0);
|
||||
nec7210_set_reg_bits(nec_priv, IMR2, HR_DMAI, 0);
|
||||
/* force handling of any pending interrupts (seems to be needed
|
||||
/*
|
||||
* force handling of any pending interrupts (seems to be needed
|
||||
* to keep interrupts from getting hosed, plus for syncing
|
||||
* with RECEIVED_END below)
|
||||
*/
|
||||
|
|
@ -448,7 +450,7 @@ static int write_wait(struct gpib_board *board, struct tnt4882_priv *tnt_priv,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int generic_write(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int generic_write(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
int send_eoi, int send_commands, size_t *bytes_written)
|
||||
{
|
||||
size_t count = 0;
|
||||
|
|
@ -531,7 +533,8 @@ static int generic_write(struct gpib_board *board, uint8_t *buffer, size_t lengt
|
|||
|
||||
nec7210_set_reg_bits(nec_priv, IMR1, HR_ERR, 0x0);
|
||||
nec7210_set_reg_bits(nec_priv, IMR2, HR_DMAO, 0x0);
|
||||
/* force handling of any interrupts that happened
|
||||
/*
|
||||
* force handling of any interrupts that happened
|
||||
* while they were masked (this appears to be needed)
|
||||
*/
|
||||
tnt4882_internal_interrupt(board);
|
||||
|
|
@ -539,13 +542,13 @@ static int generic_write(struct gpib_board *board, uint8_t *buffer, size_t lengt
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int tnt4882_accel_write(struct gpib_board *board, uint8_t *buffer, size_t length, int send_eoi,
|
||||
size_t *bytes_written)
|
||||
static int tnt4882_accel_write(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, int send_eoi, size_t *bytes_written)
|
||||
{
|
||||
return generic_write(board, buffer, length, send_eoi, 0, bytes_written);
|
||||
}
|
||||
|
||||
static int tnt4882_command(struct gpib_board *board, uint8_t *buffer, size_t length,
|
||||
static int tnt4882_command(struct gpib_board *board, u8 *buffer, size_t length,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
return generic_write(board, buffer, length, 0, 1, bytes_written);
|
||||
|
|
@ -566,7 +569,7 @@ static irqreturn_t tnt4882_internal_interrupt(struct gpib_board *board)
|
|||
imr3_bits = priv->imr3_bits;
|
||||
|
||||
if (isr0_bits & TNT_IFCI_BIT)
|
||||
push_gpib_event(board, EventIFC);
|
||||
push_gpib_event(board, EVENT_IFC);
|
||||
//XXX don't need this wakeup, one below should do?
|
||||
// wake_up_interruptible(&board->wait);
|
||||
|
||||
|
|
@ -592,7 +595,7 @@ static irqreturn_t tnt4882_interrupt(int irq, void *arg)
|
|||
}
|
||||
|
||||
// wrappers for interface functions
|
||||
static int tnt4882_read(struct gpib_board *board, uint8_t *buffer, size_t length, int *end,
|
||||
static int tnt4882_read(struct gpib_board *board, u8 *buffer, size_t length, int *end,
|
||||
size_t *bytes_read)
|
||||
{
|
||||
struct tnt4882_priv *priv = board->private_data;
|
||||
|
|
@ -612,7 +615,7 @@ static int tnt4882_read(struct gpib_board *board, uint8_t *buffer, size_t length
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int tnt4882_write(struct gpib_board *board, uint8_t *buffer, size_t length, int send_eoi,
|
||||
static int tnt4882_write(struct gpib_board *board, u8 *buffer, size_t length, int send_eoi,
|
||||
size_t *bytes_written)
|
||||
{
|
||||
struct tnt4882_priv *priv = board->private_data;
|
||||
|
|
@ -620,7 +623,7 @@ static int tnt4882_write(struct gpib_board *board, uint8_t *buffer, size_t lengt
|
|||
return nec7210_write(board, &priv->nec7210_priv, buffer, length, send_eoi, bytes_written);
|
||||
}
|
||||
|
||||
static int tnt4882_command_unaccel(struct gpib_board *board, uint8_t *buffer,
|
||||
static int tnt4882_command_unaccel(struct gpib_board *board, u8 *buffer,
|
||||
size_t length, size_t *bytes_written)
|
||||
{
|
||||
struct tnt4882_priv *priv = board->private_data;
|
||||
|
|
@ -642,19 +645,21 @@ static int tnt4882_go_to_standby(struct gpib_board *board)
|
|||
return nec7210_go_to_standby(board, &priv->nec7210_priv);
|
||||
}
|
||||
|
||||
static void tnt4882_request_system_control(struct gpib_board *board, int request_control)
|
||||
static int tnt4882_request_system_control(struct gpib_board *board, int request_control)
|
||||
{
|
||||
struct tnt4882_priv *priv = board->private_data;
|
||||
int retval;
|
||||
|
||||
if (request_control) {
|
||||
tnt_writeb(priv, SETSC, CMDR);
|
||||
udelay(1);
|
||||
}
|
||||
nec7210_request_system_control(board, &priv->nec7210_priv, request_control);
|
||||
retval = nec7210_request_system_control(board, &priv->nec7210_priv, request_control);
|
||||
if (!request_control) {
|
||||
tnt_writeb(priv, CLRSC, CMDR);
|
||||
udelay(1);
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void tnt4882_interface_clear(struct gpib_board *board, int assert)
|
||||
|
|
@ -671,7 +676,7 @@ static void tnt4882_remote_enable(struct gpib_board *board, int enable)
|
|||
nec7210_remote_enable(board, &priv->nec7210_priv, enable);
|
||||
}
|
||||
|
||||
static int tnt4882_enable_eos(struct gpib_board *board, uint8_t eos_byte, int compare_8_bits)
|
||||
static int tnt4882_enable_eos(struct gpib_board *board, u8 eos_byte, int compare_8_bits)
|
||||
{
|
||||
struct tnt4882_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -718,7 +723,7 @@ static int tnt4882_secondary_address(struct gpib_board *board, unsigned int addr
|
|||
return nec7210_secondary_address(board, &priv->nec7210_priv, address, enable);
|
||||
}
|
||||
|
||||
static int tnt4882_parallel_poll(struct gpib_board *board, uint8_t *result)
|
||||
static int tnt4882_parallel_poll(struct gpib_board *board, u8 *result)
|
||||
{
|
||||
struct tnt4882_priv *tnt_priv = board->private_data;
|
||||
|
||||
|
|
@ -735,7 +740,7 @@ static int tnt4882_parallel_poll(struct gpib_board *board, uint8_t *result)
|
|||
}
|
||||
}
|
||||
|
||||
static void tnt4882_parallel_poll_configure(struct gpib_board *board, uint8_t config)
|
||||
static void tnt4882_parallel_poll_configure(struct gpib_board *board, u8 config)
|
||||
{
|
||||
struct tnt4882_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -760,17 +765,18 @@ static void tnt4882_parallel_poll_response(struct gpib_board *board, int ist)
|
|||
nec7210_parallel_poll_response(board, &priv->nec7210_priv, ist);
|
||||
}
|
||||
|
||||
/* this is just used by the old nec7210 isa interfaces, the newer
|
||||
/*
|
||||
* this is just used by the old nec7210 isa interfaces, the newer
|
||||
* boards use tnt4882_serial_poll_response2
|
||||
*/
|
||||
static void tnt4882_serial_poll_response(struct gpib_board *board, uint8_t status)
|
||||
static void tnt4882_serial_poll_response(struct gpib_board *board, u8 status)
|
||||
{
|
||||
struct tnt4882_priv *priv = board->private_data;
|
||||
|
||||
nec7210_serial_poll_response(board, &priv->nec7210_priv, status);
|
||||
}
|
||||
|
||||
static void tnt4882_serial_poll_response2(struct gpib_board *board, uint8_t status,
|
||||
static void tnt4882_serial_poll_response2(struct gpib_board *board, u8 status,
|
||||
int new_reason_for_service)
|
||||
{
|
||||
struct tnt4882_priv *priv = board->private_data;
|
||||
|
|
@ -788,7 +794,8 @@ static void tnt4882_serial_poll_response2(struct gpib_board *board, uint8_t stat
|
|||
priv->nec7210_priv.srq_pending = 0;
|
||||
}
|
||||
if (reqt)
|
||||
/* It may seem like a race to issue reqt before updating
|
||||
/*
|
||||
* It may seem like a race to issue reqt before updating
|
||||
* the status byte, but it is not. The chip does not
|
||||
* issue the reqt until the SPMR is written to at
|
||||
* a later time.
|
||||
|
|
@ -796,7 +803,8 @@ static void tnt4882_serial_poll_response2(struct gpib_board *board, uint8_t stat
|
|||
write_byte(&priv->nec7210_priv, AUX_REQT, AUXMR);
|
||||
else if (reqf)
|
||||
write_byte(&priv->nec7210_priv, AUX_REQF, AUXMR);
|
||||
/* We need to always zero bit 6 of the status byte before writing it to
|
||||
/*
|
||||
* We need to always zero bit 6 of the status byte before writing it to
|
||||
* the SPMR to insure we are using
|
||||
* serial poll mode SP1, and not accidentally triggering mode SP3.
|
||||
*/
|
||||
|
|
@ -804,7 +812,7 @@ static void tnt4882_serial_poll_response2(struct gpib_board *board, uint8_t stat
|
|||
spin_unlock_irqrestore(&board->spinlock, flags);
|
||||
}
|
||||
|
||||
static uint8_t tnt4882_serial_poll_status(struct gpib_board *board)
|
||||
static u8 tnt4882_serial_poll_status(struct gpib_board *board)
|
||||
{
|
||||
struct tnt4882_priv *priv = board->private_data;
|
||||
|
||||
|
|
@ -898,7 +906,7 @@ static void tnt4882_init(struct tnt4882_priv *tnt_priv, const struct gpib_board
|
|||
tnt_writeb(tnt_priv, tnt_priv->imr0_bits, IMR0);
|
||||
}
|
||||
|
||||
static int ni_pci_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int ni_pci_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
struct tnt4882_priv *tnt_priv;
|
||||
struct nec7210_priv *nec_priv;
|
||||
|
|
@ -1019,7 +1027,7 @@ static int ni_isapnp_find(struct pnp_dev **dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ni_isa_attach_common(struct gpib_board *board, const gpib_board_config_t *config,
|
||||
static int ni_isa_attach_common(struct gpib_board *board, const struct gpib_board_config *config,
|
||||
enum nec7210_chipset chipset)
|
||||
{
|
||||
struct tnt4882_priv *tnt_priv;
|
||||
|
|
@ -1075,17 +1083,17 @@ static int ni_isa_attach_common(struct gpib_board *board, const gpib_board_confi
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ni_tnt_isa_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int ni_tnt_isa_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
return ni_isa_attach_common(board, config, TNT4882);
|
||||
}
|
||||
|
||||
static int ni_nat4882_isa_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int ni_nat4882_isa_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
return ni_isa_attach_common(board, config, NAT4882);
|
||||
}
|
||||
|
||||
static int ni_nec_isa_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int ni_nec_isa_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
return ni_isa_attach_common(board, config, NEC7210);
|
||||
}
|
||||
|
|
@ -1116,7 +1124,7 @@ static int tnt4882_pci_probe(struct pci_dev *dev, const struct pci_device_id *id
|
|||
return 0;
|
||||
}
|
||||
|
||||
static gpib_interface_t ni_pci_interface = {
|
||||
static struct gpib_interface ni_pci_interface = {
|
||||
.name = "ni_pci",
|
||||
.attach = ni_pci_attach,
|
||||
.detach = ni_pci_detach,
|
||||
|
|
@ -1144,7 +1152,7 @@ static gpib_interface_t ni_pci_interface = {
|
|||
.return_to_local = tnt4882_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t ni_pci_accel_interface = {
|
||||
static struct gpib_interface ni_pci_accel_interface = {
|
||||
.name = "ni_pci_accel",
|
||||
.attach = ni_pci_attach,
|
||||
.detach = ni_pci_detach,
|
||||
|
|
@ -1172,7 +1180,7 @@ static gpib_interface_t ni_pci_accel_interface = {
|
|||
.return_to_local = tnt4882_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t ni_isa_interface = {
|
||||
static struct gpib_interface ni_isa_interface = {
|
||||
.name = "ni_isa",
|
||||
.attach = ni_tnt_isa_attach,
|
||||
.detach = ni_isa_detach,
|
||||
|
|
@ -1200,7 +1208,7 @@ static gpib_interface_t ni_isa_interface = {
|
|||
.return_to_local = tnt4882_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t ni_nat4882_isa_interface = {
|
||||
static struct gpib_interface ni_nat4882_isa_interface = {
|
||||
.name = "ni_nat4882_isa",
|
||||
.attach = ni_nat4882_isa_attach,
|
||||
.detach = ni_isa_detach,
|
||||
|
|
@ -1228,7 +1236,7 @@ static gpib_interface_t ni_nat4882_isa_interface = {
|
|||
.return_to_local = tnt4882_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t ni_nec_isa_interface = {
|
||||
static struct gpib_interface ni_nec_isa_interface = {
|
||||
.name = "ni_nec_isa",
|
||||
.attach = ni_nec_isa_attach,
|
||||
.detach = ni_isa_detach,
|
||||
|
|
@ -1256,7 +1264,7 @@ static gpib_interface_t ni_nec_isa_interface = {
|
|||
.return_to_local = tnt4882_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t ni_isa_accel_interface = {
|
||||
static struct gpib_interface ni_isa_accel_interface = {
|
||||
.name = "ni_isa_accel",
|
||||
.attach = ni_tnt_isa_attach,
|
||||
.detach = ni_isa_detach,
|
||||
|
|
@ -1284,7 +1292,7 @@ static gpib_interface_t ni_isa_accel_interface = {
|
|||
.return_to_local = tnt4882_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t ni_nat4882_isa_accel_interface = {
|
||||
static struct gpib_interface ni_nat4882_isa_accel_interface = {
|
||||
.name = "ni_nat4882_isa_accel",
|
||||
.attach = ni_nat4882_isa_attach,
|
||||
.detach = ni_isa_detach,
|
||||
|
|
@ -1312,7 +1320,7 @@ static gpib_interface_t ni_nat4882_isa_accel_interface = {
|
|||
.return_to_local = tnt4882_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t ni_nec_isa_accel_interface = {
|
||||
static struct gpib_interface ni_nec_isa_accel_interface = {
|
||||
.name = "ni_nec_isa_accel",
|
||||
.attach = ni_nec_isa_attach,
|
||||
.detach = ni_isa_detach,
|
||||
|
|
@ -1371,8 +1379,8 @@ MODULE_DEVICE_TABLE(pnp, tnt4882_pnp_table);
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_GPIB_PCMCIA
|
||||
static gpib_interface_t ni_pcmcia_interface;
|
||||
static gpib_interface_t ni_pcmcia_accel_interface;
|
||||
static struct gpib_interface ni_pcmcia_interface;
|
||||
static struct gpib_interface ni_pcmcia_accel_interface;
|
||||
static int __init init_ni_gpib_cs(void);
|
||||
static void __exit exit_ni_gpib_cs(void);
|
||||
#endif
|
||||
|
|
@ -1581,10 +1589,10 @@ static int ni_gpib_probe(struct pcmcia_device *link)
|
|||
}
|
||||
|
||||
/*
|
||||
* This deletes a driver "instance". The device is de-registered
|
||||
* with Card Services. If it has been released, all local data
|
||||
* structures are freed. Otherwise, the structures will be freed
|
||||
* when the device is released.
|
||||
* This deletes a driver "instance". The device is de-registered
|
||||
* with Card Services. If it has been released, all local data
|
||||
* structures are freed. Otherwise, the structures will be freed
|
||||
* when the device is released.
|
||||
*/
|
||||
static void ni_gpib_remove(struct pcmcia_device *link)
|
||||
{
|
||||
|
|
@ -1611,9 +1619,9 @@ static int ni_gpib_config_iteration(struct pcmcia_device *link, void *priv_data)
|
|||
}
|
||||
|
||||
/*
|
||||
* ni_gpib_config() is scheduled to run after a CARD_INSERTION event
|
||||
* is received, to configure the PCMCIA socket, and to make the
|
||||
* device available to the system.
|
||||
* ni_gpib_config() is scheduled to run after a CARD_INSERTION event
|
||||
* is received, to configure the PCMCIA socket, and to make the
|
||||
* device available to the system.
|
||||
*/
|
||||
static int ni_gpib_config(struct pcmcia_device *link)
|
||||
{
|
||||
|
|
@ -1702,7 +1710,7 @@ static void __exit exit_ni_gpib_cs(void)
|
|||
|
||||
static const int pcmcia_gpib_iosize = 32;
|
||||
|
||||
static int ni_pcmcia_attach(struct gpib_board *board, const gpib_board_config_t *config)
|
||||
static int ni_pcmcia_attach(struct gpib_board *board, const struct gpib_board_config *config)
|
||||
{
|
||||
struct local_info_t *info;
|
||||
struct tnt4882_priv *tnt_priv;
|
||||
|
|
@ -1769,7 +1777,7 @@ static void ni_pcmcia_detach(struct gpib_board *board)
|
|||
tnt4882_free_private(board);
|
||||
}
|
||||
|
||||
static gpib_interface_t ni_pcmcia_interface = {
|
||||
static struct gpib_interface ni_pcmcia_interface = {
|
||||
.name = "ni_pcmcia",
|
||||
.attach = ni_pcmcia_attach,
|
||||
.detach = ni_pcmcia_detach,
|
||||
|
|
@ -1797,7 +1805,7 @@ static gpib_interface_t ni_pcmcia_interface = {
|
|||
.return_to_local = tnt4882_return_to_local,
|
||||
};
|
||||
|
||||
static gpib_interface_t ni_pcmcia_accel_interface = {
|
||||
static struct gpib_interface ni_pcmcia_accel_interface = {
|
||||
.name = "ni_pcmcia_accel",
|
||||
.attach = ni_pcmcia_attach,
|
||||
.detach = ni_pcmcia_detach,
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@
|
|||
* copyright : (C) 2002 by Frank Mori Hess
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef _GPIB_USER_H
|
||||
#define _GPIB_USER_H
|
||||
#ifndef _GPIB_H
|
||||
#define _GPIB_H
|
||||
|
||||
#define GPIB_MAX_NUM_BOARDS 16
|
||||
#define GPIB_MAX_NUM_DESCRIPTORS 0x1000
|
||||
|
|
@ -53,48 +53,6 @@ enum ibsta_bits {
|
|||
EVENT | LOK | REM | CIC | ATN | TACS | LACS | DTAS | DCAS | SRQI,
|
||||
};
|
||||
|
||||
/* IBERR error codes */
|
||||
enum iberr_code {
|
||||
EDVR = 0, /* system error */
|
||||
ECIC = 1, /* not CIC */
|
||||
ENOL = 2, /* no listeners */
|
||||
EADR = 3, /* CIC and not addressed before I/O */
|
||||
EARG = 4, /* bad argument to function call */
|
||||
ESAC = 5, /* not SAC */
|
||||
EABO = 6, /* I/O operation was aborted */
|
||||
ENEB = 7, /* non-existent board (GPIB interface offline) */
|
||||
EDMA = 8, /* DMA hardware error detected */
|
||||
EOIP = 10, /* new I/O attempted with old I/O in progress */
|
||||
ECAP = 11, /* no capability for intended opeation */
|
||||
EFSO = 12, /* file system operation error */
|
||||
EBUS = 14, /* bus error */
|
||||
ESTB = 15, /* lost serial poll bytes */
|
||||
ESRQ = 16, /* SRQ stuck on */
|
||||
ETAB = 20 /* Table Overflow */
|
||||
};
|
||||
|
||||
/* Timeout values and meanings */
|
||||
enum gpib_timeout {
|
||||
TNONE = 0, /* Infinite timeout (disabled) */
|
||||
T10us = 1, /* Timeout of 10 usec (ideal) */
|
||||
T30us = 2, /* Timeout of 30 usec (ideal) */
|
||||
T100us = 3, /* Timeout of 100 usec (ideal) */
|
||||
T300us = 4, /* Timeout of 300 usec (ideal) */
|
||||
T1ms = 5, /* Timeout of 1 msec (ideal) */
|
||||
T3ms = 6, /* Timeout of 3 msec (ideal) */
|
||||
T10ms = 7, /* Timeout of 10 msec (ideal) */
|
||||
T30ms = 8, /* Timeout of 30 msec (ideal) */
|
||||
T100ms = 9, /* Timeout of 100 msec (ideal) */
|
||||
T300ms = 10, /* Timeout of 300 msec (ideal) */
|
||||
T1s = 11, /* Timeout of 1 sec (ideal) */
|
||||
T3s = 12, /* Timeout of 3 sec (ideal) */
|
||||
T10s = 13, /* Timeout of 10 sec (ideal) */
|
||||
T30s = 14, /* Timeout of 30 sec (ideal) */
|
||||
T100s = 15, /* Timeout of 100 sec (ideal) */
|
||||
T300s = 16, /* Timeout of 300 sec (ideal) */
|
||||
T1000s = 17 /* Timeout of 1000 sec (maximum) */
|
||||
};
|
||||
|
||||
/* End-of-string (EOS) modes for use with ibeos */
|
||||
|
||||
enum eos_flags {
|
||||
|
|
@ -130,9 +88,9 @@ enum bus_control_line {
|
|||
enum cmd_byte {
|
||||
GTL = 0x1, /* go to local */
|
||||
SDC = 0x4, /* selected device clear */
|
||||
PPConfig = 0x5,
|
||||
PP_CONFIG = 0x5,
|
||||
#ifndef PPC
|
||||
PPC = PPConfig, /* parallel poll configure */
|
||||
PPC = PP_CONFIG, /* parallel poll configure */
|
||||
#endif
|
||||
GET = 0x8, /* group execute trigger */
|
||||
TCT = 0x9, /* take control */
|
||||
|
|
@ -166,24 +124,24 @@ static inline unsigned int gpib_address_restrict(unsigned int addr)
|
|||
return addr;
|
||||
}
|
||||
|
||||
static inline uint8_t MLA(unsigned int addr)
|
||||
static inline __u8 MLA(unsigned int addr)
|
||||
{
|
||||
return gpib_address_restrict(addr) | LAD;
|
||||
}
|
||||
|
||||
static inline uint8_t MTA(unsigned int addr)
|
||||
static inline __u8 MTA(unsigned int addr)
|
||||
{
|
||||
return gpib_address_restrict(addr) | TAD;
|
||||
}
|
||||
|
||||
static inline uint8_t MSA(unsigned int addr)
|
||||
static inline __u8 MSA(unsigned int addr)
|
||||
{
|
||||
return gpib_address_restrict(addr) | SAD;
|
||||
return (addr & 0x1f) | SAD;
|
||||
}
|
||||
|
||||
static inline uint8_t PPE_byte(unsigned int dio_line, int sense)
|
||||
static inline __u8 PPE_byte(unsigned int dio_line, int sense)
|
||||
{
|
||||
uint8_t cmd;
|
||||
__u8 cmd;
|
||||
|
||||
cmd = PPE;
|
||||
if (sense)
|
||||
|
|
@ -192,47 +150,42 @@ static inline uint8_t PPE_byte(unsigned int dio_line, int sense)
|
|||
return cmd;
|
||||
}
|
||||
|
||||
static inline uint8_t CFGn(unsigned int meters)
|
||||
{
|
||||
return 0x6 | (meters & 0xf);
|
||||
}
|
||||
|
||||
/* mask of bits that actually matter in a command byte */
|
||||
enum {
|
||||
gpib_command_mask = 0x7f,
|
||||
};
|
||||
|
||||
static inline int is_PPE(uint8_t command)
|
||||
static inline int is_PPE(__u8 command)
|
||||
{
|
||||
return (command & 0x70) == 0x60;
|
||||
}
|
||||
|
||||
static inline int is_PPD(uint8_t command)
|
||||
static inline int is_PPD(__u8 command)
|
||||
{
|
||||
return (command & 0x70) == 0x70;
|
||||
}
|
||||
|
||||
static inline int in_addressed_command_group(uint8_t command)
|
||||
static inline int in_addressed_command_group(__u8 command)
|
||||
{
|
||||
return (command & 0x70) == 0x0;
|
||||
}
|
||||
|
||||
static inline int in_universal_command_group(uint8_t command)
|
||||
static inline int in_universal_command_group(__u8 command)
|
||||
{
|
||||
return (command & 0x70) == 0x10;
|
||||
}
|
||||
|
||||
static inline int in_listen_address_group(uint8_t command)
|
||||
static inline int in_listen_address_group(__u8 command)
|
||||
{
|
||||
return (command & 0x60) == 0x20;
|
||||
}
|
||||
|
||||
static inline int in_talk_address_group(uint8_t command)
|
||||
static inline int in_talk_address_group(__u8 command)
|
||||
{
|
||||
return (command & 0x60) == 0x40;
|
||||
}
|
||||
|
||||
static inline int in_primary_command_group(uint8_t command)
|
||||
static inline int in_primary_command_group(__u8 command)
|
||||
{
|
||||
return in_addressed_command_group(command) ||
|
||||
in_universal_command_group(command) ||
|
||||
|
|
@ -253,75 +206,73 @@ static inline int gpib_address_equal(unsigned int pad1, int sad1, unsigned int p
|
|||
}
|
||||
|
||||
enum ibask_option {
|
||||
IbaPAD = 0x1,
|
||||
IbaSAD = 0x2,
|
||||
IbaTMO = 0x3,
|
||||
IbaEOT = 0x4,
|
||||
IbaPPC = 0x5, /* board only */
|
||||
IbaREADDR = 0x6, /* device only */
|
||||
IbaAUTOPOLL = 0x7, /* board only */
|
||||
IbaCICPROT = 0x8, /* board only */
|
||||
IbaIRQ = 0x9, /* board only */
|
||||
IbaSC = 0xa, /* board only */
|
||||
IbaSRE = 0xb, /* board only */
|
||||
IbaEOSrd = 0xc,
|
||||
IbaEOSwrt = 0xd,
|
||||
IbaEOScmp = 0xe,
|
||||
IbaEOSchar = 0xf,
|
||||
IbaPP2 = 0x10, /* board only */
|
||||
IbaTIMING = 0x11, /* board only */
|
||||
IbaDMA = 0x12, /* board only */
|
||||
IbaReadAdjust = 0x13,
|
||||
IbaWriteAdjust = 0x14,
|
||||
IbaEventQueue = 0x15, /* board only */
|
||||
IbaSPollBit = 0x16, /* board only */
|
||||
IbaSpollBit = 0x16, /* board only */
|
||||
IbaSendLLO = 0x17, /* board only */
|
||||
IbaSPollTime = 0x18, /* device only */
|
||||
IbaPPollTime = 0x19, /* board only */
|
||||
IbaEndBitIsNormal = 0x1a,
|
||||
IbaUnAddr = 0x1b, /* device only */
|
||||
IbaHSCableLength = 0x1f, /* board only */
|
||||
IbaIst = 0x20, /* board only */
|
||||
IbaRsv = 0x21, /* board only */
|
||||
IbaBNA = 0x200, /* device only */
|
||||
IBA_PAD = 0x1,
|
||||
IBA_SAD = 0x2,
|
||||
IBA_TMO = 0x3,
|
||||
IBA_EOT = 0x4,
|
||||
IBA_PPC = 0x5, /* board only */
|
||||
IBA_READ_DR = 0x6, /* device only */
|
||||
IBA_AUTOPOLL = 0x7, /* board only */
|
||||
IBA_CICPROT = 0x8, /* board only */
|
||||
IBA_IRQ = 0x9, /* board only */
|
||||
IBA_SC = 0xa, /* board only */
|
||||
IBA_SRE = 0xb, /* board only */
|
||||
IBA_EOS_RD = 0xc,
|
||||
IBA_EOS_WRT = 0xd,
|
||||
IBA_EOS_CMP = 0xe,
|
||||
IBA_EOS_CHAR = 0xf,
|
||||
IBA_PP2 = 0x10, /* board only */
|
||||
IBA_TIMING = 0x11, /* board only */
|
||||
IBA_DMA = 0x12, /* board only */
|
||||
IBA_READ_ADJUST = 0x13,
|
||||
IBA_WRITE_ADJUST = 0x14,
|
||||
IBA_EVENT_QUEUE = 0x15, /* board only */
|
||||
IBA_SPOLL_BIT = 0x16, /* board only */
|
||||
IBA_SEND_LLO = 0x17, /* board only */
|
||||
IBA_SPOLL_TIME = 0x18, /* device only */
|
||||
IBA_PPOLL_TIME = 0x19, /* board only */
|
||||
IBA_END_BIT_IS_NORMAL = 0x1a,
|
||||
IBA_UN_ADDR = 0x1b, /* device only */
|
||||
IBA_HS_CABLE_LENGTH = 0x1f, /* board only */
|
||||
IBA_IST = 0x20, /* board only */
|
||||
IBA_RSV = 0x21, /* board only */
|
||||
IBA_BNA = 0x200, /* device only */
|
||||
/* linux-gpib extensions */
|
||||
Iba7BitEOS = 0x1000 /* board only. Returns 1 if board supports 7 bit eos compares*/
|
||||
IBA_7_BIT_EOS = 0x1000 /* board only. Returns 1 if board supports 7 bit eos compares*/
|
||||
};
|
||||
|
||||
enum ibconfig_option {
|
||||
IbcPAD = 0x1,
|
||||
IbcSAD = 0x2,
|
||||
IbcTMO = 0x3,
|
||||
IbcEOT = 0x4,
|
||||
IbcPPC = 0x5, /* board only */
|
||||
IbcREADDR = 0x6, /* device only */
|
||||
IbcAUTOPOLL = 0x7, /* board only */
|
||||
IbcCICPROT = 0x8, /* board only */
|
||||
IbcIRQ = 0x9, /* board only */
|
||||
IbcSC = 0xa, /* board only */
|
||||
IbcSRE = 0xb, /* board only */
|
||||
IbcEOSrd = 0xc,
|
||||
IbcEOSwrt = 0xd,
|
||||
IbcEOScmp = 0xe,
|
||||
IbcEOSchar = 0xf,
|
||||
IbcPP2 = 0x10, /* board only */
|
||||
IbcTIMING = 0x11, /* board only */
|
||||
IbcDMA = 0x12, /* board only */
|
||||
IbcReadAdjust = 0x13,
|
||||
IbcWriteAdjust = 0x14,
|
||||
IbcEventQueue = 0x15, /* board only */
|
||||
IbcSPollBit = 0x16, /* board only */
|
||||
IbcSpollBit = 0x16, /* board only */
|
||||
IbcSendLLO = 0x17, /* board only */
|
||||
IbcSPollTime = 0x18, /* device only */
|
||||
IbcPPollTime = 0x19, /* board only */
|
||||
IbcEndBitIsNormal = 0x1a,
|
||||
IbcUnAddr = 0x1b, /* device only */
|
||||
IbcHSCableLength = 0x1f, /* board only */
|
||||
IbcIst = 0x20, /* board only */
|
||||
IbcRsv = 0x21, /* board only */
|
||||
IbcBNA = 0x200 /* device only */
|
||||
IBC_PAD = 0x1,
|
||||
IBC_SAD = 0x2,
|
||||
IBC_TMO = 0x3,
|
||||
IBC_EOT = 0x4,
|
||||
IBC_PPC = 0x5, /* board only */
|
||||
IBC_READDR = 0x6, /* device only */
|
||||
IBC_AUTOPOLL = 0x7, /* board only */
|
||||
IBC_CICPROT = 0x8, /* board only */
|
||||
IBC_IRQ = 0x9, /* board only */
|
||||
IBC_SC = 0xa, /* board only */
|
||||
IBC_SRE = 0xb, /* board only */
|
||||
IBC_EOS_RD = 0xc,
|
||||
IBC_EOS_WRT = 0xd,
|
||||
IBC_EOS_CMP = 0xe,
|
||||
IBC_EOS_CHAR = 0xf,
|
||||
IBC_PP2 = 0x10, /* board only */
|
||||
IBC_TIMING = 0x11, /* board only */
|
||||
IBC_DMA = 0x12, /* board only */
|
||||
IBC_READ_ADJUST = 0x13,
|
||||
IBC_WRITE_ADJUST = 0x14,
|
||||
IBC_EVENT_QUEUE = 0x15, /* board only */
|
||||
IBC_SPOLL_BIT = 0x16, /* board only */
|
||||
IBC_SEND_LLO = 0x17, /* board only */
|
||||
IBC_SPOLL_TIME = 0x18, /* device only */
|
||||
IBC_PPOLL_TIME = 0x19, /* board only */
|
||||
IBC_END_BIT_IS_NORMAL = 0x1a,
|
||||
IBC_UN_ADDR = 0x1b, /* device only */
|
||||
IBC_HS_CABLE_LENGTH = 0x1f, /* board only */
|
||||
IBC_IST = 0x20, /* board only */
|
||||
IBC_RSV = 0x21, /* board only */
|
||||
IBC_BNA = 0x200 /* device only */
|
||||
};
|
||||
|
||||
enum t1_delays {
|
||||
|
|
@ -335,18 +286,17 @@ enum {
|
|||
};
|
||||
|
||||
enum gpib_events {
|
||||
EventNone = 0,
|
||||
EventDevTrg = 1,
|
||||
EventDevClr = 2,
|
||||
EventIFC = 3
|
||||
EVENT_NONE = 0,
|
||||
EVENT_DEV_TRG = 1,
|
||||
EVENT_DEV_CLR = 2,
|
||||
EVENT_IFC = 3
|
||||
};
|
||||
|
||||
enum gpib_stb {
|
||||
IbStbRQS = 0x40, /* IEEE 488.1 & 2 */
|
||||
IbStbESB = 0x20, /* IEEE 488.2 only */
|
||||
IbStbMAV = 0x10 /* IEEE 488.2 only */
|
||||
IB_STB_RQS = 0x40, /* IEEE 488.1 & 2 */
|
||||
IB_STB_ESB = 0x20, /* IEEE 488.2 only */
|
||||
IB_STB_MAV = 0x10 /* IEEE 488.2 only */
|
||||
};
|
||||
|
||||
#endif /* _GPIB_USER_H */
|
||||
#endif /* _GPIB_H */
|
||||
|
||||
/* Check for errors */
|
||||
|
|
@ -12,42 +12,42 @@
|
|||
|
||||
#define GPIB_CODE 160
|
||||
|
||||
typedef struct {
|
||||
struct gpib_board_type_ioctl {
|
||||
char name[100];
|
||||
} board_type_ioctl_t;
|
||||
};
|
||||
|
||||
/* argument for read/write/command ioctls */
|
||||
typedef struct {
|
||||
uint64_t buffer_ptr;
|
||||
struct gpib_read_write_ioctl {
|
||||
__u64 buffer_ptr;
|
||||
unsigned int requested_transfer_count;
|
||||
unsigned int completed_transfer_count;
|
||||
int end; /* end flag return for reads, end io suppression request for cmd*/
|
||||
int handle;
|
||||
} read_write_ioctl_t;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct gpib_open_dev_ioctl {
|
||||
unsigned int handle;
|
||||
unsigned int pad;
|
||||
int sad;
|
||||
unsigned is_board : 1;
|
||||
} open_dev_ioctl_t;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct gpib_close_dev_ioctl {
|
||||
unsigned int handle;
|
||||
} close_dev_ioctl_t;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct gpib_serial_poll_ioctl {
|
||||
unsigned int pad;
|
||||
int sad;
|
||||
uint8_t status_byte;
|
||||
} serial_poll_ioctl_t;
|
||||
__u8 status_byte;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct gpib_eos_ioctl {
|
||||
int eos;
|
||||
int eos_flags;
|
||||
} eos_ioctl_t;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct gpib_wait_ioctl {
|
||||
int handle;
|
||||
int wait_mask;
|
||||
int clear_mask;
|
||||
|
|
@ -56,21 +56,21 @@ typedef struct {
|
|||
int pad;
|
||||
int sad;
|
||||
unsigned int usec_timeout;
|
||||
} wait_ioctl_t;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
uint64_t init_data_ptr;
|
||||
struct gpib_online_ioctl {
|
||||
__u64 init_data_ptr;
|
||||
int init_data_length;
|
||||
int online;
|
||||
} online_ioctl_t;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct gpib_spoll_bytes_ioctl {
|
||||
unsigned int num_bytes;
|
||||
unsigned int pad;
|
||||
int sad;
|
||||
} spoll_bytes_ioctl_t;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct gpib_board_info_ioctl {
|
||||
unsigned int pad;
|
||||
int sad;
|
||||
int parallel_poll_configuration;
|
||||
|
|
@ -79,91 +79,85 @@ typedef struct {
|
|||
unsigned int t1_delay;
|
||||
unsigned ist : 1;
|
||||
unsigned no_7_bit_eos : 1;
|
||||
} board_info_ioctl_t;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct gpib_select_pci_ioctl {
|
||||
int pci_bus;
|
||||
int pci_slot;
|
||||
} select_pci_ioctl_t;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
uint8_t config;
|
||||
struct gpib_ppoll_config_ioctl {
|
||||
__u8 config;
|
||||
unsigned set_ist : 1;
|
||||
unsigned clear_ist : 1;
|
||||
} ppoll_config_ioctl_t;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct gpib_pad_ioctl {
|
||||
unsigned int handle;
|
||||
unsigned int pad;
|
||||
} pad_ioctl_t;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct gpib_sad_ioctl {
|
||||
unsigned int handle;
|
||||
int sad;
|
||||
} sad_ioctl_t;
|
||||
};
|
||||
|
||||
// select a piece of hardware to attach by its sysfs device path
|
||||
typedef struct {
|
||||
struct gpib_select_device_path_ioctl {
|
||||
char device_path[0x1000];
|
||||
} select_device_path_ioctl_t;
|
||||
|
||||
typedef short event_ioctl_t;
|
||||
typedef int rsc_ioctl_t;
|
||||
typedef unsigned int t1_delay_ioctl_t;
|
||||
typedef short autospoll_ioctl_t;
|
||||
typedef short local_ppoll_mode_ioctl_t;
|
||||
};
|
||||
|
||||
// update status byte and request service
|
||||
typedef struct {
|
||||
uint8_t status_byte;
|
||||
struct gpib_request_service2 {
|
||||
__u8 status_byte;
|
||||
int new_reason_for_service;
|
||||
} request_service2_t;
|
||||
};
|
||||
|
||||
/* Standard functions. */
|
||||
enum gpib_ioctl {
|
||||
IBRD = _IOWR(GPIB_CODE, 100, read_write_ioctl_t),
|
||||
IBWRT = _IOWR(GPIB_CODE, 101, read_write_ioctl_t),
|
||||
IBCMD = _IOWR(GPIB_CODE, 102, read_write_ioctl_t),
|
||||
IBOPENDEV = _IOWR(GPIB_CODE, 3, open_dev_ioctl_t),
|
||||
IBCLOSEDEV = _IOW(GPIB_CODE, 4, close_dev_ioctl_t),
|
||||
IBWAIT = _IOWR(GPIB_CODE, 5, wait_ioctl_t),
|
||||
IBRPP = _IOWR(GPIB_CODE, 6, uint8_t),
|
||||
IBRD = _IOWR(GPIB_CODE, 100, struct gpib_read_write_ioctl),
|
||||
IBWRT = _IOWR(GPIB_CODE, 101, struct gpib_read_write_ioctl),
|
||||
IBCMD = _IOWR(GPIB_CODE, 102, struct gpib_read_write_ioctl),
|
||||
IBOPENDEV = _IOWR(GPIB_CODE, 3, struct gpib_open_dev_ioctl),
|
||||
IBCLOSEDEV = _IOW(GPIB_CODE, 4, struct gpib_close_dev_ioctl),
|
||||
IBWAIT = _IOWR(GPIB_CODE, 5, struct gpib_wait_ioctl),
|
||||
IBRPP = _IOWR(GPIB_CODE, 6, __u8),
|
||||
|
||||
IBSIC = _IOW(GPIB_CODE, 9, unsigned int),
|
||||
IBSRE = _IOW(GPIB_CODE, 10, int),
|
||||
IBGTS = _IO(GPIB_CODE, 11),
|
||||
IBCAC = _IOW(GPIB_CODE, 12, int),
|
||||
IBLINES = _IOR(GPIB_CODE, 14, short),
|
||||
IBPAD = _IOW(GPIB_CODE, 15, pad_ioctl_t),
|
||||
IBSAD = _IOW(GPIB_CODE, 16, sad_ioctl_t),
|
||||
IBPAD = _IOW(GPIB_CODE, 15, struct gpib_pad_ioctl),
|
||||
IBSAD = _IOW(GPIB_CODE, 16, struct gpib_sad_ioctl),
|
||||
IBTMO = _IOW(GPIB_CODE, 17, unsigned int),
|
||||
IBRSP = _IOWR(GPIB_CODE, 18, serial_poll_ioctl_t),
|
||||
IBEOS = _IOW(GPIB_CODE, 19, eos_ioctl_t),
|
||||
IBRSV = _IOW(GPIB_CODE, 20, uint8_t),
|
||||
CFCBASE = _IOW(GPIB_CODE, 21, uint64_t),
|
||||
IBRSP = _IOWR(GPIB_CODE, 18, struct gpib_serial_poll_ioctl),
|
||||
IBEOS = _IOW(GPIB_CODE, 19, struct gpib_eos_ioctl),
|
||||
IBRSV = _IOW(GPIB_CODE, 20, __u8),
|
||||
CFCBASE = _IOW(GPIB_CODE, 21, __u64),
|
||||
CFCIRQ = _IOW(GPIB_CODE, 22, unsigned int),
|
||||
CFCDMA = _IOW(GPIB_CODE, 23, unsigned int),
|
||||
CFCBOARDTYPE = _IOW(GPIB_CODE, 24, board_type_ioctl_t),
|
||||
CFCBOARDTYPE = _IOW(GPIB_CODE, 24, struct gpib_board_type_ioctl),
|
||||
|
||||
IBMUTEX = _IOW(GPIB_CODE, 26, int),
|
||||
IBSPOLL_BYTES = _IOWR(GPIB_CODE, 27, spoll_bytes_ioctl_t),
|
||||
IBPPC = _IOW(GPIB_CODE, 28, ppoll_config_ioctl_t),
|
||||
IBBOARD_INFO = _IOR(GPIB_CODE, 29, board_info_ioctl_t),
|
||||
IBSPOLL_BYTES = _IOWR(GPIB_CODE, 27, struct gpib_spoll_bytes_ioctl),
|
||||
IBPPC = _IOW(GPIB_CODE, 28, struct gpib_ppoll_config_ioctl),
|
||||
IBBOARD_INFO = _IOR(GPIB_CODE, 29, struct gpib_board_info_ioctl),
|
||||
|
||||
IBQUERY_BOARD_RSV = _IOR(GPIB_CODE, 31, int),
|
||||
IBSELECT_PCI = _IOWR(GPIB_CODE, 32, select_pci_ioctl_t),
|
||||
IBEVENT = _IOR(GPIB_CODE, 33, event_ioctl_t),
|
||||
IBRSC = _IOW(GPIB_CODE, 34, rsc_ioctl_t),
|
||||
IB_T1_DELAY = _IOW(GPIB_CODE, 35, t1_delay_ioctl_t),
|
||||
IBSELECT_PCI = _IOWR(GPIB_CODE, 32, struct gpib_select_pci_ioctl),
|
||||
IBEVENT = _IOR(GPIB_CODE, 33, short),
|
||||
IBRSC = _IOW(GPIB_CODE, 34, int),
|
||||
IB_T1_DELAY = _IOW(GPIB_CODE, 35, unsigned int),
|
||||
IBLOC = _IO(GPIB_CODE, 36),
|
||||
|
||||
IBAUTOSPOLL = _IOW(GPIB_CODE, 38, autospoll_ioctl_t),
|
||||
IBONL = _IOW(GPIB_CODE, 39, online_ioctl_t),
|
||||
IBPP2_SET = _IOW(GPIB_CODE, 40, local_ppoll_mode_ioctl_t),
|
||||
IBPP2_GET = _IOR(GPIB_CODE, 41, local_ppoll_mode_ioctl_t),
|
||||
IBSELECT_DEVICE_PATH = _IOW(GPIB_CODE, 43, select_device_path_ioctl_t),
|
||||
IBAUTOSPOLL = _IOW(GPIB_CODE, 38, short),
|
||||
IBONL = _IOW(GPIB_CODE, 39, struct gpib_online_ioctl),
|
||||
IBPP2_SET = _IOW(GPIB_CODE, 40, short),
|
||||
IBPP2_GET = _IOR(GPIB_CODE, 41, short),
|
||||
IBSELECT_DEVICE_PATH = _IOW(GPIB_CODE, 43, struct gpib_select_device_path_ioctl),
|
||||
// 44 was IBSELECT_SERIAL_NUMBER
|
||||
IBRSV2 = _IOW(GPIB_CODE, 45, request_service2_t)
|
||||
IBRSV2 = _IOW(GPIB_CODE, 45, struct gpib_request_service2)
|
||||
};
|
||||
|
||||
#endif /* _GPIB_IOCTL_H */
|
||||
|
|
|
|||
|
|
@ -1165,8 +1165,8 @@ static int gb_camera_debugfs_init(struct gb_camera *gcam)
|
|||
gcam->debugfs.buffers[i].length = 0;
|
||||
|
||||
debugfs_create_file_aux(entry->name, entry->mask,
|
||||
gcam->debugfs.root, gcam, entry,
|
||||
&gb_camera_debugfs_ops);
|
||||
gcam->debugfs.root, gcam, entry,
|
||||
&gb_camera_debugfs_ops);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -123,17 +123,11 @@ static int fw_mgmt_interface_fw_version_operation(struct fw_mgmt *fw_mgmt,
|
|||
fw_info->major = le16_to_cpu(response.major);
|
||||
fw_info->minor = le16_to_cpu(response.minor);
|
||||
|
||||
strscpy_pad(fw_info->firmware_tag, response.firmware_tag);
|
||||
|
||||
/*
|
||||
* The firmware-tag should be NULL terminated, otherwise throw error but
|
||||
* don't fail.
|
||||
*/
|
||||
if (fw_info->firmware_tag[GB_FIRMWARE_TAG_MAX_SIZE - 1] != '\0') {
|
||||
ret = strscpy_pad(fw_info->firmware_tag, response.firmware_tag);
|
||||
if (ret == -E2BIG)
|
||||
dev_err(fw_mgmt->parent,
|
||||
"fw-version: firmware-tag is not NULL terminated\n");
|
||||
fw_info->firmware_tag[GB_FIRMWARE_TAG_MAX_SIZE - 1] = '\0';
|
||||
}
|
||||
"fw-version: truncated firmware tag: %s\n",
|
||||
fw_info->firmware_tag);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -152,14 +146,12 @@ static int fw_mgmt_load_and_validate_operation(struct fw_mgmt *fw_mgmt,
|
|||
}
|
||||
|
||||
request.load_method = load_method;
|
||||
strscpy_pad(request.firmware_tag, tag);
|
||||
|
||||
/*
|
||||
* The firmware-tag should be NULL terminated, otherwise throw error and
|
||||
* fail.
|
||||
*/
|
||||
if (request.firmware_tag[GB_FIRMWARE_TAG_MAX_SIZE - 1] != '\0') {
|
||||
dev_err(fw_mgmt->parent, "load-and-validate: firmware-tag is not NULL terminated\n");
|
||||
ret = strscpy_pad(request.firmware_tag, tag);
|
||||
if (ret == -E2BIG) {
|
||||
dev_err(fw_mgmt->parent,
|
||||
"load-and-validate: truncated firmware tag: %s\n",
|
||||
request.firmware_tag);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
@ -248,14 +240,11 @@ static int fw_mgmt_backend_fw_version_operation(struct fw_mgmt *fw_mgmt,
|
|||
struct gb_fw_mgmt_backend_fw_version_response response;
|
||||
int ret;
|
||||
|
||||
strscpy_pad(request.firmware_tag, fw_info->firmware_tag);
|
||||
|
||||
/*
|
||||
* The firmware-tag should be NULL terminated, otherwise throw error and
|
||||
* fail.
|
||||
*/
|
||||
if (request.firmware_tag[GB_FIRMWARE_TAG_MAX_SIZE - 1] != '\0') {
|
||||
dev_err(fw_mgmt->parent, "backend-version: firmware-tag is not NULL terminated\n");
|
||||
ret = strscpy_pad(request.firmware_tag, fw_info->firmware_tag);
|
||||
if (ret == -E2BIG) {
|
||||
dev_err(fw_mgmt->parent,
|
||||
"backend-fw-version: truncated firmware tag: %s\n",
|
||||
request.firmware_tag);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
@ -302,13 +291,10 @@ static int fw_mgmt_backend_fw_update_operation(struct fw_mgmt *fw_mgmt,
|
|||
int ret;
|
||||
|
||||
ret = strscpy_pad(request.firmware_tag, tag);
|
||||
|
||||
/*
|
||||
* The firmware-tag should be NULL terminated, otherwise throw error and
|
||||
* fail.
|
||||
*/
|
||||
if (ret == -E2BIG) {
|
||||
dev_err(fw_mgmt->parent, "backend-update: firmware-tag is not NULL terminated\n");
|
||||
dev_err(fw_mgmt->parent,
|
||||
"backend-fw-update: truncated firmware tag: %s\n",
|
||||
request.firmware_tag);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -185,8 +185,8 @@ static int gb_gpio_get_value_operation(struct gb_gpio_controller *ggc,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void gb_gpio_set_value_operation(struct gb_gpio_controller *ggc,
|
||||
u8 which, bool value_high)
|
||||
static int gb_gpio_set_value_operation(struct gb_gpio_controller *ggc,
|
||||
u8 which, bool value_high)
|
||||
{
|
||||
struct device *dev = &ggc->gbphy_dev->dev;
|
||||
struct gb_gpio_set_value_request request;
|
||||
|
|
@ -195,7 +195,7 @@ static void gb_gpio_set_value_operation(struct gb_gpio_controller *ggc,
|
|||
if (ggc->lines[which].direction == 1) {
|
||||
dev_warn(dev, "refusing to set value of input gpio %u\n",
|
||||
which);
|
||||
return;
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
request.which = which;
|
||||
|
|
@ -204,10 +204,12 @@ static void gb_gpio_set_value_operation(struct gb_gpio_controller *ggc,
|
|||
&request, sizeof(request), NULL, 0);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to set value of gpio %u\n", which);
|
||||
return;
|
||||
return ret;
|
||||
}
|
||||
|
||||
ggc->lines[which].value = request.value;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gb_gpio_set_debounce_operation(struct gb_gpio_controller *ggc,
|
||||
|
|
@ -457,11 +459,11 @@ static int gb_gpio_get(struct gpio_chip *chip, unsigned int offset)
|
|||
return ggc->lines[which].value;
|
||||
}
|
||||
|
||||
static void gb_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
|
||||
static int gb_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
|
||||
{
|
||||
struct gb_gpio_controller *ggc = gpiochip_get_data(chip);
|
||||
|
||||
gb_gpio_set_value_operation(ggc, (u8)offset, !!value);
|
||||
return gb_gpio_set_value_operation(ggc, (u8)offset, !!value);
|
||||
}
|
||||
|
||||
static int gb_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
|
||||
|
|
@ -555,7 +557,7 @@ static int gb_gpio_probe(struct gbphy_device *gbphy_dev,
|
|||
gpio->direction_input = gb_gpio_direction_input;
|
||||
gpio->direction_output = gb_gpio_direction_output;
|
||||
gpio->get = gb_gpio_get;
|
||||
gpio->set = gb_gpio_set;
|
||||
gpio->set_rv = gb_gpio_set;
|
||||
gpio->set_config = gb_gpio_set_config;
|
||||
gpio->base = -1; /* Allocate base dynamically */
|
||||
gpio->ngpio = ggc->line_max + 1;
|
||||
|
|
|
|||
|
|
@ -389,7 +389,7 @@ void update_bmc_sta(struct adapter *padapter)
|
|||
psta->qos_option = 0;
|
||||
psta->htpriv.ht_option = false;
|
||||
|
||||
psta->ieee8021x_blocked = 0;
|
||||
psta->ieee8021x_blocked = false;
|
||||
|
||||
memset((void *)&psta->sta_stats, 0, sizeof(struct stainfo_stats));
|
||||
|
||||
|
|
|
|||
|
|
@ -8,14 +8,14 @@
|
|||
#include <rtw_btcoex.h>
|
||||
#include <hal_btcoex.h>
|
||||
|
||||
void rtw_btcoex_MediaStatusNotify(struct adapter *padapter, u8 mediaStatus)
|
||||
void rtw_btcoex_MediaStatusNotify(struct adapter *padapter, u8 media_status)
|
||||
{
|
||||
if ((mediaStatus == RT_MEDIA_CONNECT)
|
||||
if ((media_status == RT_MEDIA_CONNECT)
|
||||
&& (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == true)) {
|
||||
rtw_hal_set_hwreg(padapter, HW_VAR_DL_RSVD_PAGE, NULL);
|
||||
}
|
||||
|
||||
hal_btcoex_MediaStatusNotify(padapter, mediaStatus);
|
||||
hal_btcoex_MediaStatusNotify(padapter, media_status);
|
||||
}
|
||||
|
||||
void rtw_btcoex_HaltNotify(struct adapter *padapter)
|
||||
|
|
@ -52,14 +52,14 @@ void rtw_btcoex_RejectApAggregatedPacket(struct adapter *padapter, u8 enable)
|
|||
void rtw_btcoex_LPS_Enter(struct adapter *padapter)
|
||||
{
|
||||
struct pwrctrl_priv *pwrpriv;
|
||||
u8 lpsVal;
|
||||
u8 lps_val;
|
||||
|
||||
|
||||
pwrpriv = adapter_to_pwrctl(padapter);
|
||||
|
||||
pwrpriv->bpower_saving = true;
|
||||
lpsVal = hal_btcoex_LpsVal(padapter);
|
||||
rtw_set_ps_mode(padapter, PS_MODE_MIN, 0, lpsVal, "BTCOEX");
|
||||
lps_val = hal_btcoex_LpsVal(padapter);
|
||||
rtw_set_ps_mode(padapter, PS_MODE_MIN, 0, lps_val, "BTCOEX");
|
||||
}
|
||||
|
||||
void rtw_btcoex_LPS_Leave(struct adapter *padapter)
|
||||
|
|
|
|||
|
|
@ -273,9 +273,9 @@ struct cmd_obj *_rtw_dequeue_cmd(struct __queue *queue)
|
|||
|
||||
/* spin_lock_bh(&(queue->lock)); */
|
||||
spin_lock_irqsave(&queue->lock, irqL);
|
||||
if (list_empty(&queue->queue))
|
||||
if (list_empty(&queue->queue)) {
|
||||
obj = NULL;
|
||||
else {
|
||||
} else {
|
||||
obj = container_of(get_next(&queue->queue), struct cmd_obj, list);
|
||||
list_del_init(&obj->list);
|
||||
}
|
||||
|
|
@ -695,7 +695,6 @@ u8 rtw_joinbss_cmd(struct adapter *padapter, struct wlan_network *pnetwork)
|
|||
/* for ies is fix buf size */
|
||||
t_len = sizeof(struct wlan_bssid_ex);
|
||||
|
||||
|
||||
/* for hidden ap to set fw_state here */
|
||||
if (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) != true) {
|
||||
switch (ndis_network_mode) {
|
||||
|
|
@ -738,7 +737,6 @@ u8 rtw_joinbss_cmd(struct adapter *padapter, struct wlan_network *pnetwork)
|
|||
|
||||
psecnetwork->ie_length = rtw_restruct_sec_ie(padapter, &pnetwork->network.ies[0], &psecnetwork->ies[0], pnetwork->network.ie_length);
|
||||
|
||||
|
||||
pqospriv->qos_option = 0;
|
||||
|
||||
if (pregistrypriv->wmm_enable) {
|
||||
|
|
@ -1032,7 +1030,6 @@ u8 rtw_reset_securitypriv_cmd(struct adapter *padapter)
|
|||
|
||||
init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
|
||||
|
||||
|
||||
/* rtw_enqueue_cmd(pcmdpriv, ph2c); */
|
||||
res = rtw_enqueue_cmd(pcmdpriv, ph2c);
|
||||
exit:
|
||||
|
|
@ -1099,7 +1096,6 @@ u8 rtw_dynamic_chk_wk_cmd(struct adapter *padapter)
|
|||
pdrvextra_cmd_parm->pbuf = NULL;
|
||||
init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
|
||||
|
||||
|
||||
/* rtw_enqueue_cmd(pcmdpriv, ph2c); */
|
||||
res = rtw_enqueue_cmd(pcmdpriv, ph2c);
|
||||
exit:
|
||||
|
|
@ -1256,7 +1252,6 @@ static void dynamic_chk_wk_hdl(struct adapter *padapter)
|
|||
/* */
|
||||
hal_btcoex_Handler(padapter);
|
||||
|
||||
|
||||
/* always call rtw_ps_processor() at last one. */
|
||||
rtw_ps_processor(padapter);
|
||||
}
|
||||
|
|
@ -1367,7 +1362,6 @@ u8 rtw_dm_in_lps_wk_cmd(struct adapter *padapter)
|
|||
struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
|
||||
u8 res = _SUCCESS;
|
||||
|
||||
|
||||
ph2c = rtw_zmalloc(sizeof(struct cmd_obj));
|
||||
if (!ph2c) {
|
||||
res = _FAIL;
|
||||
|
|
@ -1850,7 +1844,6 @@ void rtw_createbss_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd)
|
|||
|
||||
spin_lock_bh(&pmlmepriv->lock);
|
||||
|
||||
|
||||
if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
|
||||
psta = rtw_get_stainfo(&padapter->stapriv, pnetwork->mac_address);
|
||||
if (!psta) {
|
||||
|
|
|
|||
|
|
@ -988,11 +988,10 @@ void rtw_macaddr_cfg(struct device *dev, u8 *mac_addr)
|
|||
if (is_broadcast_ether_addr(mac) || is_zero_ether_addr(mac)) {
|
||||
addr = of_get_property(np, "local-mac-address", &len);
|
||||
|
||||
if (addr && len == ETH_ALEN) {
|
||||
if (addr && len == ETH_ALEN)
|
||||
ether_addr_copy(mac_addr, addr);
|
||||
} else {
|
||||
else
|
||||
eth_random_addr(mac_addr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2022,12 +2022,12 @@ signed int rtw_restruct_sec_ie(struct adapter *adapter, u8 *in_ie, u8 *out_ie, u
|
|||
}
|
||||
|
||||
iEntry = SecIsInPMKIDList(adapter, pmlmepriv->assoc_bssid);
|
||||
if (iEntry < 0) {
|
||||
if (iEntry < 0)
|
||||
return ielength;
|
||||
} else {
|
||||
if (authmode == WLAN_EID_RSN)
|
||||
ielength = rtw_append_pmkid(adapter, iEntry, out_ie, ielength);
|
||||
}
|
||||
|
||||
if (authmode == WLAN_EID_RSN)
|
||||
ielength = rtw_append_pmkid(adapter, iEntry, out_ie, ielength);
|
||||
|
||||
return ielength;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3511,7 +3511,7 @@ void issue_action_BA(struct adapter *padapter, unsigned char *raddr, unsigned ch
|
|||
/* if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.mac_address)) != NULL) */
|
||||
psta = rtw_get_stainfo(pstapriv, raddr);
|
||||
if (psta) {
|
||||
start_seq = (psta->sta_xmitpriv.txseq_tid[status & 0x07]&0xfff) + 1;
|
||||
start_seq = (psta->sta_xmitpriv.txseq_tid[status & 0x07] % 4096u) + 1;
|
||||
|
||||
psta->BA_starting_seqctrl[status & 0x07] = start_seq;
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@
|
|||
#include <hal_data.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
||||
|
||||
void _ips_enter(struct adapter *padapter)
|
||||
{
|
||||
struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
|
||||
|
|
@ -56,9 +55,8 @@ int _ips_leave(struct adapter *padapter)
|
|||
pwrpriv->ips_leave_cnts++;
|
||||
|
||||
result = rtw_ips_pwr_up(padapter);
|
||||
if (result == _SUCCESS) {
|
||||
if (result == _SUCCESS)
|
||||
pwrpriv->rf_pwrstate = rf_on;
|
||||
}
|
||||
pwrpriv->bips_processing = false;
|
||||
|
||||
pwrpriv->bkeepfwalive = false;
|
||||
|
|
@ -549,9 +547,8 @@ void LeaveAllPowerSaveMode(struct adapter *Adapter)
|
|||
|
||||
LPS_Leave_check(Adapter);
|
||||
} else {
|
||||
if (adapter_to_pwrctl(Adapter)->rf_pwrstate == rf_off) {
|
||||
if (adapter_to_pwrctl(Adapter)->rf_pwrstate == rf_off)
|
||||
ips_leave(Adapter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -996,7 +993,6 @@ void rtw_init_pwrctrl_priv(struct adapter *padapter)
|
|||
pwrctrlpriv->wowlan_ap_mode = false;
|
||||
}
|
||||
|
||||
|
||||
void rtw_free_pwrctrl_priv(struct adapter *adapter)
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1641,7 +1641,7 @@ static int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_n
|
|||
struct dvobj_priv *psdpriv = padapter->dvobj;
|
||||
struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
|
||||
u8 wsize = preorder_ctrl->wsize_b;
|
||||
u16 wend = (preorder_ctrl->indicate_seq + wsize - 1) & 0xFFF;/* 4096; */
|
||||
u16 wend = (preorder_ctrl->indicate_seq + wsize - 1) % 4096u;
|
||||
|
||||
/* Rx Reorder initialize condition. */
|
||||
if (preorder_ctrl->indicate_seq == 0xFFFF)
|
||||
|
|
@ -1657,7 +1657,7 @@ static int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_n
|
|||
/* 2. Incoming SeqNum is larger than the WinEnd => Window shift N */
|
||||
/* */
|
||||
if (SN_EQUAL(seq_num, preorder_ctrl->indicate_seq)) {
|
||||
preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF;
|
||||
preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) % 4096u;
|
||||
|
||||
} else if (SN_LESS(wend, seq_num)) {
|
||||
/* boundary situation, when seq_num cross 0xFFF */
|
||||
|
|
@ -1772,7 +1772,7 @@ static int recv_indicatepkts_in_order(struct adapter *padapter, struct recv_reor
|
|||
list_del_init(&(prframe->u.hdr.list));
|
||||
|
||||
if (SN_EQUAL(preorder_ctrl->indicate_seq, pattrib->seq_num))
|
||||
preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF;
|
||||
preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) % 4096u;
|
||||
|
||||
/* Set this as a lock to make sure that only one thread is indicating packet. */
|
||||
/* pTS->RxIndicateState = RXTS_INDICATE_PROCESSING; */
|
||||
|
|
|
|||
|
|
@ -943,7 +943,7 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr
|
|||
|
||||
if (psta) {
|
||||
psta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
|
||||
psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
|
||||
psta->sta_xmitpriv.txseq_tid[pattrib->priority] %= 4096u;
|
||||
pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority];
|
||||
|
||||
SetSeqNum(hdr, pattrib->seqnum);
|
||||
|
|
@ -963,11 +963,14 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr
|
|||
if (SN_LESS(pattrib->seqnum, tx_seq)) {
|
||||
pattrib->ampdu_en = false;/* AGG BK */
|
||||
} else if (SN_EQUAL(pattrib->seqnum, tx_seq)) {
|
||||
psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&0xfff;
|
||||
psta->BA_starting_seqctrl[pattrib->priority & 0x0f] =
|
||||
(tx_seq + 1) % 4096u;
|
||||
|
||||
pattrib->ampdu_en = true;/* AGG EN */
|
||||
} else {
|
||||
psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (pattrib->seqnum+1)&0xfff;
|
||||
psta->BA_starting_seqctrl[pattrib->priority & 0x0f] =
|
||||
(pattrib->seqnum + 1) % 4096u;
|
||||
|
||||
pattrib->ampdu_en = true;/* AGG EN */
|
||||
}
|
||||
}
|
||||
|
|
@ -1936,7 +1939,6 @@ static void do_queue_select(struct adapter *padapter, struct pkt_attrib *pattrib
|
|||
s32 rtw_xmit(struct adapter *padapter, struct sk_buff **ppkt)
|
||||
{
|
||||
static unsigned long start;
|
||||
static u32 drop_cnt;
|
||||
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
struct xmit_frame *pxmitframe = NULL;
|
||||
|
|
@ -1948,15 +1950,11 @@ s32 rtw_xmit(struct adapter *padapter, struct sk_buff **ppkt)
|
|||
|
||||
pxmitframe = rtw_alloc_xmitframe(pxmitpriv);
|
||||
|
||||
if (jiffies_to_msecs(jiffies - start) > 2000) {
|
||||
if (jiffies_to_msecs(jiffies - start) > 2000)
|
||||
start = jiffies;
|
||||
drop_cnt = 0;
|
||||
}
|
||||
|
||||
if (!pxmitframe) {
|
||||
drop_cnt++;
|
||||
if (!pxmitframe)
|
||||
return -1;
|
||||
}
|
||||
|
||||
res = update_attrib(padapter, *ppkt, &pxmitframe->attrib);
|
||||
|
||||
|
|
|
|||
|
|
@ -1100,7 +1100,7 @@ static bool halbtc8723b2ant_IsCommonAction(struct btc_coexist *pBtCoexist)
|
|||
|
||||
bCommon = true;
|
||||
} else {
|
||||
if (BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) {
|
||||
if (pCoexDm->btStatus == BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE) {
|
||||
bLowPwrDisable = false;
|
||||
pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
|
||||
halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
|
||||
|
|
@ -1115,7 +1115,7 @@ static bool halbtc8723b2ant_IsCommonAction(struct btc_coexist *pBtCoexist)
|
|||
halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
|
||||
|
||||
bCommon = true;
|
||||
} else if (BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) {
|
||||
} else if (pCoexDm->btStatus == BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE) {
|
||||
bLowPwrDisable = true;
|
||||
pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
|
||||
|
||||
|
|
@ -1605,7 +1605,7 @@ static void halbtc8723b2ant_ActionSco(struct btc_coexist *pBtCoexist)
|
|||
|
||||
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
|
||||
|
||||
if (BTC_WIFI_BW_LEGACY == wifiBw) /* for SCO quality at 11b/g mode */
|
||||
if (wifiBw == BTC_WIFI_BW_LEGACY) /* for SCO quality at 11b/g mode */
|
||||
halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
|
||||
else /* for SCO quality & wifi performance balance at 11n mode */
|
||||
halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);
|
||||
|
|
@ -1613,7 +1613,7 @@ static void halbtc8723b2ant_ActionSco(struct btc_coexist *pBtCoexist)
|
|||
halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 0); /* for voice quality */
|
||||
|
||||
/* sw mechanism */
|
||||
if (BTC_WIFI_BW_HT40 == wifiBw) {
|
||||
if (wifiBw == BTC_WIFI_BW_HT40) {
|
||||
if (
|
||||
(wifiRssiState == BTC_RSSI_STATE_HIGH) ||
|
||||
(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
|
||||
|
|
@ -1660,7 +1660,7 @@ static void halbtc8723b2ant_ActionHid(struct btc_coexist *pBtCoexist)
|
|||
|
||||
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
|
||||
|
||||
if (BTC_WIFI_BW_LEGACY == wifiBw) /* for HID at 11b/g mode */
|
||||
if (wifiBw == BTC_WIFI_BW_LEGACY) /* for HID at 11b/g mode */
|
||||
halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
|
||||
else /* for HID quality & wifi performance balance at 11n mode */
|
||||
halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 9);
|
||||
|
|
@ -1674,7 +1674,7 @@ static void halbtc8723b2ant_ActionHid(struct btc_coexist *pBtCoexist)
|
|||
halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 13);
|
||||
|
||||
/* sw mechanism */
|
||||
if (BTC_WIFI_BW_HT40 == wifiBw) {
|
||||
if (wifiBw == BTC_WIFI_BW_HT40) {
|
||||
if (
|
||||
(wifiRssiState == BTC_RSSI_STATE_HIGH) ||
|
||||
(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
|
||||
|
|
@ -1723,7 +1723,7 @@ static void halbtc8723b2ant_ActionA2dp(struct btc_coexist *pBtCoexist)
|
|||
|
||||
/* sw mechanism */
|
||||
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
|
||||
if (BTC_WIFI_BW_HT40 == wifiBw) {
|
||||
if (wifiBw == BTC_WIFI_BW_HT40) {
|
||||
halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
|
||||
halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, true, 0x18);
|
||||
} else {
|
||||
|
|
@ -1755,7 +1755,7 @@ static void halbtc8723b2ant_ActionA2dp(struct btc_coexist *pBtCoexist)
|
|||
|
||||
/* sw mechanism */
|
||||
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
|
||||
if (BTC_WIFI_BW_HT40 == wifiBw) {
|
||||
if (wifiBw == BTC_WIFI_BW_HT40) {
|
||||
if (
|
||||
(wifiRssiState == BTC_RSSI_STATE_HIGH) ||
|
||||
(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
|
||||
|
|
@ -1805,7 +1805,7 @@ static void halbtc8723b2ant_ActionA2dpPanHs(struct btc_coexist *pBtCoexist)
|
|||
|
||||
/* sw mechanism */
|
||||
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
|
||||
if (BTC_WIFI_BW_HT40 == wifiBw) {
|
||||
if (wifiBw == BTC_WIFI_BW_HT40) {
|
||||
if (
|
||||
(wifiRssiState == BTC_RSSI_STATE_HIGH) ||
|
||||
(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
|
||||
|
|
@ -1861,7 +1861,7 @@ static void halbtc8723b2ant_ActionPanEdr(struct btc_coexist *pBtCoexist)
|
|||
|
||||
/* sw mechanism */
|
||||
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
|
||||
if (BTC_WIFI_BW_HT40 == wifiBw) {
|
||||
if (wifiBw == BTC_WIFI_BW_HT40) {
|
||||
if (
|
||||
(wifiRssiState == BTC_RSSI_STATE_HIGH) ||
|
||||
(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
|
||||
|
|
@ -1912,7 +1912,7 @@ static void halbtc8723b2ant_ActionPanHs(struct btc_coexist *pBtCoexist)
|
|||
halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 1);
|
||||
|
||||
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
|
||||
if (BTC_WIFI_BW_HT40 == wifiBw) {
|
||||
if (wifiBw == BTC_WIFI_BW_HT40) {
|
||||
if (
|
||||
(wifiRssiState == BTC_RSSI_STATE_HIGH) ||
|
||||
(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
|
||||
|
|
@ -1964,7 +1964,7 @@ static void halbtc8723b2ant_ActionPanEdrA2dp(struct btc_coexist *pBtCoexist)
|
|||
(btRssiState == BTC_RSSI_STATE_STAY_HIGH)
|
||||
) {
|
||||
halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 12);
|
||||
if (BTC_WIFI_BW_HT40 == wifiBw)
|
||||
if (wifiBw == BTC_WIFI_BW_HT40)
|
||||
halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, false, true, 3);
|
||||
else
|
||||
halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, false, false, 3);
|
||||
|
|
@ -1974,7 +1974,7 @@ static void halbtc8723b2ant_ActionPanEdrA2dp(struct btc_coexist *pBtCoexist)
|
|||
}
|
||||
|
||||
/* sw mechanism */
|
||||
if (BTC_WIFI_BW_HT40 == wifiBw) {
|
||||
if (wifiBw == BTC_WIFI_BW_HT40) {
|
||||
if (
|
||||
(wifiRssiState == BTC_RSSI_STATE_HIGH) ||
|
||||
(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
|
||||
|
|
@ -2019,7 +2019,7 @@ static void halbtc8723b2ant_ActionPanEdrHid(struct btc_coexist *pBtCoexist)
|
|||
(btRssiState == BTC_RSSI_STATE_HIGH) ||
|
||||
(btRssiState == BTC_RSSI_STATE_STAY_HIGH)
|
||||
) {
|
||||
if (BTC_WIFI_BW_HT40 == wifiBw) {
|
||||
if (wifiBw == BTC_WIFI_BW_HT40) {
|
||||
halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 3);
|
||||
halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 11);
|
||||
pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780);
|
||||
|
|
@ -2037,7 +2037,7 @@ static void halbtc8723b2ant_ActionPanEdrHid(struct btc_coexist *pBtCoexist)
|
|||
}
|
||||
|
||||
/* sw mechanism */
|
||||
if (BTC_WIFI_BW_HT40 == wifiBw) {
|
||||
if (wifiBw == BTC_WIFI_BW_HT40) {
|
||||
if (
|
||||
(wifiRssiState == BTC_RSSI_STATE_HIGH) ||
|
||||
(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
|
||||
|
|
@ -2090,7 +2090,7 @@ static void halbtc8723b2ant_ActionHidA2dpPanEdr(struct btc_coexist *pBtCoexist)
|
|||
(btRssiState == BTC_RSSI_STATE_HIGH) ||
|
||||
(btRssiState == BTC_RSSI_STATE_STAY_HIGH)
|
||||
) {
|
||||
if (BTC_WIFI_BW_HT40 == wifiBw)
|
||||
if (wifiBw == BTC_WIFI_BW_HT40)
|
||||
halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, true, true, 2);
|
||||
else
|
||||
halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, true, false, 3);
|
||||
|
|
@ -2098,7 +2098,7 @@ static void halbtc8723b2ant_ActionHidA2dpPanEdr(struct btc_coexist *pBtCoexist)
|
|||
halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, true, true, 3);
|
||||
|
||||
/* sw mechanism */
|
||||
if (BTC_WIFI_BW_HT40 == wifiBw) {
|
||||
if (wifiBw == BTC_WIFI_BW_HT40) {
|
||||
if (
|
||||
(wifiRssiState == BTC_RSSI_STATE_HIGH) ||
|
||||
(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
|
||||
|
|
@ -2140,7 +2140,7 @@ static void halbtc8723b2ant_ActionHidA2dp(struct btc_coexist *pBtCoexist)
|
|||
halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
|
||||
|
||||
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
|
||||
if (BTC_WIFI_BW_LEGACY == wifiBw) {
|
||||
if (wifiBw == BTC_WIFI_BW_LEGACY) {
|
||||
if (BTC_RSSI_HIGH(btRssiState))
|
||||
halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
|
||||
else if (BTC_RSSI_MEDIUM(btRssiState))
|
||||
|
|
@ -2173,7 +2173,7 @@ static void halbtc8723b2ant_ActionHidA2dp(struct btc_coexist *pBtCoexist)
|
|||
halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, true, true, 2);
|
||||
|
||||
/* sw mechanism */
|
||||
if (BTC_WIFI_BW_HT40 == wifiBw) {
|
||||
if (wifiBw == BTC_WIFI_BW_HT40) {
|
||||
if (
|
||||
(wifiRssiState == BTC_RSSI_STATE_HIGH) ||
|
||||
(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
|
||||
|
|
@ -2391,12 +2391,12 @@ void EXhalbtc8723b2ant_InitCoexDm(struct btc_coexist *pBtCoexist)
|
|||
|
||||
void EXhalbtc8723b2ant_IpsNotify(struct btc_coexist *pBtCoexist, u8 type)
|
||||
{
|
||||
if (BTC_IPS_ENTER == type) {
|
||||
if (type == BTC_IPS_ENTER) {
|
||||
pCoexSta->bUnderIps = true;
|
||||
halbtc8723b2ant_WifiOffHwCfg(pBtCoexist);
|
||||
halbtc8723b2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, true);
|
||||
halbtc8723b2ant_CoexAllOff(pBtCoexist);
|
||||
} else if (BTC_IPS_LEAVE == type) {
|
||||
} else if (type == BTC_IPS_LEAVE) {
|
||||
pCoexSta->bUnderIps = false;
|
||||
halbtc8723b2ant_InitHwConfig(pBtCoexist, false);
|
||||
halbtc8723b2ant_InitCoexDm(pBtCoexist);
|
||||
|
|
@ -2406,24 +2406,24 @@ void EXhalbtc8723b2ant_IpsNotify(struct btc_coexist *pBtCoexist, u8 type)
|
|||
|
||||
void EXhalbtc8723b2ant_LpsNotify(struct btc_coexist *pBtCoexist, u8 type)
|
||||
{
|
||||
if (BTC_LPS_ENABLE == type) {
|
||||
if (type == BTC_LPS_ENABLE) {
|
||||
pCoexSta->bUnderLps = true;
|
||||
} else if (BTC_LPS_DISABLE == type) {
|
||||
} else if (type == BTC_LPS_DISABLE) {
|
||||
pCoexSta->bUnderLps = false;
|
||||
}
|
||||
}
|
||||
|
||||
void EXhalbtc8723b2ant_ScanNotify(struct btc_coexist *pBtCoexist, u8 type)
|
||||
{
|
||||
if (BTC_SCAN_START == type) {
|
||||
} else if (BTC_SCAN_FINISH == type) {
|
||||
if (type == BTC_SCAN_START) {
|
||||
} else if (type == BTC_SCAN_FINISH) {
|
||||
}
|
||||
}
|
||||
|
||||
void EXhalbtc8723b2ant_ConnectNotify(struct btc_coexist *pBtCoexist, u8 type)
|
||||
{
|
||||
if (BTC_ASSOCIATE_START == type) {
|
||||
} else if (BTC_ASSOCIATE_FINISH == type) {
|
||||
if (type == BTC_ASSOCIATE_START) {
|
||||
} else if (type == BTC_ASSOCIATE_FINISH) {
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2436,11 +2436,11 @@ void EXhalbtc8723b2ant_MediaStatusNotify(struct btc_coexist *pBtCoexist, u8 type
|
|||
|
||||
/* only 2.4G we need to inform bt the chnl mask */
|
||||
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);
|
||||
if ((BTC_MEDIA_CONNECT == type) && (wifiCentralChnl <= 14)) {
|
||||
if ((type == BTC_MEDIA_CONNECT) && (wifiCentralChnl <= 14)) {
|
||||
H2C_Parameter[0] = 0x1;
|
||||
H2C_Parameter[1] = wifiCentralChnl;
|
||||
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
|
||||
if (BTC_WIFI_BW_HT40 == wifiBw)
|
||||
if (wifiBw == BTC_WIFI_BW_HT40)
|
||||
H2C_Parameter[2] = 0x30;
|
||||
else {
|
||||
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);
|
||||
|
|
@ -2573,9 +2573,9 @@ void EXhalbtc8723b2ant_BtInfoNotify(
|
|||
}
|
||||
|
||||
if (
|
||||
(BT_8723B_2ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||
|
||||
(BT_8723B_2ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||
|
||||
(BT_8723B_2ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus)
|
||||
(pCoexDm->btStatus == BT_8723B_2ANT_BT_STATUS_ACL_BUSY) ||
|
||||
(pCoexDm->btStatus == BT_8723B_2ANT_BT_STATUS_SCO_BUSY) ||
|
||||
(pCoexDm->btStatus == BT_8723B_2ANT_BT_STATUS_ACL_SCO_BUSY)
|
||||
) {
|
||||
bBtBusy = true;
|
||||
bLimitedDig = true;
|
||||
|
|
@ -2603,8 +2603,8 @@ void EXhalbtc8723b2ant_HaltNotify(struct btc_coexist *pBtCoexist)
|
|||
|
||||
void EXhalbtc8723b2ant_PnpNotify(struct btc_coexist *pBtCoexist, u8 pnpState)
|
||||
{
|
||||
if (BTC_WIFI_PNP_SLEEP == pnpState) {
|
||||
} else if (BTC_WIFI_PNP_WAKE_UP == pnpState) {
|
||||
if (pnpState == BTC_WIFI_PNP_SLEEP) {
|
||||
} else if (pnpState == BTC_WIFI_PNP_WAKE_UP) {
|
||||
halbtc8723b2ant_InitHwConfig(pBtCoexist, false);
|
||||
halbtc8723b2ant_InitCoexDm(pBtCoexist);
|
||||
halbtc8723b2ant_QueryBtInfo(pBtCoexist);
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ static void halbtcoutsrc_LeaveLowPower(struct btc_coexist *pBtCoexist)
|
|||
stime = jiffies;
|
||||
do {
|
||||
ready = rtw_register_task_alive(padapter, BTCOEX_ALIVE);
|
||||
if (_SUCCESS == ready)
|
||||
if (ready == _SUCCESS)
|
||||
break;
|
||||
|
||||
utime = jiffies_to_msecs(jiffies - stime);
|
||||
|
|
@ -668,7 +668,7 @@ static void halbtcoutsrc_WriteLocalReg1Byte(void *pBtcContext, u32 RegAddr, u8 D
|
|||
struct btc_coexist *pBtCoexist = (struct btc_coexist *)pBtcContext;
|
||||
struct adapter *Adapter = pBtCoexist->Adapter;
|
||||
|
||||
if (BTC_INTF_SDIO == pBtCoexist->chipInterface)
|
||||
if (pBtCoexist->chipInterface == BTC_INTF_SDIO)
|
||||
rtw_write8(Adapter, SDIO_LOCAL_BASE | RegAddr, Data);
|
||||
else
|
||||
rtw_write8(Adapter, RegAddr, Data);
|
||||
|
|
@ -894,7 +894,7 @@ void EXhalbtcoutsrc_IpsNotify(struct btc_coexist *pBtCoexist, u8 type)
|
|||
if (pBtCoexist->bManualControl)
|
||||
return;
|
||||
|
||||
if (IPS_NONE == type)
|
||||
if (type == IPS_NONE)
|
||||
ipsType = BTC_IPS_LEAVE;
|
||||
else
|
||||
ipsType = BTC_IPS_ENTER;
|
||||
|
|
@ -922,7 +922,7 @@ void EXhalbtcoutsrc_LpsNotify(struct btc_coexist *pBtCoexist, u8 type)
|
|||
if (pBtCoexist->bManualControl)
|
||||
return;
|
||||
|
||||
if (PS_MODE_ACTIVE == type)
|
||||
if (type == PS_MODE_ACTIVE)
|
||||
lpsType = BTC_LPS_DISABLE;
|
||||
else
|
||||
lpsType = BTC_LPS_ENABLE;
|
||||
|
|
@ -1000,7 +1000,7 @@ void EXhalbtcoutsrc_MediaStatusNotify(struct btc_coexist *pBtCoexist, enum
|
|||
if (pBtCoexist->bManualControl)
|
||||
return;
|
||||
|
||||
if (RT_MEDIA_CONNECT == mediaStatus)
|
||||
if (mediaStatus == RT_MEDIA_CONNECT)
|
||||
mStatus = BTC_MEDIA_CONNECT;
|
||||
else
|
||||
mStatus = BTC_MEDIA_DISCONNECT;
|
||||
|
|
@ -1026,11 +1026,11 @@ void EXhalbtcoutsrc_SpecialPacketNotify(struct btc_coexist *pBtCoexist, u8 pktTy
|
|||
if (pBtCoexist->bManualControl)
|
||||
return;
|
||||
|
||||
if (PACKET_DHCP == pktType) {
|
||||
if (pktType == PACKET_DHCP) {
|
||||
packetType = BTC_PACKET_DHCP;
|
||||
} else if (PACKET_EAPOL == pktType) {
|
||||
} else if (pktType == PACKET_EAPOL) {
|
||||
packetType = BTC_PACKET_EAPOL;
|
||||
} else if (PACKET_ARP == pktType) {
|
||||
} else if (pktType == PACKET_ARP) {
|
||||
packetType = BTC_PACKET_ARP;
|
||||
} else {
|
||||
return;
|
||||
|
|
@ -1114,13 +1114,13 @@ void EXhalbtcoutsrc_Periodical(struct btc_coexist *pBtCoexist)
|
|||
|
||||
void EXhalbtcoutsrc_SetAntNum(u8 type, u8 antNum)
|
||||
{
|
||||
if (BT_COEX_ANT_TYPE_PG == type) {
|
||||
if (type == BT_COEX_ANT_TYPE_PG) {
|
||||
GLBtCoexist.boardInfo.pgAntNum = antNum;
|
||||
GLBtCoexist.boardInfo.btdmAntNum = antNum;
|
||||
} else if (BT_COEX_ANT_TYPE_ANTDIV == type) {
|
||||
} else if (type == BT_COEX_ANT_TYPE_ANTDIV) {
|
||||
GLBtCoexist.boardInfo.btdmAntNum = antNum;
|
||||
/* GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT; */
|
||||
} else if (BT_COEX_ANT_TYPE_DETECTED == type) {
|
||||
} else if (type == BT_COEX_ANT_TYPE_DETECTED) {
|
||||
GLBtCoexist.boardInfo.btdmAntNum = antNum;
|
||||
/* GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT; */
|
||||
}
|
||||
|
|
|
|||
|
|
@ -890,15 +890,14 @@ static u32 Array_kfreemap[] = {
|
|||
void rtw_bb_rf_gain_offset(struct adapter *padapter)
|
||||
{
|
||||
u8 value = padapter->eeprompriv.EEPROMRFGainOffset;
|
||||
u32 res, i = 0;
|
||||
u32 *Array = Array_kfreemap;
|
||||
u32 v1 = 0, v2 = 0, target = 0;
|
||||
u32 i = 0;
|
||||
|
||||
if (value & BIT4) {
|
||||
if (padapter->eeprompriv.EEPROMRFGainVal != 0xff) {
|
||||
res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
|
||||
res &= 0xfff87fff;
|
||||
/* res &= 0xfff87fff; */
|
||||
rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(Array_kfreemap); i += 2) {
|
||||
v1 = Array[i];
|
||||
v2 = Array[i+1];
|
||||
|
|
@ -909,9 +908,7 @@ void rtw_bb_rf_gain_offset(struct adapter *padapter)
|
|||
}
|
||||
PHY_SetRFReg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, BIT18|BIT17|BIT16|BIT15, target);
|
||||
|
||||
/* res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15; */
|
||||
/* rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res); */
|
||||
res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
|
||||
rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -155,9 +155,9 @@ void ODM_CfoTracking(void *pDM_VOID)
|
|||
/* 4 1.6 Big jump */
|
||||
if (pCfoTrack->bAdjust) {
|
||||
if (CFO_ave > CFO_TH_XTAL_LOW)
|
||||
Adjust_Xtal = Adjust_Xtal+((CFO_ave-CFO_TH_XTAL_LOW)>>2);
|
||||
Adjust_Xtal = Adjust_Xtal + ((CFO_ave - CFO_TH_XTAL_LOW) >> 2);
|
||||
else if (CFO_ave < (-CFO_TH_XTAL_LOW))
|
||||
Adjust_Xtal = Adjust_Xtal+((CFO_TH_XTAL_LOW-CFO_ave)>>2);
|
||||
Adjust_Xtal = Adjust_Xtal + ((CFO_TH_XTAL_LOW - CFO_ave) >> 2);
|
||||
}
|
||||
|
||||
/* 4 1.7 Adjust Crystal Cap. */
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ void odm_NHMBBInit(void *pDM_VOID)
|
|||
{
|
||||
struct dm_odm_t *pDM_Odm = (struct dm_odm_t *)pDM_VOID;
|
||||
|
||||
pDM_Odm->adaptivity_flag = 0;
|
||||
pDM_Odm->adaptivity_flag = false;
|
||||
pDM_Odm->tolerance_cnt = 3;
|
||||
pDM_Odm->NHMLastTxOkcnt = 0;
|
||||
pDM_Odm->NHMLastRxOkcnt = 0;
|
||||
|
|
|
|||
|
|
@ -501,8 +501,7 @@ void Hal_GetEfuseDefinition(
|
|||
switch (type) {
|
||||
case TYPE_EFUSE_MAX_SECTION:
|
||||
{
|
||||
u8 *pMax_section;
|
||||
pMax_section = pOut;
|
||||
u8 *pMax_section = pOut;
|
||||
|
||||
if (efuseType == EFUSE_WIFI)
|
||||
*pMax_section = EFUSE_MAX_SECTION_8723B;
|
||||
|
|
@ -513,8 +512,7 @@ void Hal_GetEfuseDefinition(
|
|||
|
||||
case TYPE_EFUSE_REAL_CONTENT_LEN:
|
||||
{
|
||||
u16 *pu2Tmp;
|
||||
pu2Tmp = pOut;
|
||||
u16 *pu2Tmp = pOut;
|
||||
|
||||
if (efuseType == EFUSE_WIFI)
|
||||
*pu2Tmp = EFUSE_REAL_CONTENT_LEN_8723B;
|
||||
|
|
@ -525,8 +523,7 @@ void Hal_GetEfuseDefinition(
|
|||
|
||||
case TYPE_AVAILABLE_EFUSE_BYTES_BANK:
|
||||
{
|
||||
u16 *pu2Tmp;
|
||||
pu2Tmp = pOut;
|
||||
u16 *pu2Tmp = pOut;
|
||||
|
||||
if (efuseType == EFUSE_WIFI)
|
||||
*pu2Tmp = (EFUSE_REAL_CONTENT_LEN_8723B-EFUSE_OOB_PROTECT_BYTES);
|
||||
|
|
@ -537,8 +534,7 @@ void Hal_GetEfuseDefinition(
|
|||
|
||||
case TYPE_AVAILABLE_EFUSE_BYTES_TOTAL:
|
||||
{
|
||||
u16 *pu2Tmp;
|
||||
pu2Tmp = pOut;
|
||||
u16 *pu2Tmp = pOut;
|
||||
|
||||
if (efuseType == EFUSE_WIFI)
|
||||
*pu2Tmp = (EFUSE_REAL_CONTENT_LEN_8723B-EFUSE_OOB_PROTECT_BYTES);
|
||||
|
|
@ -549,8 +545,7 @@ void Hal_GetEfuseDefinition(
|
|||
|
||||
case TYPE_EFUSE_MAP_LEN:
|
||||
{
|
||||
u16 *pu2Tmp;
|
||||
pu2Tmp = pOut;
|
||||
u16 *pu2Tmp = pOut;
|
||||
|
||||
if (efuseType == EFUSE_WIFI)
|
||||
*pu2Tmp = EFUSE_MAX_MAP_LEN;
|
||||
|
|
@ -561,8 +556,7 @@ void Hal_GetEfuseDefinition(
|
|||
|
||||
case TYPE_EFUSE_PROTECT_BYTES_BANK:
|
||||
{
|
||||
u8 *pu1Tmp;
|
||||
pu1Tmp = pOut;
|
||||
u8 *pu1Tmp = pOut;
|
||||
|
||||
if (efuseType == EFUSE_WIFI)
|
||||
*pu1Tmp = EFUSE_OOB_PROTECT_BYTES;
|
||||
|
|
@ -573,8 +567,7 @@ void Hal_GetEfuseDefinition(
|
|||
|
||||
case TYPE_EFUSE_CONTENT_LEN_BANK:
|
||||
{
|
||||
u16 *pu2Tmp;
|
||||
pu2Tmp = pOut;
|
||||
u16 *pu2Tmp = pOut;
|
||||
|
||||
if (efuseType == EFUSE_WIFI)
|
||||
*pu2Tmp = EFUSE_REAL_CONTENT_LEN_8723B;
|
||||
|
|
@ -585,8 +578,7 @@ void Hal_GetEfuseDefinition(
|
|||
|
||||
default:
|
||||
{
|
||||
u8 *pu1Tmp;
|
||||
pu1Tmp = pOut;
|
||||
u8 *pu1Tmp = pOut;
|
||||
*pu1Tmp = 0;
|
||||
}
|
||||
break;
|
||||
|
|
@ -835,9 +827,8 @@ static void hal_ReadEFuse_BT(
|
|||
}
|
||||
|
||||
if (offset < EFUSE_BT_MAX_SECTION) {
|
||||
u16 addr;
|
||||
u16 addr = offset * PGPKT_DATA_SIZE;
|
||||
|
||||
addr = offset * PGPKT_DATA_SIZE;
|
||||
for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) {
|
||||
/* Check word enable condition in the section */
|
||||
if (!(wden & (0x01<<i))) {
|
||||
|
|
@ -1196,10 +1187,9 @@ void rtl8723b_InitBeaconParameters(struct adapter *padapter)
|
|||
{
|
||||
struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
|
||||
u16 val16;
|
||||
u8 val8;
|
||||
u8 val8 = DIS_TSF_UDT;
|
||||
|
||||
|
||||
val8 = DIS_TSF_UDT;
|
||||
val16 = val8 | (val8 << 8); /* port0 and port1 */
|
||||
|
||||
/* Enable prot0 beacon function for PSTDMA */
|
||||
|
|
@ -1496,10 +1486,7 @@ s32 rtl8723b_InitLLTTable(struct adapter *padapter)
|
|||
{
|
||||
unsigned long start, passing_time;
|
||||
u32 val32;
|
||||
s32 ret;
|
||||
|
||||
|
||||
ret = _FAIL;
|
||||
s32 ret = _FAIL;
|
||||
|
||||
val32 = rtw_read32(padapter, REG_AUTO_LLT);
|
||||
val32 |= BIT_AUTO_INIT_LLT;
|
||||
|
|
@ -2273,9 +2260,8 @@ void rtl8723b_fill_fake_txdesc(
|
|||
/* Encrypt the data frame if under security mode excepct null data. Suggested by CCW. */
|
||||
/* */
|
||||
if (bDataFrame) {
|
||||
u32 EncAlg;
|
||||
u32 EncAlg = padapter->securitypriv.dot11PrivacyAlgrthm;
|
||||
|
||||
EncAlg = padapter->securitypriv.dot11PrivacyAlgrthm;
|
||||
switch (EncAlg) {
|
||||
case _NO_PRIVACY_:
|
||||
SET_TX_DESC_SEC_TYPE_8723B(pDesc, 0x0);
|
||||
|
|
@ -2378,9 +2364,7 @@ static void hw_var_set_opmode(struct adapter *padapter, u8 variable, u8 *val)
|
|||
static void hw_var_set_macaddr(struct adapter *padapter, u8 variable, u8 *val)
|
||||
{
|
||||
u8 idx = 0;
|
||||
u32 reg_macid;
|
||||
|
||||
reg_macid = REG_MACID;
|
||||
u32 reg_macid = REG_MACID;
|
||||
|
||||
for (idx = 0 ; idx < 6; idx++)
|
||||
rtw_write8(GET_PRIMARY_ADAPTER(padapter), (reg_macid+idx), val[idx]);
|
||||
|
|
@ -2389,9 +2373,7 @@ static void hw_var_set_macaddr(struct adapter *padapter, u8 variable, u8 *val)
|
|||
static void hw_var_set_bssid(struct adapter *padapter, u8 variable, u8 *val)
|
||||
{
|
||||
u8 idx = 0;
|
||||
u32 reg_bssid;
|
||||
|
||||
reg_bssid = REG_BSSID;
|
||||
u32 reg_bssid = REG_BSSID;
|
||||
|
||||
for (idx = 0 ; idx < 6; idx++)
|
||||
rtw_write8(padapter, (reg_bssid+idx), val[idx]);
|
||||
|
|
@ -2399,9 +2381,7 @@ static void hw_var_set_bssid(struct adapter *padapter, u8 variable, u8 *val)
|
|||
|
||||
static void hw_var_set_bcn_func(struct adapter *padapter, u8 variable, u8 *val)
|
||||
{
|
||||
u32 bcn_ctrl_reg;
|
||||
|
||||
bcn_ctrl_reg = REG_BCN_CTRL;
|
||||
u32 bcn_ctrl_reg = REG_BCN_CTRL;
|
||||
|
||||
if (*(u8 *)val)
|
||||
rtw_write8(padapter, bcn_ctrl_reg, (EN_BCN_FUNCTION | EN_TXBCN_RPT));
|
||||
|
|
@ -2422,12 +2402,8 @@ static void hw_var_set_correct_tsf(struct adapter *padapter, u8 variable, u8 *va
|
|||
{
|
||||
u8 val8;
|
||||
u64 tsf;
|
||||
struct mlme_ext_priv *pmlmeext;
|
||||
struct mlme_ext_info *pmlmeinfo;
|
||||
|
||||
|
||||
pmlmeext = &padapter->mlmeextpriv;
|
||||
pmlmeinfo = &pmlmeext->mlmext_info;
|
||||
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
||||
struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
|
||||
|
||||
tsf = pmlmeext->TSFValue-do_div(pmlmeext->TSFValue, (pmlmeinfo->bcn_interval*1024))-1024; /* us */
|
||||
|
||||
|
|
@ -2543,15 +2519,12 @@ static void hw_var_set_mlme_join(struct adapter *padapter, u8 variable, u8 *val)
|
|||
u8 val8;
|
||||
u16 val16;
|
||||
u32 val32;
|
||||
u8 RetryLimit;
|
||||
u8 type;
|
||||
struct mlme_priv *pmlmepriv;
|
||||
u8 RetryLimit = 0x30;
|
||||
u8 type = *(u8 *)val;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
struct eeprom_priv *pEEPROM;
|
||||
|
||||
|
||||
RetryLimit = 0x30;
|
||||
type = *(u8 *)val;
|
||||
pmlmepriv = &padapter->mlmepriv;
|
||||
pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
|
||||
|
||||
if (type == 0) { /* prepare to join */
|
||||
|
|
@ -2850,12 +2823,11 @@ void SetHwReg8723B(struct adapter *padapter, u8 variable, u8 *val)
|
|||
|
||||
case HW_VAR_ACK_PREAMBLE:
|
||||
{
|
||||
u8 regTmp;
|
||||
u8 regTmp = 0;
|
||||
u8 bShortPreamble = *val;
|
||||
|
||||
/* Joseph marked out for Netgear 3500 TKIP channel 7 issue.(Temporarily) */
|
||||
/* regTmp = (pHalData->nCur40MhzPrimeSC)<<5; */
|
||||
regTmp = 0;
|
||||
if (bShortPreamble)
|
||||
regTmp |= 0x80;
|
||||
rtw_write8(padapter, REG_RRSR+2, regTmp);
|
||||
|
|
@ -3226,9 +3198,7 @@ void GetHwReg8723B(struct adapter *padapter, u8 variable, u8 *val)
|
|||
*/
|
||||
u8 SetHalDefVar8723B(struct adapter *padapter, enum hal_def_variable variable, void *pval)
|
||||
{
|
||||
u8 bResult;
|
||||
|
||||
bResult = _SUCCESS;
|
||||
u8 bResult = _SUCCESS;
|
||||
|
||||
switch (variable) {
|
||||
default:
|
||||
|
|
@ -3244,9 +3214,7 @@ u8 SetHalDefVar8723B(struct adapter *padapter, enum hal_def_variable variable, v
|
|||
*/
|
||||
u8 GetHalDefVar8723B(struct adapter *padapter, enum hal_def_variable variable, void *pval)
|
||||
{
|
||||
u8 bResult;
|
||||
|
||||
bResult = _SUCCESS;
|
||||
u8 bResult = _SUCCESS;
|
||||
|
||||
switch (variable) {
|
||||
case HAL_DEF_MAX_RECVBUF_SZ:
|
||||
|
|
@ -3281,9 +3249,8 @@ u8 GetHalDefVar8723B(struct adapter *padapter, enum hal_def_variable variable, v
|
|||
case HW_DEF_RA_INFO_DUMP:
|
||||
{
|
||||
u8 mac_id = *(u8 *)pval;
|
||||
u32 cmd;
|
||||
u32 cmd = 0x40000100 | mac_id;
|
||||
|
||||
cmd = 0x40000100 | mac_id;
|
||||
rtw_write32(padapter, REG_HMEBOX_DBG_2_8723B, cmd);
|
||||
msleep(10);
|
||||
rtw_read32(padapter, 0x2F0); // info 1
|
||||
|
|
|
|||
|
|
@ -120,13 +120,10 @@ free_xmitbuf:
|
|||
*/
|
||||
s32 rtl8723bs_xmit_buf_handler(struct adapter *padapter)
|
||||
{
|
||||
struct xmit_priv *pxmitpriv;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
u8 queue_empty, queue_pending;
|
||||
s32 ret;
|
||||
|
||||
|
||||
pxmitpriv = &padapter->xmitpriv;
|
||||
|
||||
if (wait_for_completion_interruptible(&pxmitpriv->xmit_comp)) {
|
||||
netdev_emerg(padapter->pnetdev,
|
||||
"%s: down SdioXmitBufSema fail!\n", __func__);
|
||||
|
|
@ -357,12 +354,9 @@ static s32 xmit_xmitframes(struct adapter *padapter, struct xmit_priv *pxmitpriv
|
|||
*/
|
||||
static s32 rtl8723bs_xmit_handler(struct adapter *padapter)
|
||||
{
|
||||
struct xmit_priv *pxmitpriv;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
s32 ret;
|
||||
|
||||
|
||||
pxmitpriv = &padapter->xmitpriv;
|
||||
|
||||
if (wait_for_completion_interruptible(&pxmitpriv->SdioXmitStart)) {
|
||||
netdev_emerg(padapter->pnetdev, "%s: SdioXmitStart fail!\n",
|
||||
__func__);
|
||||
|
|
@ -408,13 +402,9 @@ next:
|
|||
|
||||
int rtl8723bs_xmit_thread(void *context)
|
||||
{
|
||||
s32 ret;
|
||||
struct adapter *padapter;
|
||||
struct xmit_priv *pxmitpriv;
|
||||
|
||||
ret = _SUCCESS;
|
||||
padapter = context;
|
||||
pxmitpriv = &padapter->xmitpriv;
|
||||
s32 ret = _SUCCESS;
|
||||
struct adapter *padapter = context;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
|
||||
allow_signal(SIGTERM);
|
||||
|
||||
|
|
@ -435,16 +425,13 @@ s32 rtl8723bs_mgnt_xmit(
|
|||
)
|
||||
{
|
||||
s32 ret = _SUCCESS;
|
||||
struct pkt_attrib *pattrib;
|
||||
struct xmit_buf *pxmitbuf;
|
||||
struct pkt_attrib *pattrib = &pmgntframe->attrib;
|
||||
struct xmit_buf *pxmitbuf = pmgntframe->pxmitbuf;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
|
||||
u8 *pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
|
||||
u8 txdesc_size = TXDESC_SIZE;
|
||||
|
||||
pattrib = &pmgntframe->attrib;
|
||||
pxmitbuf = pmgntframe->pxmitbuf;
|
||||
|
||||
rtl8723b_update_txdesc(pmgntframe, pmgntframe->buf_addr);
|
||||
|
||||
pxmitbuf->len = txdesc_size + pattrib->last_txcmdsz;
|
||||
|
|
@ -557,15 +544,13 @@ s32 rtl8723bs_init_xmit_priv(struct adapter *padapter)
|
|||
|
||||
void rtl8723bs_free_xmit_priv(struct adapter *padapter)
|
||||
{
|
||||
struct xmit_priv *pxmitpriv;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
struct xmit_buf *pxmitbuf;
|
||||
struct __queue *pqueue;
|
||||
struct __queue *pqueue = &pxmitpriv->pending_xmitbuf_queue;
|
||||
struct list_head *plist, *phead;
|
||||
struct list_head tmplist;
|
||||
|
||||
|
||||
pxmitpriv = &padapter->xmitpriv;
|
||||
pqueue = &pxmitpriv->pending_xmitbuf_queue;
|
||||
phead = get_list_head(pqueue);
|
||||
INIT_LIST_HEAD(&tmplist);
|
||||
|
||||
|
|
|
|||
|
|
@ -209,7 +209,7 @@
|
|||
#define RTL8723B_TRANS_END \
|
||||
/* format */ \
|
||||
/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, comments here*/ \
|
||||
{0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, 0, PWR_CMD_END, 0, 0},
|
||||
{0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, 0, PWR_CMD_END, 0, 0},
|
||||
|
||||
|
||||
extern struct wlan_pwr_cfg rtl8723B_power_on_flow[RTL8723B_TRANS_CARDEMU_TO_ACT_STEPS+RTL8723B_TRANS_END_STEPS];
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ struct sta_info {
|
|||
uint qos_option;
|
||||
u8 hwaddr[ETH_ALEN];
|
||||
|
||||
uint ieee8021x_blocked; /* 0: allowed, 1:blocked */
|
||||
bool ieee8021x_blocked;
|
||||
uint dot118021XPrivacy; /* aes, tkip... */
|
||||
union Keytype dot11tkiptxmickey;
|
||||
union Keytype dot11tkiprxmickey;
|
||||
|
|
|
|||
|
|
@ -45,9 +45,8 @@ void rtw_os_recv_resource_free(struct recv_priv *precvpriv)
|
|||
/* free os related resource in struct recv_buf */
|
||||
void rtw_os_recvbuf_resource_free(struct adapter *padapter, struct recv_buf *precvbuf)
|
||||
{
|
||||
if (precvbuf->pskb) {
|
||||
if (precvbuf->pskb)
|
||||
dev_kfree_skb_any(precvbuf->pskb);
|
||||
}
|
||||
}
|
||||
|
||||
struct sk_buff *rtw_os_alloc_msdu_pkt(union recv_frame *prframe, u16 nSubframe_Length, u8 *pdata)
|
||||
|
|
@ -160,21 +159,19 @@ void rtw_handle_tkip_mic_err(struct adapter *padapter, u8 bgroup)
|
|||
}
|
||||
}
|
||||
|
||||
if (bgroup) {
|
||||
if (bgroup)
|
||||
key_type |= NL80211_KEYTYPE_GROUP;
|
||||
} else {
|
||||
else
|
||||
key_type |= NL80211_KEYTYPE_PAIRWISE;
|
||||
}
|
||||
|
||||
cfg80211_michael_mic_failure(padapter->pnetdev, (u8 *)&pmlmepriv->assoc_bssid[0], key_type, -1,
|
||||
NULL, GFP_ATOMIC);
|
||||
|
||||
memset(&ev, 0x00, sizeof(ev));
|
||||
if (bgroup) {
|
||||
if (bgroup)
|
||||
ev.flags |= IW_MICFAILURE_GROUP;
|
||||
} else {
|
||||
else
|
||||
ev.flags |= IW_MICFAILURE_PAIRWISE;
|
||||
}
|
||||
|
||||
ev.src_addr.sa_family = ARPHRD_ETHER;
|
||||
memcpy(ev.src_addr.sa_data, &pmlmepriv->assoc_bssid[0], ETH_ALEN);
|
||||
|
|
|
|||
|
|
@ -3,5 +3,4 @@ obj-$(CONFIG_FB_SM750) += sm750fb.o
|
|||
|
||||
sm750fb-objs := sm750.o sm750_hw.o sm750_accel.o sm750_cursor.o \
|
||||
ddk750_chip.o ddk750_power.o ddk750_mode.o \
|
||||
ddk750_display.o ddk750_swi2c.o ddk750_sii164.o \
|
||||
ddk750_dvi.o ddk750_hwi2c.o
|
||||
ddk750_display.o ddk750_swi2c.o
|
||||
|
|
|
|||
|
|
@ -3,9 +3,6 @@ TODO:
|
|||
- use kernel coding style
|
||||
- refine the code and remove unused code
|
||||
- Implement hardware acceleration for imageblit if image->depth > 1
|
||||
- check on hardware effects of removal of USE_HW_I2C and USE_DVICHIP (these two
|
||||
are supposed to be sample code which is given here if someone wants to
|
||||
use those functionalities)
|
||||
- must be ported to the atomic kms framework in the drm subsystem (which will
|
||||
give you a basic fbdev driver for free)
|
||||
|
||||
|
|
|
|||
|
|
@ -14,8 +14,5 @@
|
|||
#include "ddk750_chip.h"
|
||||
#include "ddk750_display.h"
|
||||
#include "ddk750_power.h"
|
||||
#ifdef USE_HW_I2C
|
||||
#include "ddk750_hwi2c.h"
|
||||
#endif
|
||||
#include "ddk750_swi2c.h"
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
#include "ddk750_chip.h"
|
||||
#include "ddk750_display.h"
|
||||
#include "ddk750_power.h"
|
||||
#include "ddk750_dvi.h"
|
||||
|
||||
static void set_display_control(int ctrl, int disp_state)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,62 +0,0 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
#define USE_DVICHIP
|
||||
#ifdef USE_DVICHIP
|
||||
#include "ddk750_chip.h"
|
||||
#include "ddk750_reg.h"
|
||||
#include "ddk750_dvi.h"
|
||||
#include "ddk750_sii164.h"
|
||||
|
||||
/*
|
||||
* This global variable contains all the supported driver and its corresponding
|
||||
* function API. Please set the function pointer to NULL whenever the function
|
||||
* is not supported.
|
||||
*/
|
||||
static struct dvi_ctrl_device dcft_supported_dvi_controller[] = {
|
||||
#ifdef DVI_CTRL_SII164
|
||||
{
|
||||
.init = sii164_init_chip,
|
||||
.get_vendor_id = sii164_get_vendor_id,
|
||||
.get_device_id = sii164GetDeviceID,
|
||||
#ifdef SII164_FULL_FUNCTIONS
|
||||
.reset_chip = sii164ResetChip,
|
||||
.get_chip_string = sii164GetChipString,
|
||||
.set_power = sii164SetPower,
|
||||
.enable_hot_plug_detection = sii164EnableHotPlugDetection,
|
||||
.is_connected = sii164IsConnected,
|
||||
.check_interrupt = sii164CheckInterrupt,
|
||||
.clear_interrupt = sii164ClearInterrupt,
|
||||
#endif
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
int dvi_init(unsigned char edge_select,
|
||||
unsigned char bus_select,
|
||||
unsigned char dual_edge_clk_select,
|
||||
unsigned char hsync_enable,
|
||||
unsigned char vsync_enable,
|
||||
unsigned char deskew_enable,
|
||||
unsigned char deskew_setting,
|
||||
unsigned char continuous_sync_enable,
|
||||
unsigned char pll_filter_enable,
|
||||
unsigned char pll_filter_value)
|
||||
{
|
||||
struct dvi_ctrl_device *current_dvi_ctrl;
|
||||
|
||||
current_dvi_ctrl = dcft_supported_dvi_controller;
|
||||
if (current_dvi_ctrl->init) {
|
||||
return current_dvi_ctrl->init(edge_select,
|
||||
bus_select,
|
||||
dual_edge_clk_select,
|
||||
hsync_enable,
|
||||
vsync_enable,
|
||||
deskew_enable,
|
||||
deskew_setting,
|
||||
continuous_sync_enable,
|
||||
pll_filter_enable,
|
||||
pll_filter_value);
|
||||
}
|
||||
return -1; /* error */
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef DDK750_DVI_H__
|
||||
#define DDK750_DVI_H__
|
||||
|
||||
/* dvi chip stuffs structros */
|
||||
|
||||
typedef long (*PFN_DVICTRL_INIT)(unsigned char edge_select,
|
||||
unsigned char bus_select,
|
||||
unsigned char dual_edge_clk_select,
|
||||
unsigned char hsync_enable,
|
||||
unsigned char vsync_enable,
|
||||
unsigned char deskew_enable,
|
||||
unsigned char deskew_setting,
|
||||
unsigned char continuous_sync_enable,
|
||||
unsigned char pll_filter_enable,
|
||||
unsigned char pll_filter_value);
|
||||
|
||||
typedef void (*PFN_DVICTRL_RESETCHIP)(void);
|
||||
typedef char* (*PFN_DVICTRL_GETCHIPSTRING)(void);
|
||||
typedef unsigned short (*PFN_DVICTRL_GETVENDORID)(void);
|
||||
typedef unsigned short (*PFN_DVICTRL_GETDEVICEID)(void);
|
||||
typedef void (*PFN_DVICTRL_SETPOWER)(unsigned char power_up);
|
||||
typedef void (*PFN_DVICTRL_HOTPLUGDETECTION)(unsigned char enable_hot_plug);
|
||||
typedef unsigned char (*PFN_DVICTRL_ISCONNECTED)(void);
|
||||
typedef unsigned char (*PFN_DVICTRL_CHECKINTERRUPT)(void);
|
||||
typedef void (*PFN_DVICTRL_CLEARINTERRUPT)(void);
|
||||
|
||||
/* Structure to hold all the function pointer to the DVI Controller. */
|
||||
struct dvi_ctrl_device {
|
||||
PFN_DVICTRL_INIT init;
|
||||
PFN_DVICTRL_RESETCHIP reset_chip;
|
||||
PFN_DVICTRL_GETCHIPSTRING get_chip_string;
|
||||
PFN_DVICTRL_GETVENDORID get_vendor_id;
|
||||
PFN_DVICTRL_GETDEVICEID get_device_id;
|
||||
PFN_DVICTRL_SETPOWER set_power;
|
||||
PFN_DVICTRL_HOTPLUGDETECTION enable_hot_plug_detection;
|
||||
PFN_DVICTRL_ISCONNECTED is_connected;
|
||||
PFN_DVICTRL_CHECKINTERRUPT check_interrupt;
|
||||
PFN_DVICTRL_CLEARINTERRUPT clear_interrupt;
|
||||
};
|
||||
|
||||
#define DVI_CTRL_SII164
|
||||
|
||||
/* dvi functions prototype */
|
||||
int dvi_init(unsigned char edge_select,
|
||||
unsigned char bus_select,
|
||||
unsigned char dual_edge_clk_select,
|
||||
unsigned char hsync_enable,
|
||||
unsigned char vsync_enable,
|
||||
unsigned char deskew_enable,
|
||||
unsigned char deskew_setting,
|
||||
unsigned char continuous_sync_enable,
|
||||
unsigned char pll_filter_enable,
|
||||
unsigned char pll_filter_value);
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -1,247 +0,0 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
#define USE_HW_I2C
|
||||
#ifdef USE_HW_I2C
|
||||
#include "ddk750_chip.h"
|
||||
#include "ddk750_reg.h"
|
||||
#include "ddk750_hwi2c.h"
|
||||
#include "ddk750_power.h"
|
||||
|
||||
#define MAX_HWI2C_FIFO 16
|
||||
#define HWI2C_WAIT_TIMEOUT 0xF0000
|
||||
|
||||
int sm750_hw_i2c_init(unsigned char bus_speed_mode)
|
||||
{
|
||||
unsigned int value;
|
||||
|
||||
/* Enable GPIO 30 & 31 as IIC clock & data */
|
||||
value = peek32(GPIO_MUX);
|
||||
|
||||
value |= (GPIO_MUX_30 | GPIO_MUX_31);
|
||||
poke32(GPIO_MUX, value);
|
||||
|
||||
/*
|
||||
* Enable Hardware I2C power.
|
||||
* TODO: Check if we need to enable GPIO power?
|
||||
*/
|
||||
sm750_enable_i2c(1);
|
||||
|
||||
/* Enable the I2C Controller and set the bus speed mode */
|
||||
value = peek32(I2C_CTRL) & ~(I2C_CTRL_MODE | I2C_CTRL_EN);
|
||||
if (bus_speed_mode)
|
||||
value |= I2C_CTRL_MODE;
|
||||
value |= I2C_CTRL_EN;
|
||||
poke32(I2C_CTRL, value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void sm750_hw_i2c_close(void)
|
||||
{
|
||||
unsigned int value;
|
||||
|
||||
/* Disable I2C controller */
|
||||
value = peek32(I2C_CTRL) & ~I2C_CTRL_EN;
|
||||
poke32(I2C_CTRL, value);
|
||||
|
||||
/* Disable I2C Power */
|
||||
sm750_enable_i2c(0);
|
||||
|
||||
/* Set GPIO 30 & 31 back as GPIO pins */
|
||||
value = peek32(GPIO_MUX);
|
||||
value &= ~GPIO_MUX_30;
|
||||
value &= ~GPIO_MUX_31;
|
||||
poke32(GPIO_MUX, value);
|
||||
}
|
||||
|
||||
static long hw_i2c_wait_tx_done(void)
|
||||
{
|
||||
unsigned int timeout;
|
||||
|
||||
/* Wait until the transfer is completed. */
|
||||
timeout = HWI2C_WAIT_TIMEOUT;
|
||||
while (!(peek32(I2C_STATUS) & I2C_STATUS_TX) && (timeout != 0))
|
||||
timeout--;
|
||||
|
||||
if (timeout == 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function writes data to the i2c slave device registers.
|
||||
*
|
||||
* Parameters:
|
||||
* addr - i2c Slave device address
|
||||
* length - Total number of bytes to be written to the device
|
||||
* buf - The buffer that contains the data to be written to the
|
||||
* i2c device.
|
||||
*
|
||||
* Return Value:
|
||||
* Total number of bytes those are actually written.
|
||||
*/
|
||||
static unsigned int hw_i2c_write_data(unsigned char addr,
|
||||
unsigned int length,
|
||||
unsigned char *buf)
|
||||
{
|
||||
unsigned char count, i;
|
||||
unsigned int total_bytes = 0;
|
||||
|
||||
/* Set the Device Address */
|
||||
poke32(I2C_SLAVE_ADDRESS, addr & ~0x01);
|
||||
|
||||
/*
|
||||
* Write data.
|
||||
* Note:
|
||||
* Only 16 byte can be accessed per i2c start instruction.
|
||||
*/
|
||||
do {
|
||||
/*
|
||||
* Reset I2C by writing 0 to I2C_RESET register to
|
||||
* clear the previous status.
|
||||
*/
|
||||
poke32(I2C_RESET, 0);
|
||||
|
||||
/* Set the number of bytes to be written */
|
||||
if (length < MAX_HWI2C_FIFO)
|
||||
count = length - 1;
|
||||
else
|
||||
count = MAX_HWI2C_FIFO - 1;
|
||||
poke32(I2C_BYTE_COUNT, count);
|
||||
|
||||
/* Move the data to the I2C data register */
|
||||
for (i = 0; i <= count; i++)
|
||||
poke32(I2C_DATA0 + i, *buf++);
|
||||
|
||||
/* Start the I2C */
|
||||
poke32(I2C_CTRL, peek32(I2C_CTRL) | I2C_CTRL_CTRL);
|
||||
|
||||
/* Wait until the transfer is completed. */
|
||||
if (hw_i2c_wait_tx_done() != 0)
|
||||
break;
|
||||
|
||||
/* Subtract length */
|
||||
length -= (count + 1);
|
||||
|
||||
/* Total byte written */
|
||||
total_bytes += (count + 1);
|
||||
|
||||
} while (length > 0);
|
||||
|
||||
return total_bytes;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function reads data from the slave device and stores them
|
||||
* in the given buffer
|
||||
*
|
||||
* Parameters:
|
||||
* addr - i2c Slave device address
|
||||
* length - Total number of bytes to be read
|
||||
* buf - Pointer to a buffer to be filled with the data read
|
||||
* from the slave device. It has to be the same size as the
|
||||
* length to make sure that it can keep all the data read.
|
||||
*
|
||||
* Return Value:
|
||||
* Total number of actual bytes read from the slave device
|
||||
*/
|
||||
static unsigned int hw_i2c_read_data(unsigned char addr,
|
||||
unsigned int length,
|
||||
unsigned char *buf)
|
||||
{
|
||||
unsigned char count, i;
|
||||
unsigned int total_bytes = 0;
|
||||
|
||||
/* Set the Device Address */
|
||||
poke32(I2C_SLAVE_ADDRESS, addr | 0x01);
|
||||
|
||||
/*
|
||||
* Read data and save them to the buffer.
|
||||
* Note:
|
||||
* Only 16 byte can be accessed per i2c start instruction.
|
||||
*/
|
||||
do {
|
||||
/*
|
||||
* Reset I2C by writing 0 to I2C_RESET register to
|
||||
* clear all the status.
|
||||
*/
|
||||
poke32(I2C_RESET, 0);
|
||||
|
||||
/* Set the number of bytes to be read */
|
||||
if (length <= MAX_HWI2C_FIFO)
|
||||
count = length - 1;
|
||||
else
|
||||
count = MAX_HWI2C_FIFO - 1;
|
||||
poke32(I2C_BYTE_COUNT, count);
|
||||
|
||||
/* Start the I2C */
|
||||
poke32(I2C_CTRL, peek32(I2C_CTRL) | I2C_CTRL_CTRL);
|
||||
|
||||
/* Wait until transaction done. */
|
||||
if (hw_i2c_wait_tx_done() != 0)
|
||||
break;
|
||||
|
||||
/* Save the data to the given buffer */
|
||||
for (i = 0; i <= count; i++)
|
||||
*buf++ = peek32(I2C_DATA0 + i);
|
||||
|
||||
/* Subtract length by 16 */
|
||||
length -= (count + 1);
|
||||
|
||||
/* Number of bytes read. */
|
||||
total_bytes += (count + 1);
|
||||
|
||||
} while (length > 0);
|
||||
|
||||
return total_bytes;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function reads the slave device's register
|
||||
*
|
||||
* Parameters:
|
||||
* deviceAddress - i2c Slave device address which register
|
||||
* to be read from
|
||||
* registerIndex - Slave device's register to be read
|
||||
*
|
||||
* Return Value:
|
||||
* Register value
|
||||
*/
|
||||
unsigned char sm750_hw_i2c_read_reg(unsigned char addr, unsigned char reg)
|
||||
{
|
||||
unsigned char value = 0xFF;
|
||||
|
||||
if (hw_i2c_write_data(addr, 1, ®) == 1)
|
||||
hw_i2c_read_data(addr, 1, &value);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function writes a value to the slave device's register
|
||||
*
|
||||
* Parameters:
|
||||
* deviceAddress - i2c Slave device address which register
|
||||
* to be written
|
||||
* registerIndex - Slave device's register to be written
|
||||
* data - Data to be written to the register
|
||||
*
|
||||
* Result:
|
||||
* 0 - Success
|
||||
* -1 - Fail
|
||||
*/
|
||||
int sm750_hw_i2c_write_reg(unsigned char addr,
|
||||
unsigned char reg,
|
||||
unsigned char data)
|
||||
{
|
||||
unsigned char value[2];
|
||||
|
||||
value[0] = reg;
|
||||
value[1] = data;
|
||||
if (hw_i2c_write_data(addr, 2, value) == 2)
|
||||
return 0;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef DDK750_HWI2C_H__
|
||||
#define DDK750_HWI2C_H__
|
||||
|
||||
/* hwi2c functions */
|
||||
int sm750_hw_i2c_init(unsigned char bus_speed_mode);
|
||||
void sm750_hw_i2c_close(void);
|
||||
|
||||
unsigned char sm750_hw_i2c_read_reg(unsigned char addr, unsigned char reg);
|
||||
int sm750_hw_i2c_write_reg(unsigned char addr, unsigned char reg,
|
||||
unsigned char data);
|
||||
#endif
|
||||
|
|
@ -3,10 +3,10 @@
|
|||
#define DDK750_POWER_H__
|
||||
|
||||
enum dpms {
|
||||
crtDPMS_ON = 0x0,
|
||||
crtDPMS_STANDBY = 0x1,
|
||||
crtDPMS_SUSPEND = 0x2,
|
||||
crtDPMS_OFF = 0x3,
|
||||
CRT_DPMS_ON = 0x0,
|
||||
CRT_DPMS_STANDBY = 0x1,
|
||||
CRT_DPMS_SUSPEND = 0x2,
|
||||
CRT_DPMS_OFF = 0x3,
|
||||
};
|
||||
|
||||
#define set_DAC(off) { \
|
||||
|
|
|
|||
|
|
@ -1,408 +0,0 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
#define USE_DVICHIP
|
||||
#ifdef USE_DVICHIP
|
||||
|
||||
#include "ddk750_sii164.h"
|
||||
#include "ddk750_hwi2c.h"
|
||||
|
||||
/* I2C Address of each SII164 chip */
|
||||
#define SII164_I2C_ADDRESS 0x70
|
||||
|
||||
/* Define this definition to use hardware i2c. */
|
||||
#define USE_HW_I2C
|
||||
|
||||
#ifdef USE_HW_I2C
|
||||
#define i2cWriteReg sm750_hw_i2c_write_reg
|
||||
#define i2cReadReg sm750_hw_i2c_read_reg
|
||||
#else
|
||||
#define i2cWriteReg sm750_sw_i2c_write_reg
|
||||
#define i2cReadReg sm750_sw_i2c_read_reg
|
||||
#endif
|
||||
|
||||
/* SII164 Vendor and Device ID */
|
||||
#define SII164_VENDOR_ID 0x0001
|
||||
#define SII164_DEVICE_ID 0x0006
|
||||
|
||||
#ifdef SII164_FULL_FUNCTIONS
|
||||
/* Name of the DVI Controller chip */
|
||||
static char *gDviCtrlChipName = "Silicon Image SiI 164";
|
||||
#endif
|
||||
|
||||
/*
|
||||
* sii164_get_vendor_id
|
||||
* This function gets the vendor ID of the DVI controller chip.
|
||||
*
|
||||
* Output:
|
||||
* Vendor ID
|
||||
*/
|
||||
unsigned short sii164_get_vendor_id(void)
|
||||
{
|
||||
unsigned short vendorID;
|
||||
|
||||
vendorID = ((unsigned short)i2cReadReg(SII164_I2C_ADDRESS,
|
||||
SII164_VENDOR_ID_HIGH) << 8) |
|
||||
(unsigned short)i2cReadReg(SII164_I2C_ADDRESS,
|
||||
SII164_VENDOR_ID_LOW);
|
||||
|
||||
return vendorID;
|
||||
}
|
||||
|
||||
/*
|
||||
* sii164GetDeviceID
|
||||
* This function gets the device ID of the DVI controller chip.
|
||||
*
|
||||
* Output:
|
||||
* Device ID
|
||||
*/
|
||||
unsigned short sii164GetDeviceID(void)
|
||||
{
|
||||
unsigned short deviceID;
|
||||
|
||||
deviceID = ((unsigned short)i2cReadReg(SII164_I2C_ADDRESS,
|
||||
SII164_DEVICE_ID_HIGH) << 8) |
|
||||
(unsigned short)i2cReadReg(SII164_I2C_ADDRESS,
|
||||
SII164_DEVICE_ID_LOW);
|
||||
|
||||
return deviceID;
|
||||
}
|
||||
|
||||
/*
|
||||
* DVI.C will handle all SiI164 chip stuffs and try its best to make code
|
||||
* minimal and useful
|
||||
*/
|
||||
|
||||
/*
|
||||
* sii164_init_chip
|
||||
* This function initialize and detect the DVI controller chip.
|
||||
*
|
||||
* Input:
|
||||
* edge_select - Edge Select:
|
||||
* 0 = Input data is falling edge latched (falling
|
||||
* edge latched first in dual edge mode)
|
||||
* 1 = Input data is rising edge latched (rising
|
||||
* edge latched first in dual edge mode)
|
||||
* bus_select - Input Bus Select:
|
||||
* 0 = Input data bus is 12-bits wide
|
||||
* 1 = Input data bus is 24-bits wide
|
||||
* dual_edge_clk_select - Dual Edge Clock Select
|
||||
* 0 = Input data is single edge latched
|
||||
* 1 = Input data is dual edge latched
|
||||
* hsync_enable - Horizontal Sync Enable:
|
||||
* 0 = HSYNC input is transmitted as fixed LOW
|
||||
* 1 = HSYNC input is transmitted as is
|
||||
* vsync_enable - Vertical Sync Enable:
|
||||
* 0 = VSYNC input is transmitted as fixed LOW
|
||||
* 1 = VSYNC input is transmitted as is
|
||||
* deskew_enable - De-skewing Enable:
|
||||
* 0 = De-skew disabled
|
||||
* 1 = De-skew enabled
|
||||
* deskew_setting - De-skewing Setting (increment of 260psec)
|
||||
* 0 = 1 step --> minimum setup / maximum hold
|
||||
* 1 = 2 step
|
||||
* 2 = 3 step
|
||||
* 3 = 4 step
|
||||
* 4 = 5 step
|
||||
* 5 = 6 step
|
||||
* 6 = 7 step
|
||||
* 7 = 8 step --> maximum setup / minimum hold
|
||||
* continuous_sync_enable- SYNC Continuous:
|
||||
* 0 = Disable
|
||||
* 1 = Enable
|
||||
* pll_filter_enable - PLL Filter Enable
|
||||
* 0 = Disable PLL Filter
|
||||
* 1 = Enable PLL Filter
|
||||
* pll_filter_value - PLL Filter characteristics:
|
||||
* 0~7 (recommended value is 4)
|
||||
*
|
||||
* Output:
|
||||
* 0 - Success
|
||||
* -1 - Fail.
|
||||
*/
|
||||
long sii164_init_chip(unsigned char edge_select,
|
||||
unsigned char bus_select,
|
||||
unsigned char dual_edge_clk_select,
|
||||
unsigned char hsync_enable,
|
||||
unsigned char vsync_enable,
|
||||
unsigned char deskew_enable,
|
||||
unsigned char deskew_setting,
|
||||
unsigned char continuous_sync_enable,
|
||||
unsigned char pll_filter_enable,
|
||||
unsigned char pll_filter_value)
|
||||
{
|
||||
unsigned char config;
|
||||
|
||||
/* Initialize the i2c bus */
|
||||
#ifdef USE_HW_I2C
|
||||
/* Use fast mode. */
|
||||
sm750_hw_i2c_init(1);
|
||||
#else
|
||||
sm750_sw_i2c_init(DEFAULT_I2C_SCL, DEFAULT_I2C_SDA);
|
||||
#endif
|
||||
|
||||
/* Check if SII164 Chip exists */
|
||||
if ((sii164_get_vendor_id() == SII164_VENDOR_ID) &&
|
||||
(sii164GetDeviceID() == SII164_DEVICE_ID)) {
|
||||
/*
|
||||
* Initialize SII164 controller chip.
|
||||
*/
|
||||
|
||||
/* Select the edge */
|
||||
if (edge_select == 0)
|
||||
config = SII164_CONFIGURATION_LATCH_FALLING;
|
||||
else
|
||||
config = SII164_CONFIGURATION_LATCH_RISING;
|
||||
|
||||
/* Select bus wide */
|
||||
if (bus_select == 0)
|
||||
config |= SII164_CONFIGURATION_BUS_12BITS;
|
||||
else
|
||||
config |= SII164_CONFIGURATION_BUS_24BITS;
|
||||
|
||||
/* Select Dual/Single Edge Clock */
|
||||
if (dual_edge_clk_select == 0)
|
||||
config |= SII164_CONFIGURATION_CLOCK_SINGLE;
|
||||
else
|
||||
config |= SII164_CONFIGURATION_CLOCK_DUAL;
|
||||
|
||||
/* Select HSync Enable */
|
||||
if (hsync_enable == 0)
|
||||
config |= SII164_CONFIGURATION_HSYNC_FORCE_LOW;
|
||||
else
|
||||
config |= SII164_CONFIGURATION_HSYNC_AS_IS;
|
||||
|
||||
/* Select VSync Enable */
|
||||
if (vsync_enable == 0)
|
||||
config |= SII164_CONFIGURATION_VSYNC_FORCE_LOW;
|
||||
else
|
||||
config |= SII164_CONFIGURATION_VSYNC_AS_IS;
|
||||
|
||||
i2cWriteReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION, config);
|
||||
|
||||
/*
|
||||
* De-skew enabled with default 111b value.
|
||||
* This fixes some artifacts problem in some mode on board 2.2.
|
||||
* Somehow this fix does not affect board 2.1.
|
||||
*/
|
||||
if (deskew_enable == 0)
|
||||
config = SII164_DESKEW_DISABLE;
|
||||
else
|
||||
config = SII164_DESKEW_ENABLE;
|
||||
|
||||
switch (deskew_setting) {
|
||||
case 0:
|
||||
config |= SII164_DESKEW_1_STEP;
|
||||
break;
|
||||
case 1:
|
||||
config |= SII164_DESKEW_2_STEP;
|
||||
break;
|
||||
case 2:
|
||||
config |= SII164_DESKEW_3_STEP;
|
||||
break;
|
||||
case 3:
|
||||
config |= SII164_DESKEW_4_STEP;
|
||||
break;
|
||||
case 4:
|
||||
config |= SII164_DESKEW_5_STEP;
|
||||
break;
|
||||
case 5:
|
||||
config |= SII164_DESKEW_6_STEP;
|
||||
break;
|
||||
case 6:
|
||||
config |= SII164_DESKEW_7_STEP;
|
||||
break;
|
||||
case 7:
|
||||
config |= SII164_DESKEW_8_STEP;
|
||||
break;
|
||||
}
|
||||
i2cWriteReg(SII164_I2C_ADDRESS, SII164_DESKEW, config);
|
||||
|
||||
/* Enable/Disable Continuous Sync. */
|
||||
if (continuous_sync_enable == 0)
|
||||
config = SII164_PLL_FILTER_SYNC_CONTINUOUS_DISABLE;
|
||||
else
|
||||
config = SII164_PLL_FILTER_SYNC_CONTINUOUS_ENABLE;
|
||||
|
||||
/* Enable/Disable PLL Filter */
|
||||
if (pll_filter_enable == 0)
|
||||
config |= SII164_PLL_FILTER_DISABLE;
|
||||
else
|
||||
config |= SII164_PLL_FILTER_ENABLE;
|
||||
|
||||
/* Set the PLL Filter value */
|
||||
config |= ((pll_filter_value & 0x07) << 1);
|
||||
|
||||
i2cWriteReg(SII164_I2C_ADDRESS, SII164_PLL, config);
|
||||
|
||||
/* Recover from Power Down and enable output. */
|
||||
config = i2cReadReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION);
|
||||
config |= SII164_CONFIGURATION_POWER_NORMAL;
|
||||
i2cWriteReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION, config);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Return -1 if initialization fails. */
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* below sii164 function is not necessary */
|
||||
|
||||
#ifdef SII164_FULL_FUNCTIONS
|
||||
|
||||
/*
|
||||
* sii164ResetChip
|
||||
* This function resets the DVI Controller Chip.
|
||||
*/
|
||||
void sii164ResetChip(void)
|
||||
{
|
||||
/* Power down */
|
||||
sii164SetPower(0);
|
||||
sii164SetPower(1);
|
||||
}
|
||||
|
||||
/*
|
||||
* sii164GetChipString
|
||||
* This function returns a char string name of the current DVI Controller
|
||||
* chip.
|
||||
*
|
||||
* It's convenient for application need to display the chip name.
|
||||
*/
|
||||
char *sii164GetChipString(void)
|
||||
{
|
||||
return gDviCtrlChipName;
|
||||
}
|
||||
|
||||
/*
|
||||
* sii164SetPower
|
||||
* This function sets the power configuration of the DVI Controller Chip.
|
||||
*
|
||||
* Input:
|
||||
* powerUp - Flag to set the power down or up
|
||||
*/
|
||||
void sii164SetPower(unsigned char powerUp)
|
||||
{
|
||||
unsigned char config;
|
||||
|
||||
config = i2cReadReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION);
|
||||
if (powerUp == 1) {
|
||||
/* Power up the chip */
|
||||
config &= ~SII164_CONFIGURATION_POWER_MASK;
|
||||
config |= SII164_CONFIGURATION_POWER_NORMAL;
|
||||
i2cWriteReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION, config);
|
||||
} else {
|
||||
/* Power down the chip */
|
||||
config &= ~SII164_CONFIGURATION_POWER_MASK;
|
||||
config |= SII164_CONFIGURATION_POWER_DOWN;
|
||||
i2cWriteReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION, config);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* sii164SelectHotPlugDetectionMode
|
||||
* This function selects the mode of the hot plug detection.
|
||||
*/
|
||||
static
|
||||
void sii164SelectHotPlugDetectionMode(enum sii164_hot_plug_mode hotPlugMode)
|
||||
{
|
||||
unsigned char detectReg;
|
||||
|
||||
detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT) &
|
||||
~SII164_DETECT_MONITOR_SENSE_OUTPUT_FLAG;
|
||||
switch (hotPlugMode) {
|
||||
case SII164_HOTPLUG_DISABLE:
|
||||
detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_HIGH;
|
||||
break;
|
||||
case SII164_HOTPLUG_USE_MDI:
|
||||
detectReg &= ~SII164_DETECT_INTERRUPT_MASK;
|
||||
detectReg |= SII164_DETECT_INTERRUPT_BY_HTPLG_PIN;
|
||||
detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_MDI;
|
||||
break;
|
||||
case SII164_HOTPLUG_USE_RSEN:
|
||||
detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_RSEN;
|
||||
break;
|
||||
case SII164_HOTPLUG_USE_HTPLG:
|
||||
detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_HTPLG;
|
||||
break;
|
||||
}
|
||||
|
||||
i2cWriteReg(SII164_I2C_ADDRESS, SII164_DETECT, detectReg);
|
||||
}
|
||||
|
||||
/*
|
||||
* sii164EnableHotPlugDetection
|
||||
* This function enables the Hot Plug detection.
|
||||
*
|
||||
* enableHotPlug - Enable (=1) / disable (=0) Hot Plug detection
|
||||
*/
|
||||
void sii164EnableHotPlugDetection(unsigned char enableHotPlug)
|
||||
{
|
||||
unsigned char detectReg;
|
||||
|
||||
detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT);
|
||||
|
||||
/* Depending on each DVI controller, need to enable the hot plug based
|
||||
* on each individual chip design.
|
||||
*/
|
||||
if (enableHotPlug != 0)
|
||||
sii164SelectHotPlugDetectionMode(SII164_HOTPLUG_USE_MDI);
|
||||
else
|
||||
sii164SelectHotPlugDetectionMode(SII164_HOTPLUG_DISABLE);
|
||||
}
|
||||
|
||||
/*
|
||||
* sii164IsConnected
|
||||
* Check if the DVI Monitor is connected.
|
||||
*
|
||||
* Output:
|
||||
* 0 - Not Connected
|
||||
* 1 - Connected
|
||||
*/
|
||||
unsigned char sii164IsConnected(void)
|
||||
{
|
||||
unsigned char hotPlugValue;
|
||||
|
||||
hotPlugValue = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT) &
|
||||
SII164_DETECT_HOT_PLUG_STATUS_MASK;
|
||||
if (hotPlugValue == SII164_DETECT_HOT_PLUG_STATUS_ON)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* sii164CheckInterrupt
|
||||
* Checks if interrupt has occurred.
|
||||
*
|
||||
* Output:
|
||||
* 0 - No interrupt
|
||||
* 1 - Interrupt occurs
|
||||
*/
|
||||
unsigned char sii164CheckInterrupt(void)
|
||||
{
|
||||
unsigned char detectReg;
|
||||
|
||||
detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT) &
|
||||
SII164_DETECT_MONITOR_STATE_MASK;
|
||||
if (detectReg == SII164_DETECT_MONITOR_STATE_CHANGE)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* sii164ClearInterrupt
|
||||
* Clear the hot plug interrupt.
|
||||
*/
|
||||
void sii164ClearInterrupt(void)
|
||||
{
|
||||
unsigned char detectReg;
|
||||
|
||||
/* Clear the MDI interrupt */
|
||||
detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT);
|
||||
i2cWriteReg(SII164_I2C_ADDRESS, SII164_DETECT,
|
||||
detectReg | SII164_DETECT_MONITOR_STATE_CLEAR);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -1,174 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef DDK750_SII164_H__
|
||||
#define DDK750_SII164_H__
|
||||
|
||||
#define USE_DVICHIP
|
||||
|
||||
/* Hot Plug detection mode structure */
|
||||
enum sii164_hot_plug_mode {
|
||||
SII164_HOTPLUG_DISABLE = 0, /* Disable Hot Plug output bit
|
||||
* (always high).
|
||||
*/
|
||||
|
||||
SII164_HOTPLUG_USE_MDI, /* Use Monitor Detect Interrupt bit. */
|
||||
SII164_HOTPLUG_USE_RSEN, /* Use Receiver Sense detect bit. */
|
||||
SII164_HOTPLUG_USE_HTPLG /* Use Hot Plug detect bit. */
|
||||
};
|
||||
|
||||
/* Silicon Image SiI164 chip prototype */
|
||||
long sii164_init_chip(unsigned char edgeSelect,
|
||||
unsigned char busSelect,
|
||||
unsigned char dualEdgeClkSelect,
|
||||
unsigned char hsyncEnable,
|
||||
unsigned char vsyncEnable,
|
||||
unsigned char deskewEnable,
|
||||
unsigned char deskewSetting,
|
||||
unsigned char continuousSyncEnable,
|
||||
unsigned char pllFilterEnable,
|
||||
unsigned char pllFilterValue);
|
||||
|
||||
unsigned short sii164_get_vendor_id(void);
|
||||
unsigned short sii164GetDeviceID(void);
|
||||
|
||||
#ifdef SII164_FULL_FUNCTIONS
|
||||
void sii164ResetChip(void);
|
||||
char *sii164GetChipString(void);
|
||||
void sii164SetPower(unsigned char powerUp);
|
||||
void sii164EnableHotPlugDetection(unsigned char enableHotPlug);
|
||||
unsigned char sii164IsConnected(void);
|
||||
unsigned char sii164CheckInterrupt(void);
|
||||
void sii164ClearInterrupt(void);
|
||||
#endif
|
||||
/*
|
||||
* below register definition is used for
|
||||
* Silicon Image SiI164 DVI controller chip
|
||||
*/
|
||||
/*
|
||||
* Vendor ID registers
|
||||
*/
|
||||
#define SII164_VENDOR_ID_LOW 0x00
|
||||
#define SII164_VENDOR_ID_HIGH 0x01
|
||||
|
||||
/*
|
||||
* Device ID registers
|
||||
*/
|
||||
#define SII164_DEVICE_ID_LOW 0x02
|
||||
#define SII164_DEVICE_ID_HIGH 0x03
|
||||
|
||||
/*
|
||||
* Device Revision
|
||||
*/
|
||||
#define SII164_DEVICE_REVISION 0x04
|
||||
|
||||
/*
|
||||
* Frequency Limitation registers
|
||||
*/
|
||||
#define SII164_FREQUENCY_LIMIT_LOW 0x06
|
||||
#define SII164_FREQUENCY_LIMIT_HIGH 0x07
|
||||
|
||||
/*
|
||||
* Power Down and Input Signal Configuration registers
|
||||
*/
|
||||
#define SII164_CONFIGURATION 0x08
|
||||
|
||||
/* Power down (PD) */
|
||||
#define SII164_CONFIGURATION_POWER_DOWN 0x00
|
||||
#define SII164_CONFIGURATION_POWER_NORMAL 0x01
|
||||
#define SII164_CONFIGURATION_POWER_MASK 0x01
|
||||
|
||||
/* Input Edge Latch Select (EDGE) */
|
||||
#define SII164_CONFIGURATION_LATCH_FALLING 0x00
|
||||
#define SII164_CONFIGURATION_LATCH_RISING 0x02
|
||||
|
||||
/* Bus Select (BSEL) */
|
||||
#define SII164_CONFIGURATION_BUS_12BITS 0x00
|
||||
#define SII164_CONFIGURATION_BUS_24BITS 0x04
|
||||
|
||||
/* Dual Edge Clock Select (DSEL) */
|
||||
#define SII164_CONFIGURATION_CLOCK_SINGLE 0x00
|
||||
#define SII164_CONFIGURATION_CLOCK_DUAL 0x08
|
||||
|
||||
/* Horizontal Sync Enable (HEN) */
|
||||
#define SII164_CONFIGURATION_HSYNC_FORCE_LOW 0x00
|
||||
#define SII164_CONFIGURATION_HSYNC_AS_IS 0x10
|
||||
|
||||
/* Vertical Sync Enable (VEN) */
|
||||
#define SII164_CONFIGURATION_VSYNC_FORCE_LOW 0x00
|
||||
#define SII164_CONFIGURATION_VSYNC_AS_IS 0x20
|
||||
|
||||
/*
|
||||
* Detection registers
|
||||
*/
|
||||
#define SII164_DETECT 0x09
|
||||
|
||||
/* Monitor Detect Interrupt (MDI) */
|
||||
#define SII164_DETECT_MONITOR_STATE_CHANGE 0x00
|
||||
#define SII164_DETECT_MONITOR_STATE_NO_CHANGE 0x01
|
||||
#define SII164_DETECT_MONITOR_STATE_CLEAR 0x01
|
||||
#define SII164_DETECT_MONITOR_STATE_MASK 0x01
|
||||
|
||||
/* Hot Plug detect Input (HTPLG) */
|
||||
#define SII164_DETECT_HOT_PLUG_STATUS_OFF 0x00
|
||||
#define SII164_DETECT_HOT_PLUG_STATUS_ON 0x02
|
||||
#define SII164_DETECT_HOT_PLUG_STATUS_MASK 0x02
|
||||
|
||||
/* Receiver Sense (RSEN) */
|
||||
#define SII164_DETECT_RECEIVER_SENSE_NOT_DETECTED 0x00
|
||||
#define SII164_DETECT_RECEIVER_SENSE_DETECTED 0x04
|
||||
|
||||
/* Interrupt Generation Method (TSEL) */
|
||||
#define SII164_DETECT_INTERRUPT_BY_RSEN_PIN 0x00
|
||||
#define SII164_DETECT_INTERRUPT_BY_HTPLG_PIN 0x08
|
||||
#define SII164_DETECT_INTERRUPT_MASK 0x08
|
||||
|
||||
/* Monitor Sense Output (MSEN) */
|
||||
#define SII164_DETECT_MONITOR_SENSE_OUTPUT_HIGH 0x00
|
||||
#define SII164_DETECT_MONITOR_SENSE_OUTPUT_MDI 0x10
|
||||
#define SII164_DETECT_MONITOR_SENSE_OUTPUT_RSEN 0x20
|
||||
#define SII164_DETECT_MONITOR_SENSE_OUTPUT_HTPLG 0x30
|
||||
#define SII164_DETECT_MONITOR_SENSE_OUTPUT_FLAG 0x30
|
||||
|
||||
/*
|
||||
* Skewing registers
|
||||
*/
|
||||
#define SII164_DESKEW 0x0A
|
||||
|
||||
/* General Purpose Input (CTL[3:1]) */
|
||||
#define SII164_DESKEW_GENERAL_PURPOSE_INPUT_MASK 0x0E
|
||||
|
||||
/* De-skewing Enable bit (DKEN) */
|
||||
#define SII164_DESKEW_DISABLE 0x00
|
||||
#define SII164_DESKEW_ENABLE 0x10
|
||||
|
||||
/* De-skewing Setting (DK[3:1])*/
|
||||
#define SII164_DESKEW_1_STEP 0x00
|
||||
#define SII164_DESKEW_2_STEP 0x20
|
||||
#define SII164_DESKEW_3_STEP 0x40
|
||||
#define SII164_DESKEW_4_STEP 0x60
|
||||
#define SII164_DESKEW_5_STEP 0x80
|
||||
#define SII164_DESKEW_6_STEP 0xA0
|
||||
#define SII164_DESKEW_7_STEP 0xC0
|
||||
#define SII164_DESKEW_8_STEP 0xE0
|
||||
|
||||
/*
|
||||
* User Configuration Data registers (CFG 7:0)
|
||||
*/
|
||||
#define SII164_USER_CONFIGURATION 0x0B
|
||||
|
||||
/*
|
||||
* PLL registers
|
||||
*/
|
||||
#define SII164_PLL 0x0C
|
||||
|
||||
/* PLL Filter Value (PLLF) */
|
||||
#define SII164_PLL_FILTER_VALUE_MASK 0x0E
|
||||
|
||||
/* PLL Filter Enable (PFEN) */
|
||||
#define SII164_PLL_FILTER_DISABLE 0x00
|
||||
#define SII164_PLL_FILTER_ENABLE 0x01
|
||||
|
||||
/* Sync Continuous (SCNT) */
|
||||
#define SII164_PLL_FILTER_SYNC_CONTINUOUS_DISABLE 0x00
|
||||
#define SII164_PLL_FILTER_SYNC_CONTINUOUS_ENABLE 0x80
|
||||
|
||||
#endif
|
||||
|
|
@ -120,12 +120,12 @@ static int lynxfb_ops_cursor(struct fb_info *info, struct fb_cursor *fbcursor)
|
|||
|
||||
sm750_hw_cursor_disable(cursor);
|
||||
if (fbcursor->set & FB_CUR_SETSIZE)
|
||||
sm750_hw_cursor_setSize(cursor,
|
||||
sm750_hw_cursor_set_size(cursor,
|
||||
fbcursor->image.width,
|
||||
fbcursor->image.height);
|
||||
|
||||
if (fbcursor->set & FB_CUR_SETPOS)
|
||||
sm750_hw_cursor_setPos(cursor,
|
||||
sm750_hw_cursor_set_pos(cursor,
|
||||
fbcursor->image.dx - info->var.xoffset,
|
||||
fbcursor->image.dy - info->var.yoffset);
|
||||
|
||||
|
|
@ -141,14 +141,12 @@ static int lynxfb_ops_cursor(struct fb_info *info, struct fb_cursor *fbcursor)
|
|||
((info->cmap.green[fbcursor->image.bg_color] & 0xfc00) >> 5) |
|
||||
((info->cmap.blue[fbcursor->image.bg_color] & 0xf800) >> 11);
|
||||
|
||||
sm750_hw_cursor_setColor(cursor, fg, bg);
|
||||
sm750_hw_cursor_set_color(cursor, fg, bg);
|
||||
}
|
||||
|
||||
if (fbcursor->set & (FB_CUR_SETSHAPE | FB_CUR_SETIMAGE)) {
|
||||
sm750_hw_cursor_setData(cursor,
|
||||
fbcursor->rop,
|
||||
fbcursor->image.data,
|
||||
fbcursor->mask);
|
||||
sm750_hw_cursor_set_data(cursor, fbcursor->rop, fbcursor->image.data,
|
||||
fbcursor->mask);
|
||||
}
|
||||
|
||||
if (fbcursor->enable)
|
||||
|
|
@ -394,9 +392,9 @@ static int lynxfb_ops_set_par(struct fb_info *info)
|
|||
pr_err("bpp %d not supported\n", var->bits_per_pixel);
|
||||
return ret;
|
||||
}
|
||||
ret = hw_sm750_crtc_setMode(crtc, var, fix);
|
||||
ret = hw_sm750_crtc_set_mode(crtc, var, fix);
|
||||
if (!ret)
|
||||
ret = hw_sm750_output_setMode(output, var, fix);
|
||||
ret = hw_sm750_output_set_mode(output, var, fix);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -514,7 +512,7 @@ static int lynxfb_ops_check_var(struct fb_var_screeninfo *var,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return hw_sm750_crtc_checkMode(crtc, var);
|
||||
return hw_sm750_crtc_check_mode(crtc, var);
|
||||
}
|
||||
|
||||
static int lynxfb_ops_setcolreg(unsigned int regno,
|
||||
|
|
@ -547,7 +545,7 @@ static int lynxfb_ops_setcolreg(unsigned int regno,
|
|||
red >>= 8;
|
||||
green >>= 8;
|
||||
blue >>= 8;
|
||||
ret = hw_sm750_setColReg(crtc, regno, red, green, blue);
|
||||
ret = hw_sm750_set_col_reg(crtc, regno, red, green, blue);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
|
|
@ -608,10 +606,10 @@ static int sm750fb_set_drv(struct lynxfb_par *par)
|
|||
crtc->ywrapstep = 0;
|
||||
|
||||
output->proc_setBLANK = (sm750_dev->revid == SM750LE_REVISION_ID) ?
|
||||
hw_sm750le_setBLANK : hw_sm750_setBLANK;
|
||||
hw_sm750le_set_blank : hw_sm750_set_blank;
|
||||
/* chip specific phase */
|
||||
sm750_dev->accel.de_wait = (sm750_dev->revid == SM750LE_REVISION_ID) ?
|
||||
hw_sm750le_deWait : hw_sm750_deWait;
|
||||
hw_sm750le_de_wait : hw_sm750_de_wait;
|
||||
switch (sm750_dev->dataflow) {
|
||||
case sm750_simul_pri:
|
||||
output->paths = sm750_pnc;
|
||||
|
|
|
|||
|
|
@ -193,26 +193,26 @@ static inline unsigned long ps_to_hz(unsigned int psvalue)
|
|||
|
||||
int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev);
|
||||
int hw_sm750_inithw(struct sm750_dev *sm750_dev, struct pci_dev *pdev);
|
||||
void hw_sm750_initAccel(struct sm750_dev *sm750_dev);
|
||||
int hw_sm750_deWait(void);
|
||||
int hw_sm750le_deWait(void);
|
||||
void hw_sm750_init_accel(struct sm750_dev *sm750_dev);
|
||||
int hw_sm750_de_wait(void);
|
||||
int hw_sm750le_de_wait(void);
|
||||
|
||||
int hw_sm750_output_setMode(struct lynxfb_output *output,
|
||||
struct fb_var_screeninfo *var,
|
||||
struct fb_fix_screeninfo *fix);
|
||||
int hw_sm750_output_set_mode(struct lynxfb_output *output,
|
||||
struct fb_var_screeninfo *var,
|
||||
struct fb_fix_screeninfo *fix);
|
||||
|
||||
int hw_sm750_crtc_checkMode(struct lynxfb_crtc *crtc,
|
||||
struct fb_var_screeninfo *var);
|
||||
int hw_sm750_crtc_check_mode(struct lynxfb_crtc *crtc,
|
||||
struct fb_var_screeninfo *var);
|
||||
|
||||
int hw_sm750_crtc_setMode(struct lynxfb_crtc *crtc,
|
||||
struct fb_var_screeninfo *var,
|
||||
struct fb_fix_screeninfo *fix);
|
||||
int hw_sm750_crtc_set_mode(struct lynxfb_crtc *crtc,
|
||||
struct fb_var_screeninfo *var,
|
||||
struct fb_fix_screeninfo *fix);
|
||||
|
||||
int hw_sm750_setColReg(struct lynxfb_crtc *crtc, ushort index,
|
||||
ushort red, ushort green, ushort blue);
|
||||
int hw_sm750_set_col_reg(struct lynxfb_crtc *crtc, ushort index,
|
||||
ushort red, ushort green, ushort blue);
|
||||
|
||||
int hw_sm750_setBLANK(struct lynxfb_output *output, int blank);
|
||||
int hw_sm750le_setBLANK(struct lynxfb_output *output, int blank);
|
||||
int hw_sm750_set_blank(struct lynxfb_output *output, int blank);
|
||||
int hw_sm750le_set_blank(struct lynxfb_output *output, int blank);
|
||||
int hw_sm750_pan_display(struct lynxfb_crtc *crtc,
|
||||
const struct fb_var_screeninfo *var,
|
||||
const struct fb_info *info);
|
||||
|
|
|
|||
|
|
@ -57,13 +57,13 @@ void sm750_hw_cursor_disable(struct lynx_cursor *cursor)
|
|||
poke32(HWC_ADDRESS, 0);
|
||||
}
|
||||
|
||||
void sm750_hw_cursor_setSize(struct lynx_cursor *cursor, int w, int h)
|
||||
void sm750_hw_cursor_set_size(struct lynx_cursor *cursor, int w, int h)
|
||||
{
|
||||
cursor->w = w;
|
||||
cursor->h = h;
|
||||
}
|
||||
|
||||
void sm750_hw_cursor_setPos(struct lynx_cursor *cursor, int x, int y)
|
||||
void sm750_hw_cursor_set_pos(struct lynx_cursor *cursor, int x, int y)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
|
|
@ -72,7 +72,7 @@ void sm750_hw_cursor_setPos(struct lynx_cursor *cursor, int x, int y)
|
|||
poke32(HWC_LOCATION, reg);
|
||||
}
|
||||
|
||||
void sm750_hw_cursor_setColor(struct lynx_cursor *cursor, u32 fg, u32 bg)
|
||||
void sm750_hw_cursor_set_color(struct lynx_cursor *cursor, u32 fg, u32 bg)
|
||||
{
|
||||
u32 reg = (fg << HWC_COLOR_12_2_RGB565_SHIFT) &
|
||||
HWC_COLOR_12_2_RGB565_MASK;
|
||||
|
|
@ -81,8 +81,8 @@ void sm750_hw_cursor_setColor(struct lynx_cursor *cursor, u32 fg, u32 bg)
|
|||
poke32(HWC_COLOR_3, 0xffe0);
|
||||
}
|
||||
|
||||
void sm750_hw_cursor_setData(struct lynx_cursor *cursor, u16 rop,
|
||||
const u8 *pcol, const u8 *pmsk)
|
||||
void sm750_hw_cursor_set_data(struct lynx_cursor *cursor, u16 rop,
|
||||
const u8 *pcol, const u8 *pmsk)
|
||||
{
|
||||
int i, j, count, pitch, offset;
|
||||
u8 color, mask, opr;
|
||||
|
|
@ -131,8 +131,8 @@ void sm750_hw_cursor_setData(struct lynx_cursor *cursor, u16 rop,
|
|||
}
|
||||
}
|
||||
|
||||
void sm750_hw_cursor_setData2(struct lynx_cursor *cursor, u16 rop,
|
||||
const u8 *pcol, const u8 *pmsk)
|
||||
void sm750_hw_cursor_set_data2(struct lynx_cursor *cursor, u16 rop,
|
||||
const u8 *pcol, const u8 *pmsk)
|
||||
{
|
||||
int i, j, count, pitch, offset;
|
||||
u8 color, mask;
|
||||
|
|
|
|||
|
|
@ -5,11 +5,11 @@
|
|||
/* hw_cursor_xxx works for voyager,718 and 750 */
|
||||
void sm750_hw_cursor_enable(struct lynx_cursor *cursor);
|
||||
void sm750_hw_cursor_disable(struct lynx_cursor *cursor);
|
||||
void sm750_hw_cursor_setSize(struct lynx_cursor *cursor, int w, int h);
|
||||
void sm750_hw_cursor_setPos(struct lynx_cursor *cursor, int x, int y);
|
||||
void sm750_hw_cursor_setColor(struct lynx_cursor *cursor, u32 fg, u32 bg);
|
||||
void sm750_hw_cursor_setData(struct lynx_cursor *cursor, u16 rop,
|
||||
const u8 *data, const u8 *mask);
|
||||
void sm750_hw_cursor_setData2(struct lynx_cursor *cursor, u16 rop,
|
||||
void sm750_hw_cursor_set_size(struct lynx_cursor *cursor, int w, int h);
|
||||
void sm750_hw_cursor_set_pos(struct lynx_cursor *cursor, int x, int y);
|
||||
void sm750_hw_cursor_set_color(struct lynx_cursor *cursor, u32 fg, u32 bg);
|
||||
void sm750_hw_cursor_set_data(struct lynx_cursor *cursor, u16 rop,
|
||||
const u8 *data, const u8 *mask);
|
||||
void sm750_hw_cursor_set_data2(struct lynx_cursor *cursor, u16 rop,
|
||||
const u8 *data, const u8 *mask);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -55,9 +55,8 @@ int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev)
|
|||
pr_err("mmio failed\n");
|
||||
ret = -EFAULT;
|
||||
goto exit;
|
||||
} else {
|
||||
pr_info("mmio virtual addr = %p\n", sm750_dev->pvReg);
|
||||
}
|
||||
pr_info("mmio virtual addr = %p\n", sm750_dev->pvReg);
|
||||
|
||||
sm750_dev->accel.dprBase = sm750_dev->pvReg + DE_BASE_ADDR_TYPE1;
|
||||
sm750_dev->accel.dpPortBase = sm750_dev->pvReg + DE_PORT_ADDR_TYPE1;
|
||||
|
|
@ -84,9 +83,8 @@ int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev)
|
|||
pr_err("Map video memory failed\n");
|
||||
ret = -EFAULT;
|
||||
goto exit;
|
||||
} else {
|
||||
pr_info("video memory vaddr = %p\n", sm750_dev->pvMem);
|
||||
}
|
||||
pr_info("video memory vaddr = %p\n", sm750_dev->pvMem);
|
||||
exit:
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -175,14 +173,14 @@ int hw_sm750_inithw(struct sm750_dev *sm750_dev, struct pci_dev *pdev)
|
|||
|
||||
/* init 2d engine */
|
||||
if (!sm750_dev->accel_off)
|
||||
hw_sm750_initAccel(sm750_dev);
|
||||
hw_sm750_init_accel(sm750_dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hw_sm750_output_setMode(struct lynxfb_output *output,
|
||||
struct fb_var_screeninfo *var,
|
||||
struct fb_fix_screeninfo *fix)
|
||||
int hw_sm750_output_set_mode(struct lynxfb_output *output,
|
||||
struct fb_var_screeninfo *var,
|
||||
struct fb_fix_screeninfo *fix)
|
||||
{
|
||||
int ret;
|
||||
enum disp_output disp_set;
|
||||
|
|
@ -221,8 +219,8 @@ int hw_sm750_output_setMode(struct lynxfb_output *output,
|
|||
return ret;
|
||||
}
|
||||
|
||||
int hw_sm750_crtc_checkMode(struct lynxfb_crtc *crtc,
|
||||
struct fb_var_screeninfo *var)
|
||||
int hw_sm750_crtc_check_mode(struct lynxfb_crtc *crtc,
|
||||
struct fb_var_screeninfo *var)
|
||||
{
|
||||
struct sm750_dev *sm750_dev;
|
||||
struct lynxfb_par *par = container_of(crtc, struct lynxfb_par, crtc);
|
||||
|
|
@ -247,9 +245,9 @@ int hw_sm750_crtc_checkMode(struct lynxfb_crtc *crtc,
|
|||
}
|
||||
|
||||
/* set the controller's mode for @crtc charged with @var and @fix parameters */
|
||||
int hw_sm750_crtc_setMode(struct lynxfb_crtc *crtc,
|
||||
struct fb_var_screeninfo *var,
|
||||
struct fb_fix_screeninfo *fix)
|
||||
int hw_sm750_crtc_set_mode(struct lynxfb_crtc *crtc,
|
||||
struct fb_var_screeninfo *var,
|
||||
struct fb_fix_screeninfo *fix)
|
||||
{
|
||||
int ret, fmt;
|
||||
u32 reg;
|
||||
|
|
@ -372,8 +370,8 @@ exit:
|
|||
return ret;
|
||||
}
|
||||
|
||||
int hw_sm750_setColReg(struct lynxfb_crtc *crtc, ushort index, ushort red,
|
||||
ushort green, ushort blue)
|
||||
int hw_sm750_set_col_reg(struct lynxfb_crtc *crtc, ushort index, ushort red,
|
||||
ushort green, ushort blue)
|
||||
{
|
||||
static unsigned int add[] = { PANEL_PALETTE_RAM, CRT_PALETTE_RAM };
|
||||
|
||||
|
|
@ -382,7 +380,7 @@ int hw_sm750_setColReg(struct lynxfb_crtc *crtc, ushort index, ushort red,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int hw_sm750le_setBLANK(struct lynxfb_output *output, int blank)
|
||||
int hw_sm750le_set_blank(struct lynxfb_output *output, int blank)
|
||||
{
|
||||
int dpms, crtdb;
|
||||
|
||||
|
|
@ -423,7 +421,7 @@ int hw_sm750le_setBLANK(struct lynxfb_output *output, int blank)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int hw_sm750_setBLANK(struct lynxfb_output *output, int blank)
|
||||
int hw_sm750_set_blank(struct lynxfb_output *output, int blank)
|
||||
{
|
||||
unsigned int dpms, pps, crtdb;
|
||||
|
||||
|
|
@ -476,7 +474,7 @@ int hw_sm750_setBLANK(struct lynxfb_output *output, int blank)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void hw_sm750_initAccel(struct sm750_dev *sm750_dev)
|
||||
void hw_sm750_init_accel(struct sm750_dev *sm750_dev)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
|
|
@ -506,7 +504,7 @@ void hw_sm750_initAccel(struct sm750_dev *sm750_dev)
|
|||
sm750_dev->accel.de_init(&sm750_dev->accel);
|
||||
}
|
||||
|
||||
int hw_sm750le_deWait(void)
|
||||
int hw_sm750le_de_wait(void)
|
||||
{
|
||||
int i = 0x10000000;
|
||||
unsigned int mask = DE_STATE2_DE_STATUS_BUSY | DE_STATE2_DE_FIFO_EMPTY |
|
||||
|
|
@ -523,7 +521,7 @@ int hw_sm750le_deWait(void)
|
|||
return -1;
|
||||
}
|
||||
|
||||
int hw_sm750_deWait(void)
|
||||
int hw_sm750_de_wait(void)
|
||||
{
|
||||
int i = 0x10000000;
|
||||
unsigned int mask = SYSTEM_CTRL_DE_STATUS_BUSY |
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@ static int snd_bcm2835_ctl_put(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct bcm2835_chip *chip = snd_kcontrol_chip(kcontrol);
|
||||
struct snd_ctl_elem_info info;
|
||||
int val, *valp;
|
||||
int changed = 0;
|
||||
|
||||
|
|
@ -84,6 +85,11 @@ static int snd_bcm2835_ctl_put(struct snd_kcontrol *kcontrol,
|
|||
return -EINVAL;
|
||||
|
||||
val = ucontrol->value.integer.value[0];
|
||||
|
||||
snd_bcm2835_ctl_info(kcontrol, &info);
|
||||
if (val < info.value.integer.min || val > info.value.integer.max)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&chip->audio_mutex);
|
||||
if (val != *valp) {
|
||||
*valp = val;
|
||||
|
|
|
|||
|
|
@ -533,17 +533,15 @@ static int ctrl_set_image_effect(struct bcm2835_mmal_dev *dev,
|
|||
|
||||
control = &dev->component[COMP_CAMERA]->control;
|
||||
|
||||
ret = vchiq_mmal_port_parameter_set(
|
||||
dev->instance, control,
|
||||
MMAL_PARAMETER_IMAGE_EFFECT_PARAMETERS,
|
||||
&imagefx, sizeof(imagefx));
|
||||
ret = vchiq_mmal_port_parameter_set(dev->instance, control,
|
||||
MMAL_PARAMETER_IMAGE_EFFECT_PARAMETERS,
|
||||
&imagefx, sizeof(imagefx));
|
||||
if (ret)
|
||||
goto exit;
|
||||
|
||||
ret = vchiq_mmal_port_parameter_set(
|
||||
dev->instance, control,
|
||||
MMAL_PARAMETER_COLOUR_EFFECT,
|
||||
&dev->colourfx, sizeof(dev->colourfx));
|
||||
ret = vchiq_mmal_port_parameter_set(dev->instance, control,
|
||||
MMAL_PARAMETER_COLOUR_EFFECT,
|
||||
&dev->colourfx, sizeof(dev->colourfx));
|
||||
}
|
||||
|
||||
exit:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue