1/*
2 * Copyright (c) 2012 Mellanox Technologies. All rights reserved.
3 *
4 * This software is available to you under a choice of one of two
5 * licenses.  You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:
9 *
10 *     Redistribution and use in source and binary forms, with or
11 *     without modification, are permitted provided that the following
12 *     conditions are met:
13 *
14 *      - Redistributions of source code must retain the above
15 *        copyright notice, this list of conditions and the following
16 *        disclaimer.
17 *
18 *      - Redistributions in binary form must reproduce the above
19 *        copyright notice, this list of conditions and the following
20 *        disclaimer in the documentation and/or other materials
21 *        provided with the distribution.
22 *
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30 * SOFTWARE.
31 */
32 /***********************************************************/
33/*This file support the handling of the Alias GUID feature. */
34/***********************************************************/
35#include <rdma/ib_mad.h>
36#include <rdma/ib_smi.h>
37#include <rdma/ib_cache.h>
38#include <rdma/ib_sa.h>
39#include <rdma/ib_pack.h>
40#include <linux/mlx4/cmd.h>
41#include <linux/module.h>
42#include <linux/init.h>
43#include <linux/errno.h>
44#include <rdma/ib_user_verbs.h>
45#include <linux/delay.h>
46#include "mlx4_ib.h"
47
48/*
49The driver keeps the current state of all guids, as they are in the HW.
50Whenever we receive an smp mad GUIDInfo record, the data will be cached.
51*/
52
53struct mlx4_alias_guid_work_context {
54	u8 port;
55	struct mlx4_ib_dev     *dev ;
56	struct ib_sa_query     *sa_query;
57	struct completion	done;
58	int			query_id;
59	struct list_head	list;
60	int			block_num;
61	ib_sa_comp_mask		guid_indexes;
62	u8			method;
63};
64
65struct mlx4_next_alias_guid_work {
66	u8 port;
67	u8 block_num;
68	u8 method;
69	struct mlx4_sriov_alias_guid_info_rec_det rec_det;
70};
71
72static int get_low_record_time_index(struct mlx4_ib_dev *dev, u8 port,
73				     int *resched_delay_sec);
74
75void mlx4_ib_update_cache_on_guid_change(struct mlx4_ib_dev *dev, int block_num,
76					 u8 port_num, u8 *p_data)
77{
78	int i;
79	u64 guid_indexes;
80	int slave_id;
81	int port_index = port_num - 1;
82
83	if (!mlx4_is_master(dev->dev))
84		return;
85
86	guid_indexes = be64_to_cpu((__force __be64) dev->sriov.alias_guid.
87				   ports_guid[port_num - 1].
88				   all_rec_per_port[block_num].guid_indexes);
89	pr_debug("port: %d, guid_indexes: 0x%llx\n", port_num, guid_indexes);
90
91	for (i = 0; i < NUM_ALIAS_GUID_IN_REC; i++) {
92		/* The location of the specific index starts from bit number 4
93		 * until bit num 11 */
94		if (test_bit(i + 4, (unsigned long *)&guid_indexes)) {
95			slave_id = (block_num * NUM_ALIAS_GUID_IN_REC) + i ;
96			if (slave_id >= dev->dev->num_slaves) {
97				pr_debug("The last slave: %d\n", slave_id);
98				return;
99			}
100
101			/* cache the guid: */
102			memcpy(&dev->sriov.demux[port_index].guid_cache[slave_id],
103			       &p_data[i * GUID_REC_SIZE],
104			       GUID_REC_SIZE);
105		} else
106			pr_debug("Guid number: %d in block: %d"
107				 " was not updated\n", i, block_num);
108	}
109}
110
111static __be64 get_cached_alias_guid(struct mlx4_ib_dev *dev, int port, int index)
112{
113	if (index >= NUM_ALIAS_GUID_PER_PORT) {
114		pr_err("%s: ERROR: asked for index:%d\n", __func__, index);
115		return (__force __be64) -1;
116	}
117	return *(__be64 *)&dev->sriov.demux[port - 1].guid_cache[index];
118}
119
120
121ib_sa_comp_mask mlx4_ib_get_aguid_comp_mask_from_ix(int index)
122{
123	return IB_SA_COMP_MASK(4 + index);
124}
125
126void mlx4_ib_slave_alias_guid_event(struct mlx4_ib_dev *dev, int slave,
127				    int port,  int slave_init)
128{
129	__be64 curr_guid, required_guid;
130	int record_num = slave / 8;
131	int index = slave % 8;
132	int port_index = port - 1;
133	unsigned long flags;
134	int do_work = 0;
135
136	spin_lock_irqsave(&dev->sriov.alias_guid.ag_work_lock, flags);
137	if (dev->sriov.alias_guid.ports_guid[port_index].state_flags &
138	    GUID_STATE_NEED_PORT_INIT)
139		goto unlock;
140	if (!slave_init) {
141		curr_guid = *(__be64 *)&dev->sriov.
142			alias_guid.ports_guid[port_index].
143			all_rec_per_port[record_num].
144			all_recs[GUID_REC_SIZE * index];
145		if (curr_guid == cpu_to_be64(MLX4_GUID_FOR_DELETE_VAL) ||
146		    !curr_guid)
147			goto unlock;
148		required_guid = cpu_to_be64(MLX4_GUID_FOR_DELETE_VAL);
149	} else {
150		required_guid = mlx4_get_admin_guid(dev->dev, slave, port);
151		if (required_guid == cpu_to_be64(MLX4_GUID_FOR_DELETE_VAL))
152			goto unlock;
153	}
154	*(__be64 *)&dev->sriov.alias_guid.ports_guid[port_index].
155		all_rec_per_port[record_num].
156		all_recs[GUID_REC_SIZE * index] = required_guid;
157	dev->sriov.alias_guid.ports_guid[port_index].
158		all_rec_per_port[record_num].guid_indexes
159		|= mlx4_ib_get_aguid_comp_mask_from_ix(index);
160	dev->sriov.alias_guid.ports_guid[port_index].
161		all_rec_per_port[record_num].status
162		= MLX4_GUID_INFO_STATUS_IDLE;
163	/* set to run immediately */
164	dev->sriov.alias_guid.ports_guid[port_index].
165		all_rec_per_port[record_num].time_to_run = 0;
166	dev->sriov.alias_guid.ports_guid[port_index].
167		all_rec_per_port[record_num].
168		guids_retry_schedule[index] = 0;
169	do_work = 1;
170unlock:
171	spin_unlock_irqrestore(&dev->sriov.alias_guid.ag_work_lock, flags);
172
173	if (do_work)
174		mlx4_ib_init_alias_guid_work(dev, port_index);
175}
176
177/*
178 * Whenever new GUID is set/unset (guid table change) create event and
179 * notify the relevant slave (master also should be notified).
180 * If the GUID value is not as we have in the cache the slave will not be
181 * updated; in this case it waits for the smp_snoop or the port management
182 * event to call the function and to update the slave.
183 * block_number - the index of the block (16 blocks available)
184 * port_number - 1 or 2
185 */
186void mlx4_ib_notify_slaves_on_guid_change(struct mlx4_ib_dev *dev,
187					  int block_num, u8 port_num,
188					  u8 *p_data)
189{
190	int i;
191	u64 guid_indexes;
192	int slave_id;
193	enum slave_port_state new_state;
194	enum slave_port_state prev_state;
195	__be64 tmp_cur_ag, form_cache_ag;
196	enum slave_port_gen_event gen_event;
197	struct mlx4_sriov_alias_guid_info_rec_det *rec;
198	unsigned long flags;
199	__be64 required_value;
200
201	if (!mlx4_is_master(dev->dev))
202		return;
203
204	rec = &dev->sriov.alias_guid.ports_guid[port_num - 1].
205			all_rec_per_port[block_num];
206	guid_indexes = be64_to_cpu((__force __be64) dev->sriov.alias_guid.
207				   ports_guid[port_num - 1].
208				   all_rec_per_port[block_num].guid_indexes);
209	pr_debug("port: %d, guid_indexes: 0x%llx\n", port_num, guid_indexes);
210
211	/*calculate the slaves and notify them*/
212	for (i = 0; i < NUM_ALIAS_GUID_IN_REC; i++) {
213		/* the location of the specific index runs from bits 4..11 */
214		if (!(test_bit(i + 4, (unsigned long *)&guid_indexes)))
215			continue;
216
217		slave_id = (block_num * NUM_ALIAS_GUID_IN_REC) + i ;
218		if (slave_id >= dev->dev->persist->num_vfs + 1)
219			return;
220		tmp_cur_ag = *(__be64 *)&p_data[i * GUID_REC_SIZE];
221		form_cache_ag = get_cached_alias_guid(dev, port_num,
222					(NUM_ALIAS_GUID_IN_REC * block_num) + i);
223		/*
224		 * Check if guid is not the same as in the cache,
225		 * If it is different, wait for the snoop_smp or the port mgmt
226		 * change event to update the slave on its port state change
227		 */
228		if (tmp_cur_ag != form_cache_ag)
229			continue;
230
231		spin_lock_irqsave(&dev->sriov.alias_guid.ag_work_lock, flags);
232		required_value = *(__be64 *)&rec->all_recs[i * GUID_REC_SIZE];
233
234		if (required_value == cpu_to_be64(MLX4_GUID_FOR_DELETE_VAL))
235			required_value = 0;
236
237		if (tmp_cur_ag == required_value) {
238			rec->guid_indexes = rec->guid_indexes &
239			       ~mlx4_ib_get_aguid_comp_mask_from_ix(i);
240		} else {
241			/* may notify port down if value is 0 */
242			if (tmp_cur_ag != MLX4_NOT_SET_GUID) {
243				spin_unlock_irqrestore(&dev->sriov.
244					alias_guid.ag_work_lock, flags);
245				continue;
246			}
247		}
248		spin_unlock_irqrestore(&dev->sriov.alias_guid.ag_work_lock,
249				       flags);
250		mlx4_gen_guid_change_eqe(dev->dev, slave_id, port_num);
251		/*2 cases: Valid GUID, and Invalid Guid*/
252
253		if (tmp_cur_ag != MLX4_NOT_SET_GUID) { /*valid GUID*/
254			prev_state = mlx4_get_slave_port_state(dev->dev, slave_id, port_num);
255			new_state = set_and_calc_slave_port_state(dev->dev, slave_id, port_num,
256								  MLX4_PORT_STATE_IB_PORT_STATE_EVENT_GID_VALID,
257								  &gen_event);
258			pr_debug("slave: %d, port: %d prev_port_state: %d,"
259				 " new_port_state: %d, gen_event: %d\n",
260				 slave_id, port_num, prev_state, new_state, gen_event);
261			if (gen_event == SLAVE_PORT_GEN_EVENT_UP) {
262				pr_debug("sending PORT_UP event to slave: %d, port: %d\n",
263					 slave_id, port_num);
264				mlx4_gen_port_state_change_eqe(dev->dev, slave_id,
265							       port_num, MLX4_PORT_CHANGE_SUBTYPE_ACTIVE);
266			}
267		} else { /* request to invalidate GUID */
268			set_and_calc_slave_port_state(dev->dev, slave_id, port_num,
269						      MLX4_PORT_STATE_IB_EVENT_GID_INVALID,
270						      &gen_event);
271			if (gen_event == SLAVE_PORT_GEN_EVENT_DOWN) {
272				pr_debug("sending PORT DOWN event to slave: %d, port: %d\n",
273					 slave_id, port_num);
274				mlx4_gen_port_state_change_eqe(dev->dev,
275							       slave_id,
276							       port_num,
277							       MLX4_PORT_CHANGE_SUBTYPE_DOWN);
278			}
279		}
280	}
281}
282
283static void aliasguid_query_handler(int status,
284				    struct ib_sa_guidinfo_rec *guid_rec,
285				    void *context)
286{
287	struct mlx4_ib_dev *dev;
288	struct mlx4_alias_guid_work_context *cb_ctx = context;
289	u8 port_index ;
290	int i;
291	struct mlx4_sriov_alias_guid_info_rec_det *rec;
292	unsigned long flags, flags1;
293	ib_sa_comp_mask declined_guid_indexes = 0;
294	ib_sa_comp_mask applied_guid_indexes = 0;
295	unsigned int resched_delay_sec = 0;
296
297	if (!context)
298		return;
299
300	dev = cb_ctx->dev;
301	port_index = cb_ctx->port - 1;
302	rec = &dev->sriov.alias_guid.ports_guid[port_index].
303		all_rec_per_port[cb_ctx->block_num];
304
305	if (status) {
306		pr_debug("(port: %d) failed: status = %d\n",
307			 cb_ctx->port, status);
308		rec->time_to_run = ktime_get_real_ns() + 1 * NSEC_PER_SEC;
309		goto out;
310	}
311
312	if (guid_rec->block_num != cb_ctx->block_num) {
313		pr_err("block num mismatch: %d != %d\n",
314		       cb_ctx->block_num, guid_rec->block_num);
315		goto out;
316	}
317
318	pr_debug("lid/port: %d/%d, block_num: %d\n",
319		 be16_to_cpu(guid_rec->lid), cb_ctx->port,
320		 guid_rec->block_num);
321
322	rec = &dev->sriov.alias_guid.ports_guid[port_index].
323		all_rec_per_port[guid_rec->block_num];
324
325	spin_lock_irqsave(&dev->sriov.alias_guid.ag_work_lock, flags);
326	for (i = 0 ; i < NUM_ALIAS_GUID_IN_REC; i++) {
327		__be64 sm_response, required_val;
328
329		if (!(cb_ctx->guid_indexes &
330			mlx4_ib_get_aguid_comp_mask_from_ix(i)))
331			continue;
332		sm_response = *(__be64 *)&guid_rec->guid_info_list
333				[i * GUID_REC_SIZE];
334		required_val = *(__be64 *)&rec->all_recs[i * GUID_REC_SIZE];
335		if (cb_ctx->method == MLX4_GUID_INFO_RECORD_DELETE) {
336			if (required_val ==
337			    cpu_to_be64(MLX4_GUID_FOR_DELETE_VAL))
338				goto next_entry;
339
340			/* A new value was set till we got the response */
341			pr_debug("need to set new value %llx, record num %d, block_num:%d\n",
342				 be64_to_cpu(required_val),
343				 i, guid_rec->block_num);
344			goto entry_declined;
345		}
346
347		/* check if the SM didn't assign one of the records.
348		 * if it didn't, re-ask for.
349		 */
350		if (sm_response == MLX4_NOT_SET_GUID) {
351			if (rec->guids_retry_schedule[i] == 0)
352				mlx4_ib_warn(&dev->ib_dev,
353					     "%s:Record num %d in  block_num: %d was declined by SM\n",
354					     __func__, i,
355					     guid_rec->block_num);
356			goto entry_declined;
357		} else {
358		       /* properly assigned record. */
359		       /* We save the GUID we just got from the SM in the
360			* admin_guid in order to be persistent, and in the
361			* request from the sm the process will ask for the same GUID */
362			if (required_val &&
363			    sm_response != required_val) {
364				/* Warn only on first retry */
365				if (rec->guids_retry_schedule[i] == 0)
366					mlx4_ib_warn(&dev->ib_dev, "%s: Failed to set"
367						     " admin guid after SysAdmin "
368						     "configuration. "
369						     "Record num %d in block_num:%d "
370						     "was declined by SM, "
371						     "new val(0x%llx) was kept, SM returned (0x%llx)\n",
372						      __func__, i,
373						     guid_rec->block_num,
374						     be64_to_cpu(required_val),
375						     be64_to_cpu(sm_response));
376				goto entry_declined;
377			} else {
378				*(__be64 *)&rec->all_recs[i * GUID_REC_SIZE] =
379					sm_response;
380				if (required_val == 0)
381					mlx4_set_admin_guid(dev->dev,
382							    sm_response,
383							    (guid_rec->block_num
384							    * NUM_ALIAS_GUID_IN_REC) + i,
385							    cb_ctx->port);
386				goto next_entry;
387			}
388		}
389entry_declined:
390		declined_guid_indexes |= mlx4_ib_get_aguid_comp_mask_from_ix(i);
391		rec->guids_retry_schedule[i] =
392			(rec->guids_retry_schedule[i] == 0) ?  1 :
393			min((unsigned int)60,
394			    rec->guids_retry_schedule[i] * 2);
395		/* using the minimum value among all entries in that record */
396		resched_delay_sec = (resched_delay_sec == 0) ?
397				rec->guids_retry_schedule[i] :
398				min(resched_delay_sec,
399				    rec->guids_retry_schedule[i]);
400		continue;
401
402next_entry:
403		rec->guids_retry_schedule[i] = 0;
404	}
405
406	applied_guid_indexes =  cb_ctx->guid_indexes & ~declined_guid_indexes;
407	if (declined_guid_indexes ||
408	    rec->guid_indexes & ~(applied_guid_indexes)) {
409		pr_debug("record=%d wasn't fully set, guid_indexes=0x%llx applied_indexes=0x%llx, declined_indexes=0x%llx\n",
410			 guid_rec->block_num,
411			 be64_to_cpu((__force __be64)rec->guid_indexes),
412			 be64_to_cpu((__force __be64)applied_guid_indexes),
413			 be64_to_cpu((__force __be64)declined_guid_indexes));
414		rec->time_to_run = ktime_get_real_ns() +
415			resched_delay_sec * NSEC_PER_SEC;
416	} else {
417		rec->status = MLX4_GUID_INFO_STATUS_SET;
418	}
419	spin_unlock_irqrestore(&dev->sriov.alias_guid.ag_work_lock, flags);
420	/*
421	The func is call here to close the cases when the
422	sm doesn't send smp, so in the sa response the driver
423	notifies the slave.
424	*/
425	mlx4_ib_notify_slaves_on_guid_change(dev, guid_rec->block_num,
426					     cb_ctx->port,
427					     guid_rec->guid_info_list);
428out:
429	spin_lock_irqsave(&dev->sriov.going_down_lock, flags);
430	spin_lock_irqsave(&dev->sriov.alias_guid.ag_work_lock, flags1);
431	if (!dev->sriov.is_going_down) {
432		get_low_record_time_index(dev, port_index, &resched_delay_sec);
433		queue_delayed_work(dev->sriov.alias_guid.ports_guid[port_index].wq,
434				   &dev->sriov.alias_guid.ports_guid[port_index].
435				   alias_guid_work,
436				   msecs_to_jiffies(resched_delay_sec * 1000));
437	}
438	if (cb_ctx->sa_query) {
439		list_del(&cb_ctx->list);
440		kfree(cb_ctx);
441	} else
442		complete(&cb_ctx->done);
443	spin_unlock_irqrestore(&dev->sriov.alias_guid.ag_work_lock, flags1);
444	spin_unlock_irqrestore(&dev->sriov.going_down_lock, flags);
445}
446
447static void invalidate_guid_record(struct mlx4_ib_dev *dev, u8 port, int index)
448{
449	int i;
450	u64 cur_admin_val;
451	ib_sa_comp_mask comp_mask = 0;
452
453	dev->sriov.alias_guid.ports_guid[port - 1].all_rec_per_port[index].status
454		= MLX4_GUID_INFO_STATUS_SET;
455
456	/* calculate the comp_mask for that record.*/
457	for (i = 0; i < NUM_ALIAS_GUID_IN_REC; i++) {
458		cur_admin_val =
459			*(u64 *)&dev->sriov.alias_guid.ports_guid[port - 1].
460			all_rec_per_port[index].all_recs[GUID_REC_SIZE * i];
461		/*
462		check the admin value: if it's for delete (~00LL) or
463		it is the first guid of the first record (hw guid) or
464		the records is not in ownership of the sysadmin and the sm doesn't
465		need to assign GUIDs, then don't put it up for assignment.
466		*/
467		if (MLX4_GUID_FOR_DELETE_VAL == cur_admin_val ||
468		    (!index && !i))
469			continue;
470		comp_mask |= mlx4_ib_get_aguid_comp_mask_from_ix(i);
471	}
472	dev->sriov.alias_guid.ports_guid[port - 1].
473		all_rec_per_port[index].guid_indexes |= comp_mask;
474	if (dev->sriov.alias_guid.ports_guid[port - 1].
475	    all_rec_per_port[index].guid_indexes)
476		dev->sriov.alias_guid.ports_guid[port - 1].
477		all_rec_per_port[index].status = MLX4_GUID_INFO_STATUS_IDLE;
478
479}
480
481static int set_guid_rec(struct ib_device *ibdev,
482			struct mlx4_next_alias_guid_work *rec)
483{
484	int err;
485	struct mlx4_ib_dev *dev = to_mdev(ibdev);
486	struct ib_sa_guidinfo_rec guid_info_rec;
487	ib_sa_comp_mask comp_mask;
488	struct ib_port_attr attr;
489	struct mlx4_alias_guid_work_context *callback_context;
490	unsigned long resched_delay, flags, flags1;
491	u8 port = rec->port + 1;
492	int index = rec->block_num;
493	struct mlx4_sriov_alias_guid_info_rec_det *rec_det = &rec->rec_det;
494	struct list_head *head =
495		&dev->sriov.alias_guid.ports_guid[port - 1].cb_list;
496
497	err = __mlx4_ib_query_port(ibdev, port, &attr, 1);
498	if (err) {
499		pr_debug("mlx4_ib_query_port failed (err: %d), port: %d\n",
500			 err, port);
501		return err;
502	}
503	/*check the port was configured by the sm, otherwise no need to send */
504	if (attr.state != IB_PORT_ACTIVE) {
505		pr_debug("port %d not active...rescheduling\n", port);
506		resched_delay = 5 * HZ;
507		err = -EAGAIN;
508		goto new_schedule;
509	}
510
511	callback_context = kmalloc(sizeof *callback_context, GFP_KERNEL);
512	if (!callback_context) {
513		err = -ENOMEM;
514		resched_delay = HZ * 5;
515		goto new_schedule;
516	}
517	callback_context->port = port;
518	callback_context->dev = dev;
519	callback_context->block_num = index;
520	callback_context->guid_indexes = rec_det->guid_indexes;
521	callback_context->method = rec->method;
522
523	memset(&guid_info_rec, 0, sizeof (struct ib_sa_guidinfo_rec));
524
525	guid_info_rec.lid = cpu_to_be16(attr.lid);
526	guid_info_rec.block_num = index;
527
528	memcpy(guid_info_rec.guid_info_list, rec_det->all_recs,
529	       GUID_REC_SIZE * NUM_ALIAS_GUID_IN_REC);
530	comp_mask = IB_SA_GUIDINFO_REC_LID | IB_SA_GUIDINFO_REC_BLOCK_NUM |
531		rec_det->guid_indexes;
532
533	init_completion(&callback_context->done);
534	spin_lock_irqsave(&dev->sriov.alias_guid.ag_work_lock, flags1);
535	list_add_tail(&callback_context->list, head);
536	spin_unlock_irqrestore(&dev->sriov.alias_guid.ag_work_lock, flags1);
537
538	callback_context->query_id =
539		ib_sa_guid_info_rec_query(dev->sriov.alias_guid.sa_client,
540					  ibdev, port, &guid_info_rec,
541					  comp_mask, rec->method, 1000,
542					  GFP_KERNEL, aliasguid_query_handler,
543					  callback_context,
544					  &callback_context->sa_query);
545	if (callback_context->query_id < 0) {
546		pr_debug("ib_sa_guid_info_rec_query failed, query_id: "
547			 "%d. will reschedule to the next 1 sec.\n",
548			 callback_context->query_id);
549		spin_lock_irqsave(&dev->sriov.alias_guid.ag_work_lock, flags1);
550		list_del(&callback_context->list);
551		kfree(callback_context);
552		spin_unlock_irqrestore(&dev->sriov.alias_guid.ag_work_lock, flags1);
553		resched_delay = 1 * HZ;
554		err = -EAGAIN;
555		goto new_schedule;
556	}
557	err = 0;
558	goto out;
559
560new_schedule:
561	spin_lock_irqsave(&dev->sriov.going_down_lock, flags);
562	spin_lock_irqsave(&dev->sriov.alias_guid.ag_work_lock, flags1);
563	invalidate_guid_record(dev, port, index);
564	if (!dev->sriov.is_going_down) {
565		queue_delayed_work(dev->sriov.alias_guid.ports_guid[port - 1].wq,
566				   &dev->sriov.alias_guid.ports_guid[port - 1].alias_guid_work,
567				   resched_delay);
568	}
569	spin_unlock_irqrestore(&dev->sriov.alias_guid.ag_work_lock, flags1);
570	spin_unlock_irqrestore(&dev->sriov.going_down_lock, flags);
571
572out:
573	return err;
574}
575
576static void mlx4_ib_guid_port_init(struct mlx4_ib_dev *dev, int port)
577{
578	int j, k, entry;
579	__be64 guid;
580
581	/*Check if the SM doesn't need to assign the GUIDs*/
582	for (j = 0; j < NUM_ALIAS_GUID_REC_IN_PORT; j++) {
583		for (k = 0; k < NUM_ALIAS_GUID_IN_REC; k++) {
584			entry = j * NUM_ALIAS_GUID_IN_REC + k;
585			/* no request for the 0 entry (hw guid) */
586			if (!entry || entry > dev->dev->persist->num_vfs ||
587			    !mlx4_is_slave_active(dev->dev, entry))
588				continue;
589			guid = mlx4_get_admin_guid(dev->dev, entry, port);
590			*(__be64 *)&dev->sriov.alias_guid.ports_guid[port - 1].
591				all_rec_per_port[j].all_recs
592				[GUID_REC_SIZE * k] = guid;
593			pr_debug("guid was set, entry=%d, val=0x%llx, port=%d\n",
594				 entry,
595				 be64_to_cpu(guid),
596				 port);
597		}
598	}
599}
600void mlx4_ib_invalidate_all_guid_record(struct mlx4_ib_dev *dev, int port)
601{
602	int i;
603	unsigned long flags, flags1;
604
605	pr_debug("port %d\n", port);
606
607	spin_lock_irqsave(&dev->sriov.going_down_lock, flags);
608	spin_lock_irqsave(&dev->sriov.alias_guid.ag_work_lock, flags1);
609
610	if (dev->sriov.alias_guid.ports_guid[port - 1].state_flags &
611		GUID_STATE_NEED_PORT_INIT) {
612		mlx4_ib_guid_port_init(dev, port);
613		dev->sriov.alias_guid.ports_guid[port - 1].state_flags &=
614			(~GUID_STATE_NEED_PORT_INIT);
615	}
616	for (i = 0; i < NUM_ALIAS_GUID_REC_IN_PORT; i++)
617		invalidate_guid_record(dev, port, i);
618
619	if (mlx4_is_master(dev->dev) && !dev->sriov.is_going_down) {
620		/*
621		make sure no work waits in the queue, if the work is already
622		queued(not on the timer) the cancel will fail. That is not a problem
623		because we just want the work started.
624		*/
625		cancel_delayed_work(&dev->sriov.alias_guid.
626				      ports_guid[port - 1].alias_guid_work);
627		queue_delayed_work(dev->sriov.alias_guid.ports_guid[port - 1].wq,
628				   &dev->sriov.alias_guid.ports_guid[port - 1].alias_guid_work,
629				   0);
630	}
631	spin_unlock_irqrestore(&dev->sriov.alias_guid.ag_work_lock, flags1);
632	spin_unlock_irqrestore(&dev->sriov.going_down_lock, flags);
633}
634
635static void set_required_record(struct mlx4_ib_dev *dev, u8 port,
636				struct mlx4_next_alias_guid_work *next_rec,
637				int record_index)
638{
639	int i;
640	int lowset_time_entry = -1;
641	int lowest_time = 0;
642	ib_sa_comp_mask delete_guid_indexes = 0;
643	ib_sa_comp_mask set_guid_indexes = 0;
644	struct mlx4_sriov_alias_guid_info_rec_det *rec =
645			&dev->sriov.alias_guid.ports_guid[port].
646			all_rec_per_port[record_index];
647
648	for (i = 0; i < NUM_ALIAS_GUID_IN_REC; i++) {
649		if (!(rec->guid_indexes &
650			mlx4_ib_get_aguid_comp_mask_from_ix(i)))
651			continue;
652
653		if (*(__be64 *)&rec->all_recs[i * GUID_REC_SIZE] ==
654				cpu_to_be64(MLX4_GUID_FOR_DELETE_VAL))
655			delete_guid_indexes |=
656				mlx4_ib_get_aguid_comp_mask_from_ix(i);
657		else
658			set_guid_indexes |=
659				mlx4_ib_get_aguid_comp_mask_from_ix(i);
660
661		if (lowset_time_entry == -1 || rec->guids_retry_schedule[i] <=
662			lowest_time) {
663			lowset_time_entry = i;
664			lowest_time = rec->guids_retry_schedule[i];
665		}
666	}
667
668	memcpy(&next_rec->rec_det, rec, sizeof(*rec));
669	next_rec->port = port;
670	next_rec->block_num = record_index;
671
672	if (*(__be64 *)&rec->all_recs[lowset_time_entry * GUID_REC_SIZE] ==
673				cpu_to_be64(MLX4_GUID_FOR_DELETE_VAL)) {
674		next_rec->rec_det.guid_indexes = delete_guid_indexes;
675		next_rec->method = MLX4_GUID_INFO_RECORD_DELETE;
676	} else {
677		next_rec->rec_det.guid_indexes = set_guid_indexes;
678		next_rec->method = MLX4_GUID_INFO_RECORD_SET;
679	}
680}
681
682/* return index of record that should be updated based on lowest
683 * rescheduled time
684 */
685static int get_low_record_time_index(struct mlx4_ib_dev *dev, u8 port,
686				     int *resched_delay_sec)
687{
688	int record_index = -1;
689	u64 low_record_time = 0;
690	struct mlx4_sriov_alias_guid_info_rec_det rec;
691	int j;
692
693	for (j = 0; j < NUM_ALIAS_GUID_REC_IN_PORT; j++) {
694		rec = dev->sriov.alias_guid.ports_guid[port].
695			all_rec_per_port[j];
696		if (rec.status == MLX4_GUID_INFO_STATUS_IDLE &&
697		    rec.guid_indexes) {
698			if (record_index == -1 ||
699			    rec.time_to_run < low_record_time) {
700				record_index = j;
701				low_record_time = rec.time_to_run;
702			}
703		}
704	}
705	if (resched_delay_sec) {
706		u64 curr_time = ktime_get_real_ns();
707
708		*resched_delay_sec = (low_record_time < curr_time) ? 0 :
709			div_u64((low_record_time - curr_time), NSEC_PER_SEC);
710	}
711
712	return record_index;
713}
714
715/* The function returns the next record that was
716 * not configured (or failed to be configured) */
717static int get_next_record_to_update(struct mlx4_ib_dev *dev, u8 port,
718				     struct mlx4_next_alias_guid_work *rec)
719{
720	unsigned long flags;
721	int record_index;
722	int ret = 0;
723
724	spin_lock_irqsave(&dev->sriov.alias_guid.ag_work_lock, flags);
725	record_index = get_low_record_time_index(dev, port, NULL);
726
727	if (record_index < 0) {
728		ret = -ENOENT;
729		goto out;
730	}
731
732	set_required_record(dev, port, rec, record_index);
733out:
734	spin_unlock_irqrestore(&dev->sriov.alias_guid.ag_work_lock, flags);
735	return ret;
736}
737
738static void alias_guid_work(struct work_struct *work)
739{
740	struct delayed_work *delay = to_delayed_work(work);
741	int ret = 0;
742	struct mlx4_next_alias_guid_work *rec;
743	struct mlx4_sriov_alias_guid_port_rec_det *sriov_alias_port =
744		container_of(delay, struct mlx4_sriov_alias_guid_port_rec_det,
745			     alias_guid_work);
746	struct mlx4_sriov_alias_guid *sriov_alias_guid = sriov_alias_port->parent;
747	struct mlx4_ib_sriov *ib_sriov = container_of(sriov_alias_guid,
748						struct mlx4_ib_sriov,
749						alias_guid);
750	struct mlx4_ib_dev *dev = container_of(ib_sriov, struct mlx4_ib_dev, sriov);
751
752	rec = kzalloc(sizeof *rec, GFP_KERNEL);
753	if (!rec) {
754		pr_err("alias_guid_work: No Memory\n");
755		return;
756	}
757
758	pr_debug("starting [port: %d]...\n", sriov_alias_port->port + 1);
759	ret = get_next_record_to_update(dev, sriov_alias_port->port, rec);
760	if (ret) {
761		pr_debug("No more records to update.\n");
762		goto out;
763	}
764
765	set_guid_rec(&dev->ib_dev, rec);
766out:
767	kfree(rec);
768}
769
770
771void mlx4_ib_init_alias_guid_work(struct mlx4_ib_dev *dev, int port)
772{
773	unsigned long flags, flags1;
774
775	if (!mlx4_is_master(dev->dev))
776		return;
777	spin_lock_irqsave(&dev->sriov.going_down_lock, flags);
778	spin_lock_irqsave(&dev->sriov.alias_guid.ag_work_lock, flags1);
779	if (!dev->sriov.is_going_down) {
780		/* If there is pending one should cancell then run, otherwise
781		  * won't run till previous one is ended as same work
782		  * struct is used.
783		  */
784		cancel_delayed_work(&dev->sriov.alias_guid.ports_guid[port].
785				    alias_guid_work);
786		queue_delayed_work(dev->sriov.alias_guid.ports_guid[port].wq,
787			   &dev->sriov.alias_guid.ports_guid[port].alias_guid_work, 0);
788	}
789	spin_unlock_irqrestore(&dev->sriov.alias_guid.ag_work_lock, flags1);
790	spin_unlock_irqrestore(&dev->sriov.going_down_lock, flags);
791}
792
793void mlx4_ib_destroy_alias_guid_service(struct mlx4_ib_dev *dev)
794{
795	int i;
796	struct mlx4_ib_sriov *sriov = &dev->sriov;
797	struct mlx4_alias_guid_work_context *cb_ctx;
798	struct mlx4_sriov_alias_guid_port_rec_det *det;
799	struct ib_sa_query *sa_query;
800	unsigned long flags;
801
802	for (i = 0 ; i < dev->num_ports; i++) {
803		cancel_delayed_work(&dev->sriov.alias_guid.ports_guid[i].alias_guid_work);
804		det = &sriov->alias_guid.ports_guid[i];
805		spin_lock_irqsave(&sriov->alias_guid.ag_work_lock, flags);
806		while (!list_empty(&det->cb_list)) {
807			cb_ctx = list_entry(det->cb_list.next,
808					    struct mlx4_alias_guid_work_context,
809					    list);
810			sa_query = cb_ctx->sa_query;
811			cb_ctx->sa_query = NULL;
812			list_del(&cb_ctx->list);
813			spin_unlock_irqrestore(&sriov->alias_guid.ag_work_lock, flags);
814			ib_sa_cancel_query(cb_ctx->query_id, sa_query);
815			wait_for_completion(&cb_ctx->done);
816			kfree(cb_ctx);
817			spin_lock_irqsave(&sriov->alias_guid.ag_work_lock, flags);
818		}
819		spin_unlock_irqrestore(&sriov->alias_guid.ag_work_lock, flags);
820	}
821	for (i = 0 ; i < dev->num_ports; i++) {
822		flush_workqueue(dev->sriov.alias_guid.ports_guid[i].wq);
823		destroy_workqueue(dev->sriov.alias_guid.ports_guid[i].wq);
824	}
825	ib_sa_unregister_client(dev->sriov.alias_guid.sa_client);
826	kfree(dev->sriov.alias_guid.sa_client);
827}
828
829int mlx4_ib_init_alias_guid_service(struct mlx4_ib_dev *dev)
830{
831	char alias_wq_name[15];
832	int ret = 0;
833	int i, j;
834	union ib_gid gid;
835
836	if (!mlx4_is_master(dev->dev))
837		return 0;
838	dev->sriov.alias_guid.sa_client =
839		kzalloc(sizeof *dev->sriov.alias_guid.sa_client, GFP_KERNEL);
840	if (!dev->sriov.alias_guid.sa_client)
841		return -ENOMEM;
842
843	ib_sa_register_client(dev->sriov.alias_guid.sa_client);
844
845	spin_lock_init(&dev->sriov.alias_guid.ag_work_lock);
846
847	for (i = 1; i <= dev->num_ports; ++i) {
848		if (dev->ib_dev.query_gid(&dev->ib_dev , i, 0, &gid)) {
849			ret = -EFAULT;
850			goto err_unregister;
851		}
852	}
853
854	for (i = 0 ; i < dev->num_ports; i++) {
855		memset(&dev->sriov.alias_guid.ports_guid[i], 0,
856		       sizeof (struct mlx4_sriov_alias_guid_port_rec_det));
857		dev->sriov.alias_guid.ports_guid[i].state_flags |=
858				GUID_STATE_NEED_PORT_INIT;
859		for (j = 0; j < NUM_ALIAS_GUID_REC_IN_PORT; j++) {
860			/* mark each val as it was deleted */
861			memset(dev->sriov.alias_guid.ports_guid[i].
862				all_rec_per_port[j].all_recs, 0xFF,
863				sizeof(dev->sriov.alias_guid.ports_guid[i].
864				all_rec_per_port[j].all_recs));
865		}
866		INIT_LIST_HEAD(&dev->sriov.alias_guid.ports_guid[i].cb_list);
867		/*prepare the records, set them to be allocated by sm*/
868		if (mlx4_ib_sm_guid_assign)
869			for (j = 1; j < NUM_ALIAS_GUID_PER_PORT; j++)
870				mlx4_set_admin_guid(dev->dev, 0, j, i + 1);
871		for (j = 0 ; j < NUM_ALIAS_GUID_REC_IN_PORT; j++)
872			invalidate_guid_record(dev, i + 1, j);
873
874		dev->sriov.alias_guid.ports_guid[i].parent = &dev->sriov.alias_guid;
875		dev->sriov.alias_guid.ports_guid[i].port  = i;
876
877		snprintf(alias_wq_name, sizeof alias_wq_name, "alias_guid%d", i);
878		dev->sriov.alias_guid.ports_guid[i].wq =
879			create_singlethread_workqueue(alias_wq_name);
880		if (!dev->sriov.alias_guid.ports_guid[i].wq) {
881			ret = -ENOMEM;
882			goto err_thread;
883		}
884		INIT_DELAYED_WORK(&dev->sriov.alias_guid.ports_guid[i].alias_guid_work,
885			  alias_guid_work);
886	}
887	return 0;
888
889err_thread:
890	for (--i; i >= 0; i--) {
891		destroy_workqueue(dev->sriov.alias_guid.ports_guid[i].wq);
892		dev->sriov.alias_guid.ports_guid[i].wq = NULL;
893	}
894
895err_unregister:
896	ib_sa_unregister_client(dev->sriov.alias_guid.sa_client);
897	kfree(dev->sriov.alias_guid.sa_client);
898	dev->sriov.alias_guid.sa_client = NULL;
899	pr_err("init_alias_guid_service: Failed. (ret:%d)\n", ret);
900	return ret;
901}
902