]>
Commit | Line | Data |
---|---|---|
1da177e4 | 1 | /* |
fa90c54f | 2 | * QLogic Fibre Channel HBA Driver |
01e58d8e | 3 | * Copyright (c) 2003-2008 QLogic Corporation |
1da177e4 | 4 | * |
fa90c54f | 5 | * See LICENSE.qla2xxx for copyright and licensing details. |
1da177e4 LT |
6 | */ |
7 | ||
1da177e4 LT |
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 | |
fa2a1ce5 | 19 | qla2x00_debounce_register(volatile uint16_t __iomem *addr) |
1da177e4 LT |
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 | ||
fa2a1ce5 | 34 | static inline void |
e315cd28 | 35 | qla2x00_poll(struct rsp_que *rsp) |
1da177e4 | 36 | { |
d2ba5675 | 37 | unsigned long flags; |
e315cd28 | 38 | struct qla_hw_data *ha = rsp->hw; |
d2ba5675 | 39 | local_irq_save(flags); |
e315cd28 | 40 | ha->isp_ops->intr_handler(0, rsp); |
d2ba5675 | 41 | local_irq_restore(flags); |
1da177e4 LT |
42 | } |
43 | ||
1da177e4 LT |
44 | /** |
45 | * qla2x00_issue_marker() - Issue a Marker IOCB if necessary. | |
46 | * @ha: HA context | |
47 | * @ha_locked: is function called with the hardware lock | |
48 | * | |
cc3ef7bc | 49 | * Returns non-zero if a failure occurred, else zero. |
1da177e4 LT |
50 | */ |
51 | static inline int | |
e315cd28 | 52 | qla2x00_issue_marker(scsi_qla_host_t *vha, int ha_locked) |
1da177e4 LT |
53 | { |
54 | /* Send marker if required */ | |
e315cd28 | 55 | if (vha->marker_needed != 0) { |
1da177e4 | 56 | if (ha_locked) { |
e315cd28 | 57 | if (__qla2x00_marker(vha, 0, 0, MK_SYNC_ALL) != |
1da177e4 LT |
58 | QLA_SUCCESS) |
59 | return (QLA_FUNCTION_FAILED); | |
60 | } else { | |
e315cd28 | 61 | if (qla2x00_marker(vha, 0, 0, MK_SYNC_ALL) != |
1da177e4 LT |
62 | QLA_SUCCESS) |
63 | return (QLA_FUNCTION_FAILED); | |
64 | } | |
e315cd28 | 65 | vha->marker_needed = 0; |
1da177e4 LT |
66 | } |
67 | return (QLA_SUCCESS); | |
68 | } | |
69 | ||
2b6c0cee AV |
70 | static inline uint8_t * |
71 | host_to_fcp_swap(uint8_t *fcp, uint32_t bsize) | |
72 | { | |
73 | uint32_t *ifcp = (uint32_t *) fcp; | |
74 | uint32_t *ofcp = (uint32_t *) fcp; | |
75 | uint32_t iter = bsize >> 2; | |
76 | ||
77 | for (; iter ; iter--) | |
78 | *ofcp++ = swab32(*ifcp++); | |
79 | ||
80 | return fcp; | |
81 | } | |
3d71644c | 82 | |
3d71644c | 83 | static inline int |
e315cd28 | 84 | qla2x00_is_reserved_id(scsi_qla_host_t *vha, uint16_t loop_id) |
3d71644c | 85 | { |
e315cd28 | 86 | struct qla_hw_data *ha = vha->hw; |
e428924c | 87 | if (IS_FWI2_CAPABLE(ha)) |
3d71644c AV |
88 | return (loop_id > NPH_LAST_HANDLE); |
89 | ||
e315cd28 | 90 | return ((loop_id > ha->max_loop_id && loop_id < SNS_FIRST_LOOP_ID) || |
3d71644c AV |
91 | loop_id == MANAGEMENT_SERVER || loop_id == BROADCAST); |
92 | }; |