Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 197871 Details for
Bug 248580
[RFE]CRM #1359436: Cannot install RHEL 5 on a system with a 3ware 9650se controller
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
3ware RHEL5 patch for 9650SE
3ware_RHEL5.patch (text/plain), 17.21 KB, created by
Adam Radford
on 2007-09-17 21:26:37 UTC
(
hide
)
Description:
3ware RHEL5 patch for 9650SE
Filename:
MIME Type:
Creator:
Adam Radford
Created:
2007-09-17 21:26:37 UTC
Size:
17.21 KB
patch
obsolete
>diff -Naur linux-2.6.18.i686/drivers/scsi/3w-9xxx.c linux-2.6.18.i686.new/drivers/scsi/3w-9xxx.c >--- linux-2.6.18.i686/drivers/scsi/3w-9xxx.c 2006-09-19 20:42:06.000000000 -0700 >+++ linux-2.6.18.i686.new/drivers/scsi/3w-9xxx.c 2007-09-17 14:07:51.000000000 -0700 >@@ -4,7 +4,7 @@ > Written By: Adam Radford <linuxraid@amcc.com> > Modifications By: Tom Couch <linuxraid@amcc.com> > >- Copyright (C) 2004-2006 Applied Micro Circuits Corporation. >+ Copyright (C) 2004-2007 Applied Micro Circuits Corporation. > > This program is free software; you can redistribute it and/or modify > it under the terms of the GNU General Public License as published by >@@ -66,6 +66,11 @@ > 2.26.02.006 - Fix 9550SX pchip reset timeout. > Add big endian support. > 2.26.02.007 - Disable local interrupts during kmap/unmap_atomic(). >+ 2.26.06.001 - Free irq handler in __twa_shutdown(). >+ Serialize reset code. >+ Add support for 9650SE controllers. >+ 2.26.06.002 - Fix dma mask setting to fallback to 32-bit if 64-bit fails. >+ 2.26.06.003 - Fix pci_unmap_single() to unmap correctly on 4GB+. > */ > > #include <linux/module.h> >@@ -89,7 +94,7 @@ > #include "3w-9xxx.h" > > /* Globals */ >-#define TW_DRIVER_VERSION "2.26.02.007" >+#define TW_DRIVER_VERSION "2.26.06.003" > static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT]; > static unsigned int twa_device_extension_count; > static int twa_major = -1; >@@ -566,9 +571,9 @@ > goto out; > } > >- tw_dev->working_srl = fw_on_ctlr_srl; >- tw_dev->working_branch = fw_on_ctlr_branch; >- tw_dev->working_build = fw_on_ctlr_build; >+ tw_dev->tw_compat_info.working_srl = fw_on_ctlr_srl; >+ tw_dev->tw_compat_info.working_branch = fw_on_ctlr_branch; >+ tw_dev->tw_compat_info.working_build = fw_on_ctlr_build; > > /* Try base mode compatibility */ > if (!(init_connect_result & TW_CTLR_FW_COMPATIBLE)) { >@@ -590,10 +595,23 @@ > } > goto out; > } >- tw_dev->working_srl = TW_BASE_FW_SRL; >- tw_dev->working_branch = TW_BASE_FW_BRANCH; >- tw_dev->working_build = TW_BASE_FW_BUILD; >- } >+ tw_dev->tw_compat_info.working_srl = TW_BASE_FW_SRL; >+ tw_dev->tw_compat_info.working_branch = TW_BASE_FW_BRANCH; >+ tw_dev->tw_compat_info.working_build = TW_BASE_FW_BUILD; >+ } >+ >+ /* Load rest of compatibility struct */ >+ strncpy(tw_dev->tw_compat_info.driver_version, TW_DRIVER_VERSION, strlen(TW_DRIVER_VERSION)); >+ tw_dev->tw_compat_info.driver_srl_high = TW_CURRENT_DRIVER_SRL; >+ tw_dev->tw_compat_info.driver_branch_high = TW_CURRENT_DRIVER_BRANCH; >+ tw_dev->tw_compat_info.driver_build_high = TW_CURRENT_DRIVER_BUILD; >+ tw_dev->tw_compat_info.driver_srl_low = TW_BASE_FW_SRL; >+ tw_dev->tw_compat_info.driver_branch_low = TW_BASE_FW_BRANCH; >+ tw_dev->tw_compat_info.driver_build_low = TW_BASE_FW_BUILD; >+ tw_dev->tw_compat_info.fw_on_ctlr_srl = fw_on_ctlr_srl; >+ tw_dev->tw_compat_info.fw_on_ctlr_branch = fw_on_ctlr_branch; >+ tw_dev->tw_compat_info.fw_on_ctlr_build = fw_on_ctlr_build; >+ > retval = 0; > out: > return retval; >@@ -631,7 +649,7 @@ > goto out2; > > /* Check data buffer size */ >- if (driver_command.buffer_length > TW_MAX_SECTORS * 512) { >+ if (driver_command.buffer_length > TW_MAX_SECTORS * 2048) { > retval = TW_IOCTL_ERROR_OS_EINVAL; > goto out2; > } >@@ -680,25 +698,13 @@ > /* Now wait for command to complete */ > timeout = wait_event_timeout(tw_dev->ioctl_wqueue, tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE, timeout); > >- /* See if we reset while waiting for the ioctl to complete */ >- if (test_bit(TW_IN_RESET, &tw_dev->flags)) { >- clear_bit(TW_IN_RESET, &tw_dev->flags); >- retval = TW_IOCTL_ERROR_OS_ERESTARTSYS; >- goto out3; >- } >- > /* We timed out, and didn't get an interrupt */ > if (tw_dev->chrdev_request_id != TW_IOCTL_CHRDEV_FREE) { > /* Now we need to reset the board */ > printk(KERN_WARNING "3w-9xxx: scsi%d: WARNING: (0x%02X:0x%04X): Character ioctl (0x%x) timed out, resetting card.\n", >- tw_dev->host->host_no, TW_DRIVER, 0xc, >+ tw_dev->host->host_no, TW_DRIVER, 0x37, > cmd); > retval = TW_IOCTL_ERROR_OS_EIO; >- spin_lock_irqsave(tw_dev->host->host_lock, flags); >- tw_dev->state[request_id] = TW_S_COMPLETED; >- twa_free_request_id(tw_dev, request_id); >- tw_dev->posted_request_count--; >- spin_unlock_irqrestore(tw_dev->host->host_lock, flags); > twa_reset_device_extension(tw_dev, 1); > goto out3; > } >@@ -717,16 +723,7 @@ > tw_ioctl->driver_command.status = 0; > /* Copy compatiblity struct into ioctl data buffer */ > tw_compat_info = (TW_Compatibility_Info *)tw_ioctl->data_buffer; >- strncpy(tw_compat_info->driver_version, TW_DRIVER_VERSION, strlen(TW_DRIVER_VERSION)); >- tw_compat_info->working_srl = tw_dev->working_srl; >- tw_compat_info->working_branch = tw_dev->working_branch; >- tw_compat_info->working_build = tw_dev->working_build; >- tw_compat_info->driver_srl_high = TW_CURRENT_DRIVER_SRL; >- tw_compat_info->driver_branch_high = TW_CURRENT_DRIVER_BRANCH; >- tw_compat_info->driver_build_high = TW_CURRENT_DRIVER_BUILD; >- tw_compat_info->driver_srl_low = TW_BASE_FW_SRL; >- tw_compat_info->driver_branch_low = TW_BASE_FW_BRANCH; >- tw_compat_info->driver_build_low = TW_BASE_FW_BUILD; >+ memcpy(tw_compat_info, &tw_dev->tw_compat_info, sizeof(TW_Compatibility_Info)); > break; > case TW_IOCTL_GET_LAST_EVENT: > if (tw_dev->event_queue_wrapped) { >@@ -895,7 +892,8 @@ > } > > if (status_reg_value & TW_STATUS_QUEUE_ERROR) { >- TW_PRINTK(tw_dev->host, TW_DRIVER, 0xe, "Controller Queue Error: clearing"); >+ if ((tw_dev->tw_pci_dev->device != PCI_DEVICE_ID_3WARE_9650SE) || (!test_bit(TW_IN_RESET, &tw_dev->flags))) >+ TW_PRINTK(tw_dev->host, TW_DRIVER, 0xe, "Controller Queue Error: clearing"); > writel(TW_CONTROL_CLEAR_QUEUE_ERROR, TW_CONTROL_REG_ADDR(tw_dev)); > } > >@@ -939,10 +937,12 @@ > unsigned long before; > int retval = 1; > >- if (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9550SX) { >+ if ((tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9550SX) || >+ (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9650SE)) { > before = jiffies; > while ((response_que_value & TW_9550SX_DRAIN_COMPLETED) != TW_9550SX_DRAIN_COMPLETED) { > response_que_value = readl(TW_RESPONSE_QUEUE_REG_ADDR_LARGE(tw_dev)); >+ msleep(1); > if (time_after(jiffies, before + HZ * 30)) > goto out; > } >@@ -1198,7 +1198,6 @@ > u32 status_reg_value; > TW_Response_Queue response_que; > TW_Command_Full *full_command_packet; >- TW_Command *command_packet; > TW_Device_Extension *tw_dev = (TW_Device_Extension *)dev_instance; > int handled = 0; > >@@ -1214,6 +1213,10 @@ > > handled = 1; > >+ /* If we are resetting, bail */ >+ if (test_bit(TW_IN_RESET, &tw_dev->flags)) >+ goto twa_interrupt_bail; >+ > /* Check controller for errors */ > if (twa_check_bits(status_reg_value)) { > if (twa_decode_bits(tw_dev, status_reg_value)) { >@@ -1272,7 +1275,6 @@ > request_id = TW_RESID_OUT(response_que.response_id); > full_command_packet = tw_dev->command_packet_virt[request_id]; > error = 0; >- command_packet = &full_command_packet->command.oldcommand; > /* Check for command packet errors */ > if (full_command_packet->command.newcommand.status != 0) { > if (tw_dev->srb[request_id] != 0) { >@@ -1355,8 +1357,8 @@ > > if (TW_OP_OUT(full_command_packet->command.newcommand.opcode__reserved) == TW_OP_EXECUTE_SCSI) { > newcommand = &full_command_packet->command.newcommand; >- newcommand->request_id__lunl = >- TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->request_id__lunl), request_id); >+ newcommand->request_id__lunl = >+ cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->request_id__lunl), request_id)); > newcommand->sg_list[0].address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1); > newcommand->sg_list[0].length = cpu_to_le32(length); > newcommand->sgl_entries__lunh = >@@ -1423,7 +1425,7 @@ > } > > cmd->SCp.phase = TW_PHASE_SINGLE; >- cmd->SCp.have_data_in = mapping; >+ cmd->SCp.dma_handle = mapping; > retval = mapping; > out: > return retval; >@@ -1531,6 +1533,13 @@ > int retval = 1; > > command_que_value = tw_dev->command_packet_phys[request_id]; >+ >+ /* For 9650SE write low 4 bytes first */ >+ if (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9650SE) { >+ command_que_value += TW_COMMAND_OFFSET; >+ writel((u32)command_que_value, TW_COMMAND_QUEUE_REG_ADDR_LARGE(tw_dev)); >+ } >+ > status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev)); > > if (twa_check_bits(status_reg_value)) >@@ -1557,13 +1566,17 @@ > TW_UNMASK_COMMAND_INTERRUPT(tw_dev); > goto out; > } else { >- /* We successfully posted the command packet */ >- if (sizeof(dma_addr_t) > 4) { >- command_que_value += TW_COMMAND_OFFSET; >- writel((u32)command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev)); >- writel((u32)((u64)command_que_value >> 32), TW_COMMAND_QUEUE_REG_ADDR(tw_dev) + 0x4); >+ if (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9650SE) { >+ /* Now write upper 4 bytes */ >+ writel((u32)((u64)command_que_value >> 32), TW_COMMAND_QUEUE_REG_ADDR_LARGE(tw_dev) + 0x4); > } else { >- writel(TW_COMMAND_OFFSET + command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev)); >+ if (sizeof(dma_addr_t) > 4) { >+ command_que_value += TW_COMMAND_OFFSET; >+ writel((u32)command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev)); >+ writel((u32)((u64)command_que_value >> 32), TW_COMMAND_QUEUE_REG_ADDR(tw_dev) + 0x4); >+ } else { >+ writel(TW_COMMAND_OFFSET + command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev)); >+ } > } > tw_dev->state[request_id] = TW_S_POSTED; > tw_dev->posted_request_count++; >@@ -1620,14 +1633,9 @@ > goto out; > > TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev); >+ clear_bit(TW_IN_RESET, &tw_dev->flags); >+ tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE; > >- /* Wake up any ioctl that was pending before the reset */ >- if ((tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE) || (ioctl_reset)) { >- clear_bit(TW_IN_RESET, &tw_dev->flags); >- } else { >- tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE; >- wake_up(&tw_dev->ioctl_wqueue); >- } > retval = 0; > out: > return retval; >@@ -1736,6 +1744,9 @@ > "WARNING: (0x%02X:0x%04X): Command (0x%x) timed out, resetting card.\n", > TW_DRIVER, 0x2c, SCpnt->cmnd[0]); > >+ /* Make sure we are not issuing an ioctl or resetting from ioctl */ >+ mutex_lock(&tw_dev->ioctl_lock); >+ > /* Now reset the card and some of the device extension data */ > if (twa_reset_device_extension(tw_dev, 0)) { > TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2b, "Controller reset failed during scsi host reset"); >@@ -1744,6 +1755,7 @@ > > retval = SUCCESS; > out: >+ mutex_unlock(&tw_dev->ioctl_lock); > return retval; > } /* End twa_scsi_eh_reset() */ > >@@ -1753,8 +1765,14 @@ > int request_id, retval; > TW_Device_Extension *tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata; > >+ /* If we are resetting due to timed out ioctl, report as busy */ >+ if (test_bit(TW_IN_RESET, &tw_dev->flags)) { >+ retval = SCSI_MLQUEUE_HOST_BUSY; >+ goto out; >+ } >+ > /* Check if this FW supports luns */ >- if ((SCpnt->device->lun != 0) && (tw_dev->working_srl < TW_FW_SRL_LUNS_SUPPORTED)) { >+ if ((SCpnt->device->lun != 0) && (tw_dev->tw_compat_info.working_srl < TW_FW_SRL_LUNS_SUPPORTED)) { > SCpnt->result = (DID_BAD_TARGET << 16); > done(SCpnt); > retval = 0; >@@ -1960,6 +1978,9 @@ > /* Disable interrupts */ > TW_DISABLE_INTERRUPTS(tw_dev); > >+ /* Free up the IRQ */ >+ free_irq(tw_dev->tw_pci_dev->irq, tw_dev); >+ > printk(KERN_WARNING "3w-9xxx: Shutting down host %d.\n", tw_dev->host->host_no); > > /* Tell the card we are shutting down */ >@@ -2000,7 +2021,7 @@ > > switch(cmd->SCp.phase) { > case TW_PHASE_SINGLE: >- pci_unmap_single(pdev, cmd->SCp.have_data_in, cmd->request_bufflen, DMA_BIDIRECTIONAL); >+ pci_unmap_single(pdev, cmd->SCp.dma_handle, cmd->request_bufflen, DMA_BIDIRECTIONAL); > break; > case TW_PHASE_SGLIST: > pci_unmap_sg(pdev, cmd->request_buffer, cmd->use_sg, DMA_BIDIRECTIONAL); >@@ -2042,11 +2063,14 @@ > > pci_set_master(pdev); > >- retval = pci_set_dma_mask(pdev, sizeof(dma_addr_t) > 4 ? DMA_64BIT_MASK : DMA_32BIT_MASK); >- if (retval) { >- TW_PRINTK(host, TW_DRIVER, 0x23, "Failed to set dma mask"); >- goto out_disable_device; >- } >+ if (pci_set_dma_mask(pdev, DMA_64BIT_MASK) >+ || pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) >+ if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) >+ || pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) { >+ TW_PRINTK(host, TW_DRIVER, 0x23, "Failed to set dma mask"); >+ retval = -ENODEV; >+ goto out_disable_device; >+ } > > host = scsi_host_alloc(&driver_template, sizeof(TW_Device_Extension)); > if (!host) { >@@ -2091,21 +2115,25 @@ > > /* Initialize the card */ > if (twa_reset_sequence(tw_dev, 0)) >- goto out_release_mem_region; >+ goto out_iounmap; > > /* Set host specific parameters */ >- host->max_id = TW_MAX_UNITS; >+ if (pdev->device == PCI_DEVICE_ID_3WARE_9650SE) >+ host->max_id = TW_MAX_UNITS_9650SE; >+ else >+ host->max_id = TW_MAX_UNITS; >+ > host->max_cmd_len = TW_MAX_CDB_LEN; > > /* Channels aren't supported by adapter */ >- host->max_lun = TW_MAX_LUNS(tw_dev->working_srl); >+ host->max_lun = TW_MAX_LUNS(tw_dev->tw_compat_info.working_srl); > host->max_channel = 0; > > /* Register the card with the kernel SCSI layer */ > retval = scsi_add_host(host, &pdev->dev); > if (retval) { > TW_PRINTK(tw_dev->host, TW_DRIVER, 0x27, "scsi add host failed"); >- goto out_release_mem_region; >+ goto out_iounmap; > } > > pci_set_drvdata(pdev, host); >@@ -2122,7 +2150,7 @@ > TW_PARAM_PORTCOUNT, TW_PARAM_PORTCOUNT_LENGTH))); > > /* Now setup the interrupt handler */ >- retval = request_irq(pdev->irq, twa_interrupt, IRQF_SHARED, "3w-9xxx", tw_dev); >+ retval = request_irq(pdev->irq, twa_interrupt, SA_SHIRQ, "3w-9xxx", tw_dev); > if (retval) { > TW_PRINTK(tw_dev->host, TW_DRIVER, 0x30, "Error requesting IRQ"); > goto out_remove_host; >@@ -2145,6 +2173,8 @@ > > out_remove_host: > scsi_remove_host(host); >+out_iounmap: >+ iounmap(tw_dev->base_addr); > out_release_mem_region: > pci_release_regions(pdev); > out_free_device_extension: >@@ -2170,12 +2200,12 @@ > twa_major = -1; > } > >- /* Free up the IRQ */ >- free_irq(tw_dev->tw_pci_dev->irq, tw_dev); >- > /* Shutdown the card */ > __twa_shutdown(tw_dev); > >+ /* Free IO remapping */ >+ iounmap(tw_dev->base_addr); >+ > /* Free up the mem region */ > pci_release_regions(pdev); > >@@ -2193,6 +2223,8 @@ > PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, > { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9550SX, > PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, >+ { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9650SE, >+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, > { } > }; > MODULE_DEVICE_TABLE(pci, twa_pci_tbl); >diff -Naur linux-2.6.18.i686/drivers/scsi/3w-9xxx.h linux-2.6.18.i686.new/drivers/scsi/3w-9xxx.h >--- linux-2.6.18.i686/drivers/scsi/3w-9xxx.h 2006-09-19 20:42:06.000000000 -0700 >+++ linux-2.6.18.i686.new/drivers/scsi/3w-9xxx.h 2007-09-17 14:07:53.000000000 -0700 >@@ -4,7 +4,7 @@ > Written By: Adam Radford <linuxraid@amcc.com> > Modifications By: Tom Couch <linuxraid@amcc.com> > >- Copyright (C) 2004-2006 Applied Micro Circuits Corporation. >+ Copyright (C) 2004-2007 Applied Micro Circuits Corporation. > > This program is free software; you can redistribute it and/or modify > it under the terms of the GNU General Public License as published by >@@ -289,7 +289,6 @@ > #define TW_STATUS_VALID_INTERRUPT 0x00DF0000 > > /* PCI related defines */ >-#define TW_NUMDEVICES 1 > #define TW_PCI_CLEAR_PARITY_ERRORS 0xc100 > #define TW_PCI_CLEAR_PCI_ABORT 0x2000 > >@@ -335,6 +334,7 @@ > #define TW_ALIGNMENT_9000 4 /* 4 bytes */ > #define TW_ALIGNMENT_9000_SGL 0x3 > #define TW_MAX_UNITS 16 >+#define TW_MAX_UNITS_9650SE 32 > #define TW_INIT_MESSAGE_CREDITS 0x100 > #define TW_INIT_COMMAND_PACKET_SIZE 0x3 > #define TW_INIT_COMMAND_PACKET_SIZE_EXTENDED 0x6 >@@ -354,7 +354,6 @@ > #define TW_MAX_RESPONSE_DRAIN 256 > #define TW_MAX_AEN_DRAIN 40 > #define TW_IN_RESET 2 >-#define TW_IN_CHRDEV_IOCTL 3 > #define TW_IN_ATTENTION_LOOP 4 > #define TW_MAX_SECTORS 256 > #define TW_AEN_WAIT_TIME 1000 >@@ -417,6 +416,9 @@ > #ifndef PCI_DEVICE_ID_3WARE_9550SX > #define PCI_DEVICE_ID_3WARE_9550SX 0x1003 > #endif >+#ifndef PCI_DEVICE_ID_3WARE_9650SE >+#define PCI_DEVICE_ID_3WARE_9650SE 0x1004 >+#endif > > /* Bitmask macros to eliminate bitfields */ > >@@ -442,6 +444,7 @@ > #define TW_CONTROL_REG_ADDR(x) (x->base_addr) > #define TW_STATUS_REG_ADDR(x) ((unsigned char __iomem *)x->base_addr + 0x4) > #define TW_COMMAND_QUEUE_REG_ADDR(x) (sizeof(dma_addr_t) > 4 ? ((unsigned char __iomem *)x->base_addr + 0x20) : ((unsigned char __iomem *)x->base_addr + 0x8)) >+#define TW_COMMAND_QUEUE_REG_ADDR_LARGE(x) ((unsigned char __iomem *)x->base_addr + 0x20) > #define TW_RESPONSE_QUEUE_REG_ADDR(x) ((unsigned char __iomem *)x->base_addr + 0xC) > #define TW_RESPONSE_QUEUE_REG_ADDR_LARGE(x) ((unsigned char __iomem *)x->base_addr + 0x30) > #define TW_CLEAR_ALL_INTERRUPTS(x) (writel(TW_STATUS_VALID_INTERRUPT, TW_CONTROL_REG_ADDR(x))) >@@ -626,6 +629,9 @@ > unsigned short driver_srl_low; > unsigned short driver_branch_low; > unsigned short driver_build_low; >+ unsigned short fw_on_ctlr_srl; >+ unsigned short fw_on_ctlr_branch; >+ unsigned short fw_on_ctlr_build; > } TW_Compatibility_Info; > > #pragma pack() >@@ -668,9 +674,7 @@ > wait_queue_head_t ioctl_wqueue; > struct mutex ioctl_lock; > char aen_clobber; >- unsigned short working_srl; >- unsigned short working_branch; >- unsigned short working_build; >+ TW_Compatibility_Info tw_compat_info; > } TW_Device_Extension; > > #endif /* _3W_9XXX_H */
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 248580
: 197871