diff options
Diffstat (limited to 'drivers/misc/sgi-xp')
-rw-r--r-- | drivers/misc/sgi-xp/xp.h | 1 | ||||
-rw-r--r-- | drivers/misc/sgi-xp/xp_main.c | 3 | ||||
-rw-r--r-- | drivers/misc/sgi-xp/xp_sn2.c | 10 | ||||
-rw-r--r-- | drivers/misc/sgi-xp/xp_uv.c | 33 | ||||
-rw-r--r-- | drivers/misc/sgi-xp/xpc_main.c | 15 | ||||
-rw-r--r-- | drivers/misc/sgi-xp/xpc_partition.c | 14 | ||||
-rw-r--r-- | drivers/misc/sgi-xp/xpc_sn2.c | 1 | ||||
-rw-r--r-- | drivers/misc/sgi-xp/xpc_uv.c | 52 | ||||
-rw-r--r-- | drivers/misc/sgi-xp/xpnet.c | 3 |
9 files changed, 94 insertions, 38 deletions
diff --git a/drivers/misc/sgi-xp/xp.h b/drivers/misc/sgi-xp/xp.h index 2275126cb334..851b2f25ce0e 100644 --- a/drivers/misc/sgi-xp/xp.h +++ b/drivers/misc/sgi-xp/xp.h | |||
@@ -339,6 +339,7 @@ extern short xp_partition_id; | |||
339 | extern u8 xp_region_size; | 339 | extern u8 xp_region_size; |
340 | 340 | ||
341 | extern unsigned long (*xp_pa) (void *); | 341 | extern unsigned long (*xp_pa) (void *); |
342 | extern unsigned long (*xp_socket_pa) (unsigned long); | ||
342 | extern enum xp_retval (*xp_remote_memcpy) (unsigned long, const unsigned long, | 343 | extern enum xp_retval (*xp_remote_memcpy) (unsigned long, const unsigned long, |
343 | size_t); | 344 | size_t); |
344 | extern int (*xp_cpu_to_nasid) (int); | 345 | extern int (*xp_cpu_to_nasid) (int); |
diff --git a/drivers/misc/sgi-xp/xp_main.c b/drivers/misc/sgi-xp/xp_main.c index 7896849b16dc..01be66d02ca8 100644 --- a/drivers/misc/sgi-xp/xp_main.c +++ b/drivers/misc/sgi-xp/xp_main.c | |||
@@ -44,6 +44,9 @@ EXPORT_SYMBOL_GPL(xp_region_size); | |||
44 | unsigned long (*xp_pa) (void *addr); | 44 | unsigned long (*xp_pa) (void *addr); |
45 | EXPORT_SYMBOL_GPL(xp_pa); | 45 | EXPORT_SYMBOL_GPL(xp_pa); |
46 | 46 | ||
47 | unsigned long (*xp_socket_pa) (unsigned long gpa); | ||
48 | EXPORT_SYMBOL_GPL(xp_socket_pa); | ||
49 | |||
47 | enum xp_retval (*xp_remote_memcpy) (unsigned long dst_gpa, | 50 | enum xp_retval (*xp_remote_memcpy) (unsigned long dst_gpa, |
48 | const unsigned long src_gpa, size_t len); | 51 | const unsigned long src_gpa, size_t len); |
49 | EXPORT_SYMBOL_GPL(xp_remote_memcpy); | 52 | EXPORT_SYMBOL_GPL(xp_remote_memcpy); |
diff --git a/drivers/misc/sgi-xp/xp_sn2.c b/drivers/misc/sgi-xp/xp_sn2.c index fb3ec9d735a9..d8e463f87241 100644 --- a/drivers/misc/sgi-xp/xp_sn2.c +++ b/drivers/misc/sgi-xp/xp_sn2.c | |||
@@ -84,6 +84,15 @@ xp_pa_sn2(void *addr) | |||
84 | } | 84 | } |
85 | 85 | ||
86 | /* | 86 | /* |
87 | * Convert a global physical to a socket physical address. | ||
88 | */ | ||
89 | static unsigned long | ||
90 | xp_socket_pa_sn2(unsigned long gpa) | ||
91 | { | ||
92 | return gpa; | ||
93 | } | ||
94 | |||
95 | /* | ||
87 | * Wrapper for bte_copy(). | 96 | * Wrapper for bte_copy(). |
88 | * | 97 | * |
89 | * dst_pa - physical address of the destination of the transfer. | 98 | * dst_pa - physical address of the destination of the transfer. |
@@ -162,6 +171,7 @@ xp_init_sn2(void) | |||
162 | xp_region_size = sn_region_size; | 171 | xp_region_size = sn_region_size; |
163 | 172 | ||
164 | xp_pa = xp_pa_sn2; | 173 | xp_pa = xp_pa_sn2; |
174 | xp_socket_pa = xp_socket_pa_sn2; | ||
165 | xp_remote_memcpy = xp_remote_memcpy_sn2; | 175 | xp_remote_memcpy = xp_remote_memcpy_sn2; |
166 | xp_cpu_to_nasid = xp_cpu_to_nasid_sn2; | 176 | xp_cpu_to_nasid = xp_cpu_to_nasid_sn2; |
167 | xp_expand_memprotect = xp_expand_memprotect_sn2; | 177 | xp_expand_memprotect = xp_expand_memprotect_sn2; |
diff --git a/drivers/misc/sgi-xp/xp_uv.c b/drivers/misc/sgi-xp/xp_uv.c index d238576b26fa..a0d093274dc0 100644 --- a/drivers/misc/sgi-xp/xp_uv.c +++ b/drivers/misc/sgi-xp/xp_uv.c | |||
@@ -32,12 +32,44 @@ xp_pa_uv(void *addr) | |||
32 | return uv_gpa(addr); | 32 | return uv_gpa(addr); |
33 | } | 33 | } |
34 | 34 | ||
35 | /* | ||
36 | * Convert a global physical to socket physical address. | ||
37 | */ | ||
38 | static unsigned long | ||
39 | xp_socket_pa_uv(unsigned long gpa) | ||
40 | { | ||
41 | return uv_gpa_to_soc_phys_ram(gpa); | ||
42 | } | ||
43 | |||
44 | static enum xp_retval | ||
45 | xp_remote_mmr_read(unsigned long dst_gpa, const unsigned long src_gpa, | ||
46 | size_t len) | ||
47 | { | ||
48 | int ret; | ||
49 | unsigned long *dst_va = __va(uv_gpa_to_soc_phys_ram(dst_gpa)); | ||
50 | |||
51 | BUG_ON(!uv_gpa_in_mmr_space(src_gpa)); | ||
52 | BUG_ON(len != 8); | ||
53 | |||
54 | ret = gru_read_gpa(dst_va, src_gpa); | ||
55 | if (ret == 0) | ||
56 | return xpSuccess; | ||
57 | |||
58 | dev_err(xp, "gru_read_gpa() failed, dst_gpa=0x%016lx src_gpa=0x%016lx " | ||
59 | "len=%ld\n", dst_gpa, src_gpa, len); | ||
60 | return xpGruCopyError; | ||
61 | } | ||
62 | |||
63 | |||
35 | static enum xp_retval | 64 | static enum xp_retval |
36 | xp_remote_memcpy_uv(unsigned long dst_gpa, const unsigned long src_gpa, | 65 | xp_remote_memcpy_uv(unsigned long dst_gpa, const unsigned long src_gpa, |
37 | size_t len) | 66 | size_t len) |
38 | { | 67 | { |
39 | int ret; | 68 | int ret; |
40 | 69 | ||
70 | if (uv_gpa_in_mmr_space(src_gpa)) | ||
71 | return xp_remote_mmr_read(dst_gpa, src_gpa, len); | ||
72 | |||
41 | ret = gru_copy_gpa(dst_gpa, src_gpa, len); | 73 | ret = gru_copy_gpa(dst_gpa, src_gpa, len); |
42 | if (ret == 0) | 74 | if (ret == 0) |
43 | return xpSuccess; | 75 | return xpSuccess; |
@@ -123,6 +155,7 @@ xp_init_uv(void) | |||
123 | xp_region_size = sn_region_size; | 155 | xp_region_size = sn_region_size; |
124 | 156 | ||
125 | xp_pa = xp_pa_uv; | 157 | xp_pa = xp_pa_uv; |
158 | xp_socket_pa = xp_socket_pa_uv; | ||
126 | xp_remote_memcpy = xp_remote_memcpy_uv; | 159 | xp_remote_memcpy = xp_remote_memcpy_uv; |
127 | xp_cpu_to_nasid = xp_cpu_to_nasid_uv; | 160 | xp_cpu_to_nasid = xp_cpu_to_nasid_uv; |
128 | xp_expand_memprotect = xp_expand_memprotect_uv; | 161 | xp_expand_memprotect = xp_expand_memprotect_uv; |
diff --git a/drivers/misc/sgi-xp/xpc_main.c b/drivers/misc/sgi-xp/xpc_main.c index fd3688a3e23f..8d082b46426b 100644 --- a/drivers/misc/sgi-xp/xpc_main.c +++ b/drivers/misc/sgi-xp/xpc_main.c | |||
@@ -44,6 +44,7 @@ | |||
44 | */ | 44 | */ |
45 | 45 | ||
46 | #include <linux/module.h> | 46 | #include <linux/module.h> |
47 | #include <linux/slab.h> | ||
47 | #include <linux/sysctl.h> | 48 | #include <linux/sysctl.h> |
48 | #include <linux/device.h> | 49 | #include <linux/device.h> |
49 | #include <linux/delay.h> | 50 | #include <linux/delay.h> |
@@ -89,48 +90,40 @@ static int xpc_disengage_max_timelimit = 120; | |||
89 | 90 | ||
90 | static ctl_table xpc_sys_xpc_hb_dir[] = { | 91 | static ctl_table xpc_sys_xpc_hb_dir[] = { |
91 | { | 92 | { |
92 | .ctl_name = CTL_UNNUMBERED, | ||
93 | .procname = "hb_interval", | 93 | .procname = "hb_interval", |
94 | .data = &xpc_hb_interval, | 94 | .data = &xpc_hb_interval, |
95 | .maxlen = sizeof(int), | 95 | .maxlen = sizeof(int), |
96 | .mode = 0644, | 96 | .mode = 0644, |
97 | .proc_handler = &proc_dointvec_minmax, | 97 | .proc_handler = proc_dointvec_minmax, |
98 | .strategy = &sysctl_intvec, | ||
99 | .extra1 = &xpc_hb_min_interval, | 98 | .extra1 = &xpc_hb_min_interval, |
100 | .extra2 = &xpc_hb_max_interval}, | 99 | .extra2 = &xpc_hb_max_interval}, |
101 | { | 100 | { |
102 | .ctl_name = CTL_UNNUMBERED, | ||
103 | .procname = "hb_check_interval", | 101 | .procname = "hb_check_interval", |
104 | .data = &xpc_hb_check_interval, | 102 | .data = &xpc_hb_check_interval, |
105 | .maxlen = sizeof(int), | 103 | .maxlen = sizeof(int), |
106 | .mode = 0644, | 104 | .mode = 0644, |
107 | .proc_handler = &proc_dointvec_minmax, | 105 | .proc_handler = proc_dointvec_minmax, |
108 | .strategy = &sysctl_intvec, | ||
109 | .extra1 = &xpc_hb_check_min_interval, | 106 | .extra1 = &xpc_hb_check_min_interval, |
110 | .extra2 = &xpc_hb_check_max_interval}, | 107 | .extra2 = &xpc_hb_check_max_interval}, |
111 | {} | 108 | {} |
112 | }; | 109 | }; |
113 | static ctl_table xpc_sys_xpc_dir[] = { | 110 | static ctl_table xpc_sys_xpc_dir[] = { |
114 | { | 111 | { |
115 | .ctl_name = CTL_UNNUMBERED, | ||
116 | .procname = "hb", | 112 | .procname = "hb", |
117 | .mode = 0555, | 113 | .mode = 0555, |
118 | .child = xpc_sys_xpc_hb_dir}, | 114 | .child = xpc_sys_xpc_hb_dir}, |
119 | { | 115 | { |
120 | .ctl_name = CTL_UNNUMBERED, | ||
121 | .procname = "disengage_timelimit", | 116 | .procname = "disengage_timelimit", |
122 | .data = &xpc_disengage_timelimit, | 117 | .data = &xpc_disengage_timelimit, |
123 | .maxlen = sizeof(int), | 118 | .maxlen = sizeof(int), |
124 | .mode = 0644, | 119 | .mode = 0644, |
125 | .proc_handler = &proc_dointvec_minmax, | 120 | .proc_handler = proc_dointvec_minmax, |
126 | .strategy = &sysctl_intvec, | ||
127 | .extra1 = &xpc_disengage_min_timelimit, | 121 | .extra1 = &xpc_disengage_min_timelimit, |
128 | .extra2 = &xpc_disengage_max_timelimit}, | 122 | .extra2 = &xpc_disengage_max_timelimit}, |
129 | {} | 123 | {} |
130 | }; | 124 | }; |
131 | static ctl_table xpc_sys_dir[] = { | 125 | static ctl_table xpc_sys_dir[] = { |
132 | { | 126 | { |
133 | .ctl_name = CTL_UNNUMBERED, | ||
134 | .procname = "xpc", | 127 | .procname = "xpc", |
135 | .mode = 0555, | 128 | .mode = 0555, |
136 | .child = xpc_sys_xpc_dir}, | 129 | .child = xpc_sys_xpc_dir}, |
diff --git a/drivers/misc/sgi-xp/xpc_partition.c b/drivers/misc/sgi-xp/xpc_partition.c index 65877bc5edaa..d551f09ccb79 100644 --- a/drivers/misc/sgi-xp/xpc_partition.c +++ b/drivers/misc/sgi-xp/xpc_partition.c | |||
@@ -17,7 +17,9 @@ | |||
17 | 17 | ||
18 | #include <linux/device.h> | 18 | #include <linux/device.h> |
19 | #include <linux/hardirq.h> | 19 | #include <linux/hardirq.h> |
20 | #include <linux/slab.h> | ||
20 | #include "xpc.h" | 21 | #include "xpc.h" |
22 | #include <asm/uv/uv_hub.h> | ||
21 | 23 | ||
22 | /* XPC is exiting flag */ | 24 | /* XPC is exiting flag */ |
23 | int xpc_exiting; | 25 | int xpc_exiting; |
@@ -92,8 +94,12 @@ xpc_get_rsvd_page_pa(int nasid) | |||
92 | break; | 94 | break; |
93 | 95 | ||
94 | /* !!! L1_CACHE_ALIGN() is only a sn2-bte_copy requirement */ | 96 | /* !!! L1_CACHE_ALIGN() is only a sn2-bte_copy requirement */ |
95 | if (L1_CACHE_ALIGN(len) > buf_len) { | 97 | if (is_shub()) |
96 | kfree(buf_base); | 98 | len = L1_CACHE_ALIGN(len); |
99 | |||
100 | if (len > buf_len) { | ||
101 | if (buf_base != NULL) | ||
102 | kfree(buf_base); | ||
97 | buf_len = L1_CACHE_ALIGN(len); | 103 | buf_len = L1_CACHE_ALIGN(len); |
98 | buf = xpc_kmalloc_cacheline_aligned(buf_len, GFP_KERNEL, | 104 | buf = xpc_kmalloc_cacheline_aligned(buf_len, GFP_KERNEL, |
99 | &buf_base); | 105 | &buf_base); |
@@ -105,7 +111,7 @@ xpc_get_rsvd_page_pa(int nasid) | |||
105 | } | 111 | } |
106 | } | 112 | } |
107 | 113 | ||
108 | ret = xp_remote_memcpy(xp_pa(buf), rp_pa, buf_len); | 114 | ret = xp_remote_memcpy(xp_pa(buf), rp_pa, len); |
109 | if (ret != xpSuccess) { | 115 | if (ret != xpSuccess) { |
110 | dev_dbg(xpc_part, "xp_remote_memcpy failed %d\n", ret); | 116 | dev_dbg(xpc_part, "xp_remote_memcpy failed %d\n", ret); |
111 | break; | 117 | break; |
@@ -143,7 +149,7 @@ xpc_setup_rsvd_page(void) | |||
143 | dev_err(xpc_part, "SAL failed to locate the reserved page\n"); | 149 | dev_err(xpc_part, "SAL failed to locate the reserved page\n"); |
144 | return -ESRCH; | 150 | return -ESRCH; |
145 | } | 151 | } |
146 | rp = (struct xpc_rsvd_page *)__va(rp_pa); | 152 | rp = (struct xpc_rsvd_page *)__va(xp_socket_pa(rp_pa)); |
147 | 153 | ||
148 | if (rp->SAL_version < 3) { | 154 | if (rp->SAL_version < 3) { |
149 | /* SAL_versions < 3 had a SAL_partid defined as a u8 */ | 155 | /* SAL_versions < 3 had a SAL_partid defined as a u8 */ |
diff --git a/drivers/misc/sgi-xp/xpc_sn2.c b/drivers/misc/sgi-xp/xpc_sn2.c index 8b70e03f939f..7d71c04fc938 100644 --- a/drivers/misc/sgi-xp/xpc_sn2.c +++ b/drivers/misc/sgi-xp/xpc_sn2.c | |||
@@ -14,6 +14,7 @@ | |||
14 | */ | 14 | */ |
15 | 15 | ||
16 | #include <linux/delay.h> | 16 | #include <linux/delay.h> |
17 | #include <linux/slab.h> | ||
17 | #include <asm/uncached.h> | 18 | #include <asm/uncached.h> |
18 | #include <asm/sn/mspec.h> | 19 | #include <asm/sn/mspec.h> |
19 | #include <asm/sn/sn_sal.h> | 20 | #include <asm/sn/sn_sal.h> |
diff --git a/drivers/misc/sgi-xp/xpc_uv.c b/drivers/misc/sgi-xp/xpc_uv.c index c76677afda1b..1f59ee2226ca 100644 --- a/drivers/misc/sgi-xp/xpc_uv.c +++ b/drivers/misc/sgi-xp/xpc_uv.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/delay.h> | 19 | #include <linux/delay.h> |
20 | #include <linux/device.h> | 20 | #include <linux/device.h> |
21 | #include <linux/err.h> | 21 | #include <linux/err.h> |
22 | #include <linux/slab.h> | ||
22 | #include <asm/uv/uv_hub.h> | 23 | #include <asm/uv/uv_hub.h> |
23 | #if defined CONFIG_X86_64 | 24 | #if defined CONFIG_X86_64 |
24 | #include <asm/uv/bios.h> | 25 | #include <asm/uv/bios.h> |
@@ -106,7 +107,8 @@ xpc_get_gru_mq_irq_uv(struct xpc_gru_mq_uv *mq, int cpu, char *irq_name) | |||
106 | int mmr_pnode = uv_blade_to_pnode(mq->mmr_blade); | 107 | int mmr_pnode = uv_blade_to_pnode(mq->mmr_blade); |
107 | 108 | ||
108 | #if defined CONFIG_X86_64 | 109 | #if defined CONFIG_X86_64 |
109 | mq->irq = uv_setup_irq(irq_name, cpu, mq->mmr_blade, mq->mmr_offset); | 110 | mq->irq = uv_setup_irq(irq_name, cpu, mq->mmr_blade, mq->mmr_offset, |
111 | UV_AFFINITY_CPU); | ||
110 | if (mq->irq < 0) { | 112 | if (mq->irq < 0) { |
111 | dev_err(xpc_part, "uv_setup_irq() returned error=%d\n", | 113 | dev_err(xpc_part, "uv_setup_irq() returned error=%d\n", |
112 | -mq->irq); | 114 | -mq->irq); |
@@ -136,7 +138,7 @@ static void | |||
136 | xpc_release_gru_mq_irq_uv(struct xpc_gru_mq_uv *mq) | 138 | xpc_release_gru_mq_irq_uv(struct xpc_gru_mq_uv *mq) |
137 | { | 139 | { |
138 | #if defined CONFIG_X86_64 | 140 | #if defined CONFIG_X86_64 |
139 | uv_teardown_irq(mq->irq, mq->mmr_blade, mq->mmr_offset); | 141 | uv_teardown_irq(mq->irq); |
140 | 142 | ||
141 | #elif defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV | 143 | #elif defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV |
142 | int mmr_pnode; | 144 | int mmr_pnode; |
@@ -156,22 +158,24 @@ xpc_gru_mq_watchlist_alloc_uv(struct xpc_gru_mq_uv *mq) | |||
156 | { | 158 | { |
157 | int ret; | 159 | int ret; |
158 | 160 | ||
159 | #if defined CONFIG_X86_64 | 161 | #if defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV |
160 | ret = uv_bios_mq_watchlist_alloc(mq->mmr_blade, uv_gpa(mq->address), | 162 | int mmr_pnode = uv_blade_to_pnode(mq->mmr_blade); |
161 | mq->order, &mq->mmr_offset); | 163 | |
162 | if (ret < 0) { | 164 | ret = sn_mq_watchlist_alloc(mmr_pnode, (void *)uv_gpa(mq->address), |
163 | dev_err(xpc_part, "uv_bios_mq_watchlist_alloc() failed, " | ||
164 | "ret=%d\n", ret); | ||
165 | return ret; | ||
166 | } | ||
167 | #elif defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV | ||
168 | ret = sn_mq_watchlist_alloc(mq->mmr_blade, (void *)uv_gpa(mq->address), | ||
169 | mq->order, &mq->mmr_offset); | 165 | mq->order, &mq->mmr_offset); |
170 | if (ret < 0) { | 166 | if (ret < 0) { |
171 | dev_err(xpc_part, "sn_mq_watchlist_alloc() failed, ret=%d\n", | 167 | dev_err(xpc_part, "sn_mq_watchlist_alloc() failed, ret=%d\n", |
172 | ret); | 168 | ret); |
173 | return -EBUSY; | 169 | return -EBUSY; |
174 | } | 170 | } |
171 | #elif defined CONFIG_X86_64 | ||
172 | ret = uv_bios_mq_watchlist_alloc(uv_gpa(mq->address), | ||
173 | mq->order, &mq->mmr_offset); | ||
174 | if (ret < 0) { | ||
175 | dev_err(xpc_part, "uv_bios_mq_watchlist_alloc() failed, " | ||
176 | "ret=%d\n", ret); | ||
177 | return ret; | ||
178 | } | ||
175 | #else | 179 | #else |
176 | #error not a supported configuration | 180 | #error not a supported configuration |
177 | #endif | 181 | #endif |
@@ -184,12 +188,13 @@ static void | |||
184 | xpc_gru_mq_watchlist_free_uv(struct xpc_gru_mq_uv *mq) | 188 | xpc_gru_mq_watchlist_free_uv(struct xpc_gru_mq_uv *mq) |
185 | { | 189 | { |
186 | int ret; | 190 | int ret; |
191 | int mmr_pnode = uv_blade_to_pnode(mq->mmr_blade); | ||
187 | 192 | ||
188 | #if defined CONFIG_X86_64 | 193 | #if defined CONFIG_X86_64 |
189 | ret = uv_bios_mq_watchlist_free(mq->mmr_blade, mq->watchlist_num); | 194 | ret = uv_bios_mq_watchlist_free(mmr_pnode, mq->watchlist_num); |
190 | BUG_ON(ret != BIOS_STATUS_SUCCESS); | 195 | BUG_ON(ret != BIOS_STATUS_SUCCESS); |
191 | #elif defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV | 196 | #elif defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV |
192 | ret = sn_mq_watchlist_free(mq->mmr_blade, mq->watchlist_num); | 197 | ret = sn_mq_watchlist_free(mmr_pnode, mq->watchlist_num); |
193 | BUG_ON(ret != SALRET_OK); | 198 | BUG_ON(ret != SALRET_OK); |
194 | #else | 199 | #else |
195 | #error not a supported configuration | 200 | #error not a supported configuration |
@@ -203,6 +208,7 @@ xpc_create_gru_mq_uv(unsigned int mq_size, int cpu, char *irq_name, | |||
203 | enum xp_retval xp_ret; | 208 | enum xp_retval xp_ret; |
204 | int ret; | 209 | int ret; |
205 | int nid; | 210 | int nid; |
211 | int nasid; | ||
206 | int pg_order; | 212 | int pg_order; |
207 | struct page *page; | 213 | struct page *page; |
208 | struct xpc_gru_mq_uv *mq; | 214 | struct xpc_gru_mq_uv *mq; |
@@ -258,9 +264,11 @@ xpc_create_gru_mq_uv(unsigned int mq_size, int cpu, char *irq_name, | |||
258 | goto out_5; | 264 | goto out_5; |
259 | } | 265 | } |
260 | 266 | ||
267 | nasid = UV_PNODE_TO_NASID(uv_cpu_to_pnode(cpu)); | ||
268 | |||
261 | mmr_value = (struct uv_IO_APIC_route_entry *)&mq->mmr_value; | 269 | mmr_value = (struct uv_IO_APIC_route_entry *)&mq->mmr_value; |
262 | ret = gru_create_message_queue(mq->gru_mq_desc, mq->address, mq_size, | 270 | ret = gru_create_message_queue(mq->gru_mq_desc, mq->address, mq_size, |
263 | nid, mmr_value->vector, mmr_value->dest); | 271 | nasid, mmr_value->vector, mmr_value->dest); |
264 | if (ret != 0) { | 272 | if (ret != 0) { |
265 | dev_err(xpc_part, "gru_create_message_queue() returned " | 273 | dev_err(xpc_part, "gru_create_message_queue() returned " |
266 | "error=%d\n", ret); | 274 | "error=%d\n", ret); |
@@ -945,11 +953,13 @@ xpc_get_fifo_entry_uv(struct xpc_fifo_head_uv *head) | |||
945 | head->first = first->next; | 953 | head->first = first->next; |
946 | if (head->first == NULL) | 954 | if (head->first == NULL) |
947 | head->last = NULL; | 955 | head->last = NULL; |
956 | |||
957 | head->n_entries--; | ||
958 | BUG_ON(head->n_entries < 0); | ||
959 | |||
960 | first->next = NULL; | ||
948 | } | 961 | } |
949 | head->n_entries--; | ||
950 | BUG_ON(head->n_entries < 0); | ||
951 | spin_unlock_irqrestore(&head->lock, irq_flags); | 962 | spin_unlock_irqrestore(&head->lock, irq_flags); |
952 | first->next = NULL; | ||
953 | return first; | 963 | return first; |
954 | } | 964 | } |
955 | 965 | ||
@@ -1018,7 +1028,8 @@ xpc_make_first_contact_uv(struct xpc_partition *part) | |||
1018 | xpc_send_activate_IRQ_part_uv(part, &msg, sizeof(msg), | 1028 | xpc_send_activate_IRQ_part_uv(part, &msg, sizeof(msg), |
1019 | XPC_ACTIVATE_MQ_MSG_SYNC_ACT_STATE_UV); | 1029 | XPC_ACTIVATE_MQ_MSG_SYNC_ACT_STATE_UV); |
1020 | 1030 | ||
1021 | while (part->sn.uv.remote_act_state != XPC_P_AS_ACTIVATING) { | 1031 | while (!((part->sn.uv.remote_act_state == XPC_P_AS_ACTIVATING) || |
1032 | (part->sn.uv.remote_act_state == XPC_P_AS_ACTIVE))) { | ||
1022 | 1033 | ||
1023 | dev_dbg(xpc_part, "waiting to make first contact with " | 1034 | dev_dbg(xpc_part, "waiting to make first contact with " |
1024 | "partition %d\n", XPC_PARTID(part)); | 1035 | "partition %d\n", XPC_PARTID(part)); |
@@ -1421,7 +1432,6 @@ xpc_handle_notify_mq_msg_uv(struct xpc_partition *part, | |||
1421 | msg_slot = ch_uv->recv_msg_slots + | 1432 | msg_slot = ch_uv->recv_msg_slots + |
1422 | (msg->hdr.msg_slot_number % ch->remote_nentries) * ch->entry_size; | 1433 | (msg->hdr.msg_slot_number % ch->remote_nentries) * ch->entry_size; |
1423 | 1434 | ||
1424 | BUG_ON(msg->hdr.msg_slot_number != msg_slot->hdr.msg_slot_number); | ||
1425 | BUG_ON(msg_slot->hdr.size != 0); | 1435 | BUG_ON(msg_slot->hdr.size != 0); |
1426 | 1436 | ||
1427 | memcpy(msg_slot, msg, msg->hdr.size); | 1437 | memcpy(msg_slot, msg, msg->hdr.size); |
@@ -1645,8 +1655,6 @@ xpc_received_payload_uv(struct xpc_channel *ch, void *payload) | |||
1645 | sizeof(struct xpc_notify_mq_msghdr_uv)); | 1655 | sizeof(struct xpc_notify_mq_msghdr_uv)); |
1646 | if (ret != xpSuccess) | 1656 | if (ret != xpSuccess) |
1647 | XPC_DEACTIVATE_PARTITION(&xpc_partitions[ch->partid], ret); | 1657 | XPC_DEACTIVATE_PARTITION(&xpc_partitions[ch->partid], ret); |
1648 | |||
1649 | msg->hdr.msg_slot_number += ch->remote_nentries; | ||
1650 | } | 1658 | } |
1651 | 1659 | ||
1652 | static struct xpc_arch_operations xpc_arch_ops_uv = { | 1660 | static struct xpc_arch_operations xpc_arch_ops_uv = { |
diff --git a/drivers/misc/sgi-xp/xpnet.c b/drivers/misc/sgi-xp/xpnet.c index 16f0abda1423..ee5109a3cd98 100644 --- a/drivers/misc/sgi-xp/xpnet.c +++ b/drivers/misc/sgi-xp/xpnet.c | |||
@@ -20,6 +20,7 @@ | |||
20 | * | 20 | * |
21 | */ | 21 | */ |
22 | 22 | ||
23 | #include <linux/slab.h> | ||
23 | #include <linux/module.h> | 24 | #include <linux/module.h> |
24 | #include <linux/netdevice.h> | 25 | #include <linux/netdevice.h> |
25 | #include <linux/etherdevice.h> | 26 | #include <linux/etherdevice.h> |
@@ -475,7 +476,7 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
475 | 476 | ||
476 | if (skb->data[0] == 0xff) { | 477 | if (skb->data[0] == 0xff) { |
477 | /* we are being asked to broadcast to all partitions */ | 478 | /* we are being asked to broadcast to all partitions */ |
478 | for_each_bit(dest_partid, xpnet_broadcast_partitions, | 479 | for_each_set_bit(dest_partid, xpnet_broadcast_partitions, |
479 | xp_max_npartitions) { | 480 | xp_max_npartitions) { |
480 | 481 | ||
481 | xpnet_send(skb, queued_msg, start_addr, end_addr, | 482 | xpnet_send(skb, queued_msg, start_addr, end_addr, |