Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* |
Andrew Vasquez | fa90c54 | 2005-10-27 11:10:08 -0700 | [diff] [blame] | 2 | * QLogic Fibre Channel HBA Driver |
Andrew Vasquez | 01e58d8 | 2008-04-03 13:13:13 -0700 | [diff] [blame] | 3 | * Copyright (c) 2003-2008 QLogic Corporation |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 4 | * |
Andrew Vasquez | fa90c54 | 2005-10-27 11:10:08 -0700 | [diff] [blame] | 5 | * See LICENSE.qla2xxx for copyright and licensing details. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 6 | */ |
| 7 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 8 | /* |
| 9 | * qla2x00_debounce_register |
| 10 | * Debounce register. |
| 11 | * |
| 12 | * Input: |
| 13 | * port = register address. |
| 14 | * |
| 15 | * Returns: |
| 16 | * register value. |
| 17 | */ |
| 18 | static __inline__ uint16_t |
Andrew Vasquez | fa2a1ce | 2005-07-06 10:32:07 -0700 | [diff] [blame] | 19 | qla2x00_debounce_register(volatile uint16_t __iomem *addr) |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 20 | { |
| 21 | volatile uint16_t first; |
| 22 | volatile uint16_t second; |
| 23 | |
| 24 | do { |
| 25 | first = RD_REG_WORD(addr); |
| 26 | barrier(); |
| 27 | cpu_relax(); |
| 28 | second = RD_REG_WORD(addr); |
| 29 | } while (first != second); |
| 30 | |
| 31 | return (first); |
| 32 | } |
| 33 | |
Andrew Vasquez | fa2a1ce | 2005-07-06 10:32:07 -0700 | [diff] [blame] | 34 | static inline void |
Anirban Chakraborty | e315cd2 | 2008-11-06 10:40:51 -0800 | [diff] [blame] | 35 | qla2x00_poll(struct rsp_que *rsp) |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 36 | { |
Andrew Vasquez | d2ba567 | 2008-05-12 22:21:14 -0700 | [diff] [blame] | 37 | unsigned long flags; |
Anirban Chakraborty | e315cd2 | 2008-11-06 10:40:51 -0800 | [diff] [blame] | 38 | struct qla_hw_data *ha = rsp->hw; |
Andrew Vasquez | d2ba567 | 2008-05-12 22:21:14 -0700 | [diff] [blame] | 39 | local_irq_save(flags); |
Anirban Chakraborty | e315cd2 | 2008-11-06 10:40:51 -0800 | [diff] [blame] | 40 | ha->isp_ops->intr_handler(0, rsp); |
Andrew Vasquez | d2ba567 | 2008-05-12 22:21:14 -0700 | [diff] [blame] | 41 | local_irq_restore(flags); |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 42 | } |
| 43 | |
Andrew Vasquez | 2b6c0ce | 2005-07-06 10:31:17 -0700 | [diff] [blame] | 44 | static inline uint8_t * |
| 45 | host_to_fcp_swap(uint8_t *fcp, uint32_t bsize) |
| 46 | { |
| 47 | uint32_t *ifcp = (uint32_t *) fcp; |
| 48 | uint32_t *ofcp = (uint32_t *) fcp; |
| 49 | uint32_t iter = bsize >> 2; |
| 50 | |
| 51 | for (; iter ; iter--) |
| 52 | *ofcp++ = swab32(*ifcp++); |
| 53 | |
| 54 | return fcp; |
| 55 | } |
Andrew Vasquez | 3d71644 | 2005-07-06 10:30:26 -0700 | [diff] [blame] | 56 | |
Andrew Vasquez | 3d71644 | 2005-07-06 10:30:26 -0700 | [diff] [blame] | 57 | static inline int |
Anirban Chakraborty | e315cd2 | 2008-11-06 10:40:51 -0800 | [diff] [blame] | 58 | qla2x00_is_reserved_id(scsi_qla_host_t *vha, uint16_t loop_id) |
Andrew Vasquez | 3d71644 | 2005-07-06 10:30:26 -0700 | [diff] [blame] | 59 | { |
Anirban Chakraborty | e315cd2 | 2008-11-06 10:40:51 -0800 | [diff] [blame] | 60 | struct qla_hw_data *ha = vha->hw; |
Andrew Vasquez | e428924 | 2007-07-19 15:05:56 -0700 | [diff] [blame] | 61 | if (IS_FWI2_CAPABLE(ha)) |
Andrew Vasquez | 3d71644 | 2005-07-06 10:30:26 -0700 | [diff] [blame] | 62 | return (loop_id > NPH_LAST_HANDLE); |
| 63 | |
Anirban Chakraborty | e315cd2 | 2008-11-06 10:40:51 -0800 | [diff] [blame] | 64 | return ((loop_id > ha->max_loop_id && loop_id < SNS_FIRST_LOOP_ID) || |
Andrew Vasquez | 3d71644 | 2005-07-06 10:30:26 -0700 | [diff] [blame] | 65 | loop_id == MANAGEMENT_SERVER || loop_id == BROADCAST); |
Anirban Chakraborty | 17d9863 | 2008-12-18 10:06:15 -0800 | [diff] [blame] | 66 | } |